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 123: Animazioni LoD.

 

'LoD' sta per 'Level of Detail', o 'Livello di dettaglio'.

Come suggerisce il nome, un'animazione LoD tiene conto della distanza tra l'osservatore e l'oggetto da renderizzare per evitare 'sprechi' in termini di costo computazionale.

 

 

Si tratta di un'animazione dipendente dal punto di vista dell'osservatore, come quelle realizzate mediante Billboard o OrientedShape3D.

Quando, ad esempio, intravediamo una nave all'orizzonte, non riusciamo a coglierne i dettagli più minuti, ma se la nave si trova a 1 metro da noi riusciamo a vedere anche un bullone; se abbiamo una mesh 'complessa' ma molto lontana dall'osservatore, perchè far calcolare al motore di rendering di Java3D ogni minima linea o punto del modello?

 

 

Ecco quindi che entra in scena il 'Level of Detail': ad ogni mesh possiamo associare n modelli, dal più dettagliato al più semplice, e associare a ciascun modello una soglia: dalla distanza x alla distanza x + d utilizzeremo un modello, ma dalla distanza x+d alla distanza x+2d utilizzeremo la versione meno complessa, e così via.

La classe che ci consente di creare oggetti in grado di impostare le 'soglie' delle distanze per scegliere la mesh da renderizzare si chiama DistanceLoD ed è un classe che eredita da Behavior.

 

I costruttori sono:

  • DistanceLOD();

  • DistanceLOD(float[] distances);

  • DistanceLOD(float[] distances, Point3f position); .

 

 

Il primo costruttore crea un LOD con le impostazioni di default: un solo valore di soglia, impostato a 0.0, con l'oggetto LoD posizionato nell'origine; si tratta, quindi, di un oggetto DistanceLoD praticamente inutile, buono solo per definire un LoD e modificarne i parametri in seguito.

 

Il secondo costruttore ci permette di specificare un array di float: ogni float è una soglia di distanza dell'oggetto DistanceLoD dall'osservatore.

 

Il terzo costruttore ci permette infine di specificare tutti i parametri: l'array di float delle distanze / soglia e la posizione, specificata con un Point3f, dell'oggetto DistanceLoD.

 

E' possibile notare come le varie geometrie da associare alle soglie / distanze non siano specificate in alcun modo, qui... come fare ?

E' necessario ricorrere ad un oggetto particolare di Java3D, da creare con la classe Switch.

Un oggetto Switch è un Group Node: pu`o contenere uno o più figli, come una lista (difatti i metodi, che verranno elencai a breve, somigliano molto a quelli di una generica LinkedList).

Ecco i metodi di Switch per l'inserimento, la ricerca e la rimozione di nodi (nota: Switch, in realtà, eredita questi metodi dalla classe Group):

  • public void addChild(Node child);

  • public java.util.Enumeration getAllChildren();

  • public Node getChild(int index);

  • public int indexOfChild(Node child);

  • public void insertChild(Node child, int index);

  • public int numChildren();

  • public void removeAllChildren();

  • public void removeChild(int index);

  • public void removeChild(Node child);

  • public void setChild(Node child, int index); .

Il loro significato / funzionamento è intuitivo.

 

Impostando le relative capabilities, è possibile operare su questa 'lista' a runtime.

Ai valori di soglia / distanza specificati nell'oggetto DistanceLoD verranno quindi associati degli oggetti presenti nello Switch target del DistanceLoD.

Riassumendo, ecco i passi da seguire:

 

  • creare un nodo Switch e popolarlo;

  • creare un oggetto DistanceLoD, specificando una lista di distanze / soglia;

  • impostare l'oggetto Switch come target del DistanceLoD, tramite il metodo addSwitch(Switch s) di DistanceLoD;

 

  • aggiungere il tutto (DistanceLoD e Switch) allo Scene Graph.

 

 

Bisogna ricordarsi, infine, di impostare le capabilities per lo Switch (lo Switch deve poter selezionare a runtime un oggetto dalla sua lista) e di creare uno SchedulingBounds per il DistanceLoD.

LoD è uno strumento potente, ma con una limitazione: non supporta le viste multiple (proprio come Billboard, con la differenza che per Billboard c'era un'alternativa, rappresentata da OrientedShape3D... qui no).

 

Esempio pratico: 'EsempioLoD'.

 

 
Vai all'inizio della pagina