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