Uno script “registratore” di animazioni per produrre ascensori, palloni, guide etc..

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



			
		

Anche i prim hanno il diritto di andare in discoteca e ballare….

Recentemente Linden Lab ha introdotto una nuova funzionalità di scripting che consente di memorizzare “animazioni dei prim” in modo da fargli fare (al prim o al root prim) un percorso prestabilito ed eseguirlo in modo fluido (play) in modo che tutti vedano i prim nelle stesse posizioni. Questa funzionalità è stata inserita per limitare il lag nelle sim dovuto ad ascensori od oggetti fisici che si muovono. Per dettagli su questa funzione nuova guardate qui: http://wiki.secondlife.com/wiki/LlSetKeyframedMotion

E’ possibile ad esempio far fare ad un oggetto il giro della vostra sim specificando le tempistiche con cui si deve muovere o semplicemente dirgli di girare su sè stesso.

Nel caso della semplice rotazione attenzione a non confondere la rotazione semplice fatta normalmente in SL con llTargetOmega() che influisce solo sul viewer [ogni viewer vede una rotazione differente] con la rotazione server side, dove tutti vedono l’oggetto ad un livello di rotazione condiviso. Per ovviare a questo  fino a poco fa si usavano oggetti fisici oppure costosi spostamenti con llSetPos() che avevano però il difetto di presentare il movimento in modo innaturale e a scatti e comunque impattavano pesantemente sulla sim.

A parte ascensori, treni, mongolfiere etc, le possibilità artistiche (cosa che pochi riescono a cogliere) offerte da questa nuova funzione sono effettivamente interessanti, quindi vale veramente la pena di imparare a scriptare con questo metodo.

Questo è ad esempio un interessante video fatto da uno scripter che usa queste animazioni con oggetti flexy ottenendo sorprendenti risultati:

Rufus Darkfold, il creatore di questo video e degli “attori” animati, produce anche il componente opensource da lui chiamato “primcontrol” che potete trovare qui: http://community.secondlife.com/t5/Building-and-Texturing-Forum/Free-primcontrol-HUD-Easy-Prim-Torture-Beta-Test-Open/td-p/1092577 oppure iscrivervi al suo gruppo inworld dove fornisce il componente di creazione delle animazioni: “Navigator Users”.

oppure anche http://secondlife.lithium.com/t5/LSL-Scripting/Free-primcontrol-HUD-Easy-Keyframe-Animation-Easy-Prim-Torture/td-p/1092569

NB: l’oggetto primcontrol fa un SACCO di altre cose: per vederle tutte occorrerebbero almeno 10 articoli 🙂

Altre applicazioni artistiche

Pallina Loon ad esempio ha fatto un video dove illustra alcune applicazioni di questa animazione evidenziando l’aspetto “fisico” che queste animazioni hanno sugli avatar con il suo bel video “The Avatar Machine”.

Altre idee?

Se avete altre idee su come utilizzare questa funzione, commentate oppure scrivetemi.

Salahzar Stenvaag