NOTA! Questo sito utilizza i cookie e tecnologie simili.

Se non si modificano le impostazioni del browser, l'utente accetta. Per saperne di piu'

Approvo

Capitolo 141: Animazioni 'a comando'.

 

Finora abbiamo visto animazioni presenti nella scena dall'inizio, cioè inserite in maniera attiva nell'ambiente virtuale al momento dell'avvio del programma.

A volte è necessario, però, inserire delle animazioni 'al volo', magari parendo da dati o parametri inseriti dall'utente.

Vedremo quindi come inserire un'animazione a comando nella scena.

 

 

A tal proposito, il lettore ha a disposizione l'esempio 'Esempio ICBM', una base di partenza per un Artillery Game, il cui funzionamento viene spiegato qui di seguito.

Si vuole simulare il lancio di un missile (da qui il nome ICBM, appunto) da una plancia verso una destinazione, con le coordinate di destinazione impostate dall'utente mediante una semplice GUI.

 

All'avvio, lo scenario Java3D deve essere visibile da subito, insieme ad una GUI Java2D con tre campi per impostare le 'coordinate di arrivo' di un missile (non ancora visibile).

Le coordinate di partenza saranno invece fisse: (0, 0, 0).

L'utente quindi dovrà impostare le coordinate di arrivo nella GUI e cliccare sul pulsante 'Fuoco'; a quel punto, verrà visualizzata a video l'animazione.

Il punto fondamentale è, quindi, aggiungere un blocco (Interpolatore, Oggetto, Alpha) 'al volo' nello Scene Graph ed avviare l'animazione.

I passi da seguire, che riguardano in questo caso solo Java3D e non la GUI, sono:

  • creare la radice del Content Branch Graph, rendendola globale e attivando la capability ALLOW CHILDREN EXTEND;

  • creare ed agganciare al Content Branch Graph gli elementi 'fissi' della scena, quelli cioè che devono essere visualizzati all'avvio dell'applicazione, statici ed animati.

 

Bisogna quindi definire un metodo che, una volta invocato (ad esempio, alla pressione del tasto 'Fuoco' sulla GUI):

  • calcoli 'al volo' le posizioni del missile, tenendo conto delle coordinate di destinazione (nel nostro caso, a dire il vero molto banale, la posizione di partenza è fissa e coincide con l'origine);

  • carichi la mesh del missile, agganciandola ad un TG;

  • crei un Alpha e un RotPosPathInterpolator con i dati calcolati;

  • agganci l'Interpolatore ed il TG alla radice del Content Branch Graph.

 

Tutte queste operazioni sono semplici da implementare, ma anche eseguendo tutti i passi potremmo avere una spiacevole sorpresa: una volta creato (prima ancora di creare l'Interpolatore ed agganciare il tutto alla scena), l'Alpha terrebbe conto dell'orologio di sistema, così da visualizzare il missile già in volo o addirittura sul bersaglio.

 

Per ovviare a questo problema, utilizzare la seguente istruzione (da inserire in un blocco try-catch) per 'sincronizzare' l'esecuzione dell'animazione alla partenza dell'Alpha:

 

Thread.sleep( (int) ([durataAnimazione] ((System.currentTimeMillis() - tempoDiAvvioDelSistema)

 

 
Vai all'inizio della pagina