Salve a tutti,
in questa lezione proporremo un nuovo metodo per la gestione dei modelli dinamici; inoltre presenteremo un nuovo esempio di ambientazione 3D realizzabile tramite  gli script javascript che rilasciamo di volta in volta ( oltre ad aver finalmente fatto un pò di pulizia della parti obsolete del codice che tanto male non fa 😉 ).

Prima di tutto analizziamo la questione dell’animazione;

 due lezioni fa avevamo proposto un metodo piuttosto grezzo per dare l’illusione del movimento, cioè quello di gestire staticamente il movimento come una sequenza di foto dello stesso oggetto leggermente spostato da un frame all’altro. Il trucchetto è piuttosto oneroso e poco dinamico ma è sicuramente la soluzione più immediata e facile da implementare con gli strumenti che avevamo. L’illusione si creava ma l’array javascript che definivamo in InitBuffer() era talmente grande che tutta l’applicazione risultava lentissima e impiegava uno tempo di inizializzazione più che proibitivo.

In questa lezione rilasceremo una classe che in maniera velata si comporta nel medesimo modo ma, sfruttando blender e la velocità del parsing di Javascript, renderà il gioco Webgl piuttosto veloce ( almeno se paragonato al precedente esempio).

Mostriamo ora i passaggi base per inserire una classe dinamica.

Prendiamo l’ultimo esempio scaricabile dalla solita pagina ed apriamo il file lesson12.html.
Prima di tutto cerchiamo la funzione InitBuffer()  che rappresenta la nostra fase di inizializzazione: subito prima notiamo la definizione di una variabile:

var baule;

Esso rappresenterà il nostro oggetto dinamico, definito fuori dallo scope della funzione per una questione di visibilità.
Poi entriamo nella funzione InitBuffer() e individuiamo questo codice :

baule=new DinObjF();
baule.LoadDinObjF(“baule_apertura”,20,1,”apertura”);
baule.LoadDinObjF(“baule_chiusura”,20,1,”chiusura”);

DinObjF è la nuova classe a nostra disposizione: notiamo che non ha bisogno di alcun argomento ( indice del fatto che la fase di inizializzazione dell’oggetto è assai limitato).
Successivamente viene chiamata la funzione LoadDinObjF : essa ha il compito di caricare l’insieme di file obj che rappresentanto l’azione da disegnare.
Il primo argomento è l’inizio del nome dei file obj che la funzione dovrà parsare, il secondo è il numero di frame ( o fotogrammi se preferite ) che deve analizzare, il terzo rappresenta la latenza che può esistere tra un frame e l’altro ( maggiore è il numero, e più tempo trascorrerà tra un cambio di frame e l’altro ), il quarto è semplicemente il nome con cui indentificheremo l’azione.
I nomi dei file obj dei frame devono seguire lo standard dell’export di blender 2.60 :

nome_file_numero.obj dove numero ha il formato “000000”
esempio:

baule_apertura_000001.obj
baule_apertura_000002.obj

Questa soluzione è stata scelta proprio per semplificare la vita degli sviluppatori: dopo aver creato un modello blender che esegue un azione, basterà esportare in formato obj ( selezionando l’opzione “esporta animazione” ) ; dopo che il programma avrà generato un insieme di file obj e mtl, basterà copiarli nella folder dell’applicazione e ci penserà la funzione LoadDinObjF a caricare.
Ovviamente è possibile caricare più azioni dello stesso modello ( nel nostro esempio, c’è un animazione per aprire il baule ed una per chiuderlo ).

Ora passiamo all’ultima fase, quella di disegno; apriamo la funzione DrawScene() e individuiamo questa porzione di codice:

if ( baule.stato == “chiuso” )
baule.StaticDraw(“chiusura”,19);
if ( baule.stato == “aperto” )
baule.StaticDraw(“apertura”,19);
if ( baule.stato == “apertura” )
baule.Draw(“apertura”);
if ( baule.stato == “chiusura” )
baule.Draw(“chiusura”);

la variabile stato è stata aggiunta per avere traccia dello stato del modello dinamico durante l’applicazione ( così sappiamo anche che animazione deve essere attivata).
Come potete vedere sono due le possibile funzioni:

-Draw(ACTION)
disegna l’azione action (cambiando automaticamente il frame ogni tot tempo proporzionale al numero di latenza). Il nome
dell’action deve essere quello definito precedentemente dal metodo LoadDinObjF.

-DrawStatic(ACTION,numero_frame)
disegna l’azione action ma non cambia frame : nel caso numero_frame sia definito, disegna quel determinato frame, viceversa disegna l’ultimo frame in cui si era fermato il contatore.

ESEMPIO
Terminato ciò, possiamo introdurre il nuovo progetto: campagna 1942. Tale applicazione è solo una frazione del design che avevo in mente ma avevo voglia di cambiare un pò d’aria. Ritroviamo qua gli stessi input e comandi dell’esempio precedente ( stile fps) ,mentre possiamo notare l’aggiunta di nuovi modelli 3d ( tra cui un mulino funzionante ) ed il nostro baule.
Per abilitare l’animazione dobbiamo essere molto vicino se non sopra ( ho messo una distanza massima per l’attivazione molto bassa ) e cliccare il pulsante E : essa si aprirà o si chiuderà producendo anche un suono ( ricorda un pò il gioco di ruolo Skyrim quando si cercano oggetti tra i bauli XD ).
E’ stato disabilitato il controllo della posizione, indi è possibile attraversare qualunque oggetto 3d senza problemi.

Per potere vedere l’esempio appena mostrato ( lo trovate come lesson12 e potete scaricare il pacchetto completto lesson12.zip) e scaricare il codice che è stato presentato nell’articolo, collegarsi al solito repository Lab .

Grazie per l’attenzione,

Andrea