::Set KEy::

fonte: virtual worlds magazine

Come al solito ricopio il contenuto della fonte, per sicurezza mia, prima che si perda il contenuto originale per qualche motivo (spostamento link, cancellazione pagina), a moh di backup.

Vi consiglio comunque la visione sul link originale.


La funzione ha essenzialmente due parametri LISTA: llSetKeyframedMotion (lista1,lista2);

le liste in SL sono rappresentate da una parentesi quadrata, gli elementi della lista separati da virgola e da una parentesi quadra chiusa: [ a, b, c, d]

La prima lista (lista1) di solito contiene terne di valori corrispondenti alla differenza di posizione rispetto allo start, differenza di angolo e durata in secondi per spostare l’oggetto dal frame precedente.

In pratica ad esempio la list1 [ <0,0,1>, ZERO_ROTATION, 1 ] indica ad esempio che l’oggetto si SOLLEVA di un metro lungo l’asse Z, senza cambiare rotazione e il movimento lo esegue in 1 secondo.

La seconda lista invece lista2 indica dei comandi che si vogliono dare per definire come l’animazione viene eseguita [ KFM_MODE, KFM_FORWARD ] indica che si vuole animare l’oggetto dal primo frame fino all’ultimo, KFM_PINGPONG fa oscillare l’oggetto in avanti indietro lungo i frame forniti, KFM_REVERSE fa tornare indietro dall’ultimo al primo, KFM_LOOP invece ripete indefinitamente la sequenza.

Ora c’è un piccolo inghippo, l’oggetto per poter eseguire una animazione deve avere la nuova “fisica” quella delle mesh, ma non è necessario che sia mesh per farlo, basta andare nella finestra delle proprietà avanzate dell’oggetto e mettere CONVEX_HULL invece che prim e possiamo animarlo.

Da qui si capisce che lo script minimo per animare un oggetto è qualcosa come il seguente

default
{ state_entry(){
   while(llVecDist(llGetPos(),)>0.01)
llSetLinkPrimitiveParamsFast(0,
[ PRIM_POSITION, ,
PRIM_ROTATION, ]);

llSetKeyframedMotion([
, , 0.184138,
, , 0.110658,
, , 0.215561
],[KFM_MODE,KFM_FORWARD]);}}

La riga 3-6 si accerta di posizionare l’oggetto in una posizione prefissata, mentre la riga 8-12 è appunto un esempio di sequenza di frame.
Come vedete è praticamente mortale.
Lo script che ho realizzato che potete vedere all’opera in questo video youtube consente invece di memorizzare i frame e di poter estrarre in modo relativamente semplice le istruzioni per poterlo fare funzionare.
Come usare questo registratore di keyframe:
1) rezzate l'oggetto
2) per sicurezza fare il reset la prima volta che lo usate da tools->reset
3) Editate l'oggetto in modo da vedere le freccine e spostatelo nella posizione iniziale
4) Premete RESTART nell'opzione del menu per fissare la posizione iniziale
5) Muovete l'oggetto e ruotatelo nel frame 1 e premete ADDFRAME
6) proseguite per tutti gli altri frame
7) se volete vedete l'animazione cliccando |<< per andare all'inizio, >>| per andare alla fine e < e > per scorrere i frame dell'animazione
8) Se un frame non vi piace quando avete scorso fino a quello premete DELFRAME posizionate l'oggetto come volete e fate ADDRAME per sostituirlo
9) Per provare l'animazione premete PLAY
10) Per avere lo script premete SCRIPT
11) Create un box nuovo abilitate la fisica CONVEX HULL dalla tab features
12) inserite un nuovo script e copiate incollate la parte in chat, p.es.
default { state_entry() { while(llVecDist(llGetPos(),)>0.01)llSetLinkPrimitiveParamsFast(0, [ PRIM_POSITION, , PRIM_ROTATION, ]); llSetKeyframedMotion([
[09:50] *** (3/1/2012) llSetKeyframedMotion: , , 0.184138, , , 0.110658, , , 0.215561
[09:50] *** (3/1/2012) llSetKeyframedMotion: ],[KFM_MODE,KFM_FORWARD]);}}
13) assicurate di cancellare la parte iniziale di tutte le linee che iniziano con "[09:50] *** (3/1/2012) llSetKeyframedMotion: "
14) salvate il vostro script e voilà dovrebbe animarsi da solo ogni volta che lo resettate
15) Potete eventualmente fare in modo che lo script si attivi al touch od altro

Ecco il codice dello script per fare il registratore: uso pastebin perchè qui mi distrugge il codice

http://pastebin.com/uw6Zema1