Lavorare con le matrici in OGL Daniele Marini
Frames Il frame è un contesto di sistema di riferimento e di trasformazioni geometriche associate Usualmente si distinguono due frame principali: World frame, nel quale si descrivono e rappresentano gli oggetti modellati Camera frame, nel quale si definisce il sistema di riferimento necessario alla creazione della proiezione
Camera frame OpenGL adotta la metafora della macchina fotografica: la formazione dell’immagine piana a partire dal modello 3D avviene con un principio di proiezione simile a quello della fotografia Il sistema di riferimento del camera frame si assume fisso: Origine in basso a sinistra del fotogramma X crescente a destra Y crescente in verticale Z entrante nella macchina fotografica
questo e’ l’ordine con cui vanno specificate le trasformazioni nel programma le trasformazioni nella fase di rendering sono eseguite con un’altro ordine
Gli oggetti sono creati rispetto a questo sistema di riferimento Nella figura sinistra i due frame coincidono, con questa configurazione la trasformazione prospettica risulta semplificata, “canonica” - gli oggetti sono fuori campo! Gli oggetti sono definiti nello stesso frame, per vederli occorre traslare o la camera o gli oggetti Equivalentemente si trasla il camera frame rispetto al world frame o viceversa
La model-view matrix nel caso canonico diventa: Trasla un punto nel world frame di -d rispetto al camera frame (figura destra) La funzione è glLoadMatrix
Trasformazioni affini nello spazio di coordinate omogenee Matrici 4x4: 16 gradi di libertà apparenti 12 gradi di libertà effettivi
Trasformare vettori o punti Vettore come differenza di due punti Trasformazione affine di vettori: 9 gradi di libertà
La trasformazione affine conserva le rette Possiamo descrivere un poliedro con i suoi vertici, facce e spigoli, ma possiamo trasformare soltanto i vertici!
Concatenazione di trasformazioni Trasformiamo il punto p con una sequenza di rasformazioni A,B,C (associatività):
Se applichiamo a ogni punto separatamente le matrici: Se prima calcoliamo la matrice M: A B C q p C(B(A)) M q p
Rotazione attorno a punto generico
La matrice M
Trasformazioni per modellare: instance transformation Da oggetti prototipo a loro “istanze” Tre trasformazioni nell’ordine: Scala Rotazione Traslazione Minst=T(R(S)) Un oggetto può essere istanziato più volte ma nella display list ha un’unica occorrenza
Rotazione attorno a un asse qualsiasi
vettore unitario, d lunghezza proiezione, ai coseni direttori, qi angoli di rotazione
OpenGl Current Transformation Matrix CTM: è la matrice che viene applicata a ogni vertice di una scena - successivo alla sua definizione Se si cambia CTM si cambia lo stato del sistema Inizialmente posta a identità: CTM := I Viene modificata o per assegnamento o per pre - post -moltiplicazione glLoadMatrixf(pointer_to_matrix) glLoadIdentity() glRotatef(angle, vx, vy, vz) glTranslatef(dx, dy, dz) glScale(sx, sy, sz)
Rotazione attorno a un punto glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(4.0, 5.0, 6.0); glRotatef(45.0, 1.0, 2.0, 3.0); /* esegue la rotazione attorno a un asse generico */ glTranslatef(-4.0, -5.0, -6.0); Ogni vertice specificato dopo queste dichiarazioni viene trasformato con questa matrice
Stack di matrici Si può modificare una CTM con la: glMultMatrixf(myarray) Durante la modellazione si creano matrici di istanza, applicata a un solo oggetto e non all’intera scena, in tal caso la CTM della scena viene posta nello stack
glPushMatrix(); /* crea trasformazione di istanza */ glTranslateF(…); glRotatef(…); glScalef(…); /* disegna l’oggetto */ … glPopMatrix(); /* ricrea la CTM */