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

Guida Java 3D - 123: animazioni LoD (Level of Detail)

Guida Java 3D, corso di base 

 

'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'.

 

Pagina di Francesco Milanese (redbaron85) su Facebook   Pagina di Francesco Milanese (redbaron85) su Google Plus   Profilo di Francesco Milanese (redbaron85) su LinkedIn   Pagina di Francesco Milanese (redbaron85) su Twitter   Canale Youtube di Francesco Milanese (redbaron85ct)

Vai all'inizio della pagina