[lnkForumImage]
Download FREE Software.

Confronta i prezzi di migliaia di prodotti.
News Forum Italiano
 Home | Login | Registrati | Ricerca 


 

Forums >

it.comp.giochi.sviluppo

rendering e scenegraph

alessio211734

21/03/2011 11:23:18

Salve a tutti,
sto tentando di fare uno scenegraph e volevo chiedere qualche info,
dato che mi sono venuti dei grossi dubbi.

Ho dato un occhiata e preso spunto da ogre:
http://www.ogre3d.org/docs/api/html/OgreNode_8h_s...

rappresento un albero di nodi dove ogni nodo ha un orientazione e
posizione rispetto al parent.
Ora vedo che ogree si tiene anche per ogni nodo una posizione derivata
e una orientazione derivata che da quello che
ho capido sono la posizione e orientazione rispetto a world space.

La mia domanda è come renderizzo lo scenegraph?
Adesso per tenere aggiornato la posizione e orientazione rispetto a
world space ogni volta che muovo la posizione e orientazione di un
nodo
scorro tutti i suoi figli ricorsivamente e aggiorno la posizione e
orientazione derivata (rispetto a world space) di tutti i nodi figli.
A questo punto renderizzo andando a prendere la matrice world di ogni
nodo data da la posizione derivata e orientazione derivata.

Ogre usa i seguenti nomi:
// orientazione rispetto a parent
Quaternion mOrientation;
// posizione rispetto a parent
Vector3 mPosition;
// orientazione risp. a world space
mutable Quaternion mDerivedOrientation;
// posizione risp. a world space
mutable Vector3 mDerivedPosition;

Mi sembra in effetti inefficiente aggiornare ogni volta che sposto un
nodo tutto il suo sottoalbero e potrei renderizzare con glPushMatrix e
glPopmatrix

glMultMatrix(matr_nodo)
for every child
{
glPushMatrix()
glMultMatrix(matr_child);
RenderChild()
glPopMatrix()
}
RenderNode();

ma mi chiedo pero' poi se avessi bisogno di un cambio di coordinate di
passare da un nodo all'altro mi serve sapere mDerivedPosition e
mDerivedOrientation quindi serve tenere aggiornato queste due
variabili o no?!? Come si renderizza uno scenegraph?

Grazie.


1 Risposta

Gianpaolo Ingegneri

11/04/2011 10:20:24

0

> Come si renderizza uno scenegraph?

Devi scorrere tutti i nodi ricorsivamente, facendo il prodotto tra la
matrice del nodo e quella del world space, ripristinando quest'ultima al
livello precedente ogni volta che esci dal nodo. Il codice che hai quotato
va bene, l'importante è che ti sia chiaro che ogni child può eseguire lo
stesso codice in modo ricorsivo. Non esiste un modo migliore per farlo.

> poi se avessi bisogno di un cambio di coordinate di
> passare da un nodo all'altro mi serve sapere mDerivedPosition e
> mDerivedOrientation quindi serve tenere aggiornato queste due
> variabili o no?!?

Lascia perdere questi stratagemmi, vediamo di usare la testa. Se devi
passare da un nodo all'altro mantenendo le stesse coordinate sul world
space, ti è utile ragionare in termini di sistema di riferimento.

Per renderizzare sullo schermo hai come sistema di riferimento il world
space, mentre ogni child di un nodo ha come sistema di riferimento quello
del nodo e così via. Passare da un nodo all'altro lasciando intatte le
trasformazioni dell'oggetto non è per niente banale e dipende da come
rappresenti il sistema di riferimento dei nodi.

Per il cambio di coordinate di cui parli devi ottenere una position,
rotation e scale riferite al sistema di riferimento del nuovo nodo. Facciamo
finta che il nostro scene graph tenga traccia solo delle posizioni, e che
voglio cambiare l'object da un nodo A ad un nodo B, mantenendo intatta la
sua posizione nello schermo (cioè riferita al world space), devo procedere:

ottengo Pos_NodoB_world = posizione del nodo B riferita al world space
ottengo Pos_Object_world = posizione dell'object riferita al world space

Pos_Object_NodoB = Pos_Object_world - Pos_NodoB_world

Semplice no? Ovviamente con le rotazioni la cosa si complica di parecchio,
perchè devi ruotare la posizione dell'oggetto e l'oggetto stesso attorno ai
suoi assi riferendoti al world space per poi riportare il tutto con
riferimento al sistema del Nodo B in termini di posizione e rotazione. Anche
se è più complesso, l'approccio non cambia di molto.