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 142: Animazioni Morph.

 

Morph è un interpolatore (ma solo nel senso che 'passa da un nodo all'altro', non nel senso di oggetto Interpolator Java3D) di Geometry Array.

 

La classe Morph, comunque, non estende nè Interpolator nè Behavior, ma semplicemente Node.

Consente di modificare le geometrie delle mesh, operando su sottoclassi di GeometryArray.

 

 

I costruttori sono:

  • Morph(GeometryArray[] geometryArrays);

  • Morph(GeometryArray[] geometryArrays, Appearance appearance) ; .

 

 

Un Morph è quindi una collezione di geometrie e di 'pesi', che vengono definiti con il metodo setWeights(double[] weights) da applicare alle geometrie.

La somma di tutti i pesi presenti nel Morph deve valere 1.

A differenza di DistanceLoD, che estende da Behavior e si attiva automaticamente, quindi, è necessario associare un Behavior al Node Morph, altrimenti avremo solo una collezione di coppie geometria-peso, ma nessuna animazione.

 

Capabilities interessanti di Morph sono:

 

  • ALLOW COLLISION BOUNDS READ;

  • ALLOW COLLISION BOUNDS WRITE;

  • ALLOW GEOMETRY ARRAY READ;

  • ALLOW GEOMETRY ARRAY WRITE;

  • ALLOW WEIGHTS READ;

  • ALLOW WEIGHTS WRITE;

  • ALLOW APPEARANCE OVERRIDE READ;

  • ALLOW APPEARANCE OVERRIDE WRITE;

  • ALLOW APPEARANCE READ;

  • ALLOW APPEARANCE WRITE.

 

 

Di seguito viene quindi mostrato come creare un Morph ed inserirlo in una scena.

Per prima cosa bisogna creare un oggetto Morph, ad esempio con:

 

Morph mioMorph=new Morph(arrayGeometrie);

mioMorph.setCapability(Morph.ALLOW WEIGHTS WRITE);

 

 

dove 'arrayGeometrie' è, appunto, un array di oggetti di tipo Geometry, secondo le specifiche descritte all'inizio di questa sezione.

 

Morph è un Node, quindi va aggiunto a un Branch Group o ad un Transform Group per poterlo inserire nella scena.

A questo punto, per riprodurre l'animazione, bisogna creare, con una apposita classe la cui definizione spetta al programmatore (che può quindi personalizzarla in base alla proprie esigenze), un oggetto erede di Behavior per 'controllare' l'oggetto Morph e permetterne 'l'animazione'; ossia, in maniera più corretta, il passaggio da una Geometry all'altra, tra quelle contenute nel Morph, costruito proprio con un array di Geometry.

 

Si tratta di una classe che, concettualmente, è a metà tra un Behavior e un Interpolator, in quanto si attiva con degli eventi (come i Behavior), fa uso (come i Behavior) di un target (il nostro Morph 'mioMorph') e (come gli Interpolator) di un oggetto Alpha, creato proprio per descrivere l'animazione; a livello implementativo, comunque, eredita solo da Leaf.

 

La costruzione di un simile Behavior avverrà, quindi, passandogli almeno l'Alpha e il nodo / target Morph; nulla vieta comunque di passare altri argomenti, in base alle proprie esigenze.

Ovviamente, dal momento che si tratta di un Behavior, bisognerà gli SchedulingBounds e si dovrà aggiungere tale oggetto, insieme al nodo Morph, alla scena.

A modificare la geometria di un oggetto, passando da una geometria all'altra in maniera 'dolce', è dunque un'azione combinata di Morph e del Behavior personalizzato.

Combinando gli effetti di Morph e le trasformazioni spaziali sulle Leaf, è possibile quindi generare animazioni davvero complesse; basti pensare, ad esempio, ad un giocatore di calcio: l'animazione degli arti può essere fatta con Morph, che agisce sulla forma della geometria, mentre lo spostamento del corpo avviene operando una trasformazione sul TransformGroup che controlla l'oggetto visuale, partendo, in entrambi i casi (ma con Behavior differenti), dai testi premuti dall'utente.

 

Esempio: 'EsempioMorph'.

 

 
Vai all'inizio della pagina