Decidere su quale tipo di gestione delle scene usare dipende molto dal tipo di logica che si sta tentando di eseguire. Considera i diversi consumatori della tua scena:
Consumatore di rendering
Il renderer probabilmente vuole solo sapere cosa è attualmente visibile all'utente in un dato punto. Vuole una gerarchia di volumi limite per l'abbattimento rapido ( articolo wiki BVH) in
modo che possa capire che non è necessario disegnare una sedia all'interno di una barca perché i limiti della barca sono al di fuori del frustum della vista. Questo potrebbe essere incorporato in un ottetto .
Potrebbe anche voler avere l'idea che la sedia sia appoggiata sul retro all'interno della barca e che la barca stia rotolando su e giù su alcune onde quando finalmente viene vista. In questo modo, per trovare le coordinate mondiali finali dei vertici della sedia, può concatenare le trasformazioni della sedia e della barca e farcela (questo semplifica anche il tuo lavoro di programmatore).
Un altro modo di considerare questo problema è che il renderer sta probabilmente eseguendo una buona carta e alla fine vuole solo un mucchio di triangoli ordinati in modo da ridurre al minimo la trama, lo shader, il materiale, l'illuminazione e trasformare i cambiamenti di stato. Quest'ultimo probabilmente ti aiuterà più di un BVH, in termini di preformance.
Consumatore della logica di gioco
La logica del gioco probabilmente vuole solo un elenco semplice di cose che possono dialogare tra loro tramite un sistema di messaggistica, quindi probabilmente uno std :: vector va bene.
Il gioco potrebbe anche desiderare un modo per tenere traccia di chi è il più vicino a ciò, quindi una sorta di informazione [del vicino più vicino] [3] potrebbe essere utile in quel caso. Questo può essere fornito anche da un BVH, ma dover su e giù per il grafico potrebbe essere fastidioso.
Il gioco potrebbe anche voler sapere che quando sposta A, anche l'oggetto B di A dovrebbe spostarsi ... nel qual caso torniamo a una sorta di gerarchia di trasformazione.
Consumatore di fisica
La fisica del tuo gioco potrebbe voler avere una [rappresentazione speciale] [4] di spazi interni per un rilevamento delle collisioni molto veloce. In alternativa, potrebbe usare una sorta di ottetto o [hashing spaziale] [5] per trovare in modo efficiente cose che potrebbero scontrarsi.
Nessuna delle strutture di dati di fisica sopra sembra davvero un "grafico di scena" in senso Java3D.
Consumatore audio
Un motore audio vuole solo geometria, forse un insieme potenzialmente visibile (udibile) o una sorta di gerarchia del volume limite per calcolare l'attenuazione del suono e la propagazione. Ancora una volta, non è proprio un normale tipo di grafico di scena, anche se potrebbe benissimo essere un grafico di geometria nella tua scena.
In definitiva ...
... dipende solo dalle esatte esigenze della tua applicazione. Suggerirei di utilizzare un elenco semplice per iniziare e vedere dove sorgono i tuoi problemi. Potresti anche provare un elenco semplice con una gerarchia di trasformazione, perché questo è forse l'unico tipo di scenario utile per ragioni diverse dall'efficienza.
In bocca al lupo!