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 78: BoundingLeaf e Bound di dimensione infinita.

 

I Behavior e molti altri oggetti di Java3D hanno bisogno, come abbiamo visto, di una 'bounding zone' che determini dove tali oggetti agiscono e se i loro effetti debbano essere visualizzati o meno (a seconda dell'intersezione del bound con la View Platform).

 

Con alcuni oggetti può sorgere un problema di dimensioni della bounding region; ad esempio, se con la View Platform ci si sposta al di fuori della zona d'influenza del Behavior di navigazione (ossia: al di fuori della sua bounding region), potrebbe risultare impossibile muoversi !

 

 

Ci sono due metodi per risolvere questo genere di problemi:

  • l'uso di POSITIVE INFINITY di Float;

  • la creazione di una Bounding Leaf.

 

La prima soluzione, molto semplice da implementare (una sola riga di codice !), consiste nel mettere, come valore della dimensione della bounding region, 'Float.POSITIVE INFINITY'.

 

La seconda soluzione, un pò più articolata, prevede l'utilizzo di una Bounding Leaf.

Una Bounding Leaf è un oggetto dello Scene Graph a tutti gli effetti, che definisce, internamente, una bounding region.

Il punto fondamentale è che, essendo la Bounding Leaf un oggetto dello Scene Graph (una Leaf), può essere agganciata ad un Transform Group, dunque la zona d'influenza può muoversi nell'universo 3D.

La Bounding Leaf può essere condivisa da più oggetti dello Scene Graph, se questi mettono a disposizione un metodo del tipo 'setInfluencingBoundingLeaf'; non si tratta, quindi, di relazioni di tipo Padre-Figlio tra elementi dello Scene Graph, ma di collegamenti di tipo Reference.

 

 

 

Per utilizzare una Bounding Leaf da 'muovere' insieme alla View Platform, associando la Bounding Leaf al Behavior di navigazione nello spazio 3D da tastiera, è necessario inserire la Bounding Leaf come figlia del Transform Group che controlla la View Platform.

Nel Simple Universe, il View Platform Transform Group è un TG particolare, che accetta, come figli creati esternamente, solo dei Branch Group.

Bisogna quindi creare un Branch Group temporaneo da inserire come figlio del VPTG nello Scene Graph, ed agganciare a tale Branch Group la Bounding Leaf, così:

 

TransformGroup vpTG = mioSimpleUniverse.getViewingPlatform().getViewPlatformTransform();

BoundingLeaf bl = new BoundingLeaf();

bl.setRegion(new BoundingSphere(new Point3d(), 10.0));

BranchGroup bgTemp = new BranchGroup();

bgTemp.addChild(bl);

((TransformGroup) (mioSimpleUniverse.getViewingPlatform(). getViewPlatform().getParent())).addChild(bgTemp); .

 

 

Quando creeremo il Behavior per la navigazione da tastiera, imposteremo come Bounding Leaf dello stesso la bounding leaf creata precedentemente; in questo modo, la sua regione di influenza si muoverà con l'osservatore, rendendo il Behavior 'sempre attivo':

 

MioBehaviorNavigazione behaviorNavigazione = new MioBehaviorNavigazione(vpTG);

behaviorNavigazione.setSchedulingBoundingLeaf(bl);

miaScena.addChild(behaviorNavigazione); .

 

 

Quando utilizzare la soluzione di PositiveInfinity e quando utilizzare una BoudingLeaf ?

Dipende dal progetto: le zone di influenza possono essere piccole ma rendere i Behavior 'sempre attivi' ? Devono cioè muoversi ? Quante devono essere ?

E' possibile creare e riusare una singola bounding region sempre valida ?

Abbiamo bisogno di una bouding region enorme o possiamo limitarci ad alcune bounding box disposte in una certa maniera (ad esempio, per definire i punti ove è possibile muoversi in uno scenario che rappresenta un piano di un edificio) ?

Il problema va valutato caso per caso.

 

 
Vai all'inizio della pagina