Corso Di Programmazione Grafica aa2006/2007
Trasformazioni in OGL
Daniele Marini
Trasformazioni
– Le trasformazioni sono rappresentate da
matrici 4x4 (coordinate omogenee)
– Applicazione delle trasformazioni come
moltiplicazione di una matrice per un
vettore
– Viene mantenuto uno stack delle matrici
utilizzate per le trasformazioni
Programmazione Grafica aa2006/2007
2
Trasformazioni in OGL
• Ci sono due matrici in OGL:
– Matrice di modellazione GL_MODELVIEW
– Matrice di vista GL_PROJECTION
• Per selezionare su quale matrice si vuole
operare si chiama la funzione
glMatrixMode(GL_MODELVIEW| GL_PROJECTION)
• La matrice di modellazione rappresenta
trasformazioni affini con 12 gradi di libertà;
definita in spazio omogeneo 4x4
Programmazione Grafica aa2006/2007
3
CTM
• In OGL c’è la nozione di current
transformation matrix CTM
• Essa viene applicata ad ogni vertice
definito successivamente alla sua
istanziazione
• Se si cambia la CTM si cambia lo stato
del sistema
Programmazione Grafica aa2006/2007
4
CTM
• La CTM è inizializzata alla identità
• Per modificarla si può
– assegnare nuovi valori ai singoli argomenti
– Moltiplicarla per una nuova matrice
• La CTM è il prodotto della matrice di
modellazione per quella di proiezione
vertici
MODELVIEW
PROJECTION
vertici
CTM
Programmazione Grafica aa2006/2007
5
Trasformazioni
– La composizione di trasformazioni equivale alla
moltiplicazione delle rispettive matrici
– La moltiplicazione di matrici non è commutativa.
Quindi l’ordine con cui vengono applicate le
trasformazioni è importante
– Ordine corretto M=T(R(S)) corrispondente alle
chiamate (post-moltiplicazione):
glTranslate(dx,dy,dz);
glRotate(angolo,vx,vy,vz);
glScale(sx,sy,sz);
Programmazione Grafica aa2006/2007
6
Trasformazioni
• void glLoadIdentity();
• void glTranslate{fd}
(TYPE x, TYPE y, TYPE z);
• void glRotate{fd}
(TYPE angle, TYPE x, TYPE y, TYPE z);
• void glScale{fd}
(TYPE x, TYPE y, TYPE z);
Programmazione Grafica aa2006/2007
7
Gestione delle Matrici
• void glLoadIdentity( void )
– Imposta la matrice corrente all’identità
1
0
I4  
0

0
0 0 0

1 0 0
0 1 0

0 0 1
Programmazione Grafica aa2006/2007
8
Gestione delle Matrici
• void glPushMatrix( void )
• void glPopMatrix ( void )
– Gestiscono lo stack delle matrici
– glPushMatrix inserisce la matrice corrente nello stack
duplicandola
– Lo stack delle matrici può essere utilizzato in maniera
gerarchica
– La funzione dello stack è di registrare lo stato del
sistema per poterlo recuperare
• È possibile stack overflow!
Programmazione Grafica aa2006/2007
9
Gestione delle Matrici
void glLoadMatrixd(GLdouble *m)
void glLoadMatrixf(GLfloat *m)
• Rimpiazza la matrice corrente
con la matrice definita tramite l’array m
void glMultMatrixd(const GLdouble *m)
void glMultMatrixf(const GLfloat *m)
• Moltiplica la matrice corrente con la matrice
definita tramite l’array
Programmazione Grafica aa2006/2007
10
Gestione delle Matrici
• I parametri delle funzioni glLoadMatrix e
glMultMatrixd sono definiti come array
di 16 elementi
• La matrice viene definita
nell’array utilizzando
una notazione
column-major order
Programmazione Grafica aa2006/2007
a0
a
 1
 a2

 a3
a4
a8
a5
a6
a9
a10
a7
a11
a12 
a13 
a14 

a15 
11
Scarica

Trasformazioni in OGL