Grazie alla nuova funzionalità offerta dall’istruzione llSetKeyframeMotion http://wiki.secondlife.com/wiki/LlSetKeyframedMotion ora è possibile specificare una “animazione” definendo una sequenza di istantanee della posizione e rotazione di un oggetto non fisico in SecondLife.
Serve in pratica per poter implementare una classe notevole di script che rendono viva SecondLife come ad esempio:
- Ascensori
- Veicoli di spostamento (treni, carrozze etc)
- Mongolfiere guide turistiche per le sim
- Effetti speciali tipo pedane rotanti, montagne russe, ruote panoramiche (per discoteche, lunapark ecc)
- Effetti artistici e grafici
- Movimenti lenti e uniformi della camera per fare machinima (videoclip su secondlife)
Questo genere di funzionalità erano finora offerte da due tecniche che avevano però una serie di controindicazioni:
- Tecnica 1: Fare gli oggetti fisici e poi “spingerli” con forze ed impulsi opportuni
- Tecnica 2: Fare gli oggetti non fisici e utilizzare la funzionalità di riposizionamento dell’oggetto con llSetPos() e llSetRot() ogni pochi millesimi di secondo
In ambedue i casi veniva generato molto lag e nel caso degli oggetti fisici questi oggetti erano impossibili o comunque difficilissimi da controllare.
Ora possiamo utilizzare questa funzionalità per ridurre il lag e ottenere dei risultati decenti. In un mio articolo precedente ho mostrato un paio di video dove veniva utilizzata questa funzione per ottenere interessanti effetti scenici (Anche i prim devono andare in discoteca).
Ma entriamo un po’ nel dettaglio della funzione. 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
[sourcecode language=”java”]
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]);}}
[/sourcecode]
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.
Le istruzioni per l’uso
[sourcecode language=”text”]
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
Salahzar
[/sourcecode]
Ecco il codice dello script per fare il registratore: uso pastebin perchè qui mi distrugge il codice 🙁 http://pastebin.com/uw6Zema1
Grazie della chiara esposizione. non vedo l’ora di speromentare qualcosa …