Date post: | 02-May-2015 |
Category: |
Documents |
Upload: | concettina-magnani |
View: | 213 times |
Download: | 1 times |
1
Lavorare con le matrici in OGL
Daniele Marini
2
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
3
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
4
5
6
• questo e’ l’ordine con cui vanno specificate le trasformazioni nel programma
• le trasformazioni nella fase di rendering sono eseguite con un’altro ordine
7
8
• 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 gli
oggetti sono fuori campo!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
9
• 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
1 0 0 0
0 1 0 0
0 0 1 −d
0 0 0 1
⎡
⎣
⎢ ⎢ ⎢ ⎢ ⎢
⎤
⎦
⎥ ⎥ ⎥ ⎥ ⎥
10
Trasformazioni affini nello spazio di coordinate omogenee
• Matrici 4x4: 16 gradi di libertà apparenti
• 12 gradi di libertà effettivi
A=
a1,1 a1,2 a1,3 a1,4
a2,1 a2,2 a1,3 a2,4
a3,1 a3,2 a1,3 a3,4
0 0 0 1
⎡
⎣
⎢ ⎢ ⎢ ⎢ ⎢
⎤
⎦
⎥ ⎥ ⎥ ⎥ ⎥
; p=
pxpypz1
⎡
⎣
⎢ ⎢ ⎢ ⎢ ⎢
⎤
⎦
⎥ ⎥ ⎥ ⎥ ⎥
11
Trasformare vettori o punti
• Vettore come differenza di due punti
• Trasformazione affine di vettori: 9 gradi di libertà
v=
v1
v2
v3
0
⎡
⎣
⎢ ⎢ ⎢ ⎢ ⎢
⎤
⎦
⎥ ⎥ ⎥ ⎥ ⎥
; u=vA
12
La trasformazione affine conserva le rette
p(t) =tp0 +(1−t)p1
Ap(t) =tAp0 +(1−t)Ap1
Possiamo descrivere un poliedro con i suoi vertici, facce e spigoli, ma possiamo trasformare soltanto i vertici!
13
Concatenazione di trasformazioni
• Trasformiamo il punto p con una sequenza di rasformazioni A,B,C (associatività):
q=CBAp
q=C(B(AP))
M=CBA
14
• Se applichiamo a ogni punto separatamente le matrici:
• Se prima calcoliamo la matrice M:
A B Cp q
M qp
C(B(A))
15
Rotazione attorno a punto genericoM=T(pf )Rz(ϑ )T(−pf )
T(pf )=
1 0 0 xf0 1 0 yf0 0 1 0
0 0 0 1
⎡
⎣
⎢ ⎢ ⎢ ⎢ ⎢
⎤
⎦
⎥ ⎥ ⎥ ⎥ ⎥
T(−pf ) =
1 0 0 −xf0 1 0 −yf0 0 1 0
0 0 0 1
⎡
⎣
⎢ ⎢ ⎢ ⎢ ⎢
⎤
⎦
⎥ ⎥ ⎥ ⎥ ⎥
Rz(ϑ ) =
cosϑ −sinϑ 0 0
sinϑ cosϑ 0 0
0 0 1 0
0 0 0 1
⎡
⎣
⎢ ⎢ ⎢ ⎢ ⎢
⎤
⎦
⎥ ⎥ ⎥ ⎥ ⎥
16
La matrice M
M=
cosϑ −sinϑ 0 xf −xf cosϑ +yfsinϑ
sinϑ cosϑ 0 yf −xfsinϑ −yf cosϑ
0 0 1 0
0 0 0 1
⎡
⎣
⎢ ⎢ ⎢ ⎢ ⎢
⎤
⎦
⎥ ⎥ ⎥ ⎥ ⎥
17
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
18
Rotazione attorno a un asse qualsiasi
19
vettore unitario, d lunghezza proiezione, ai coseni direttori, i angoli di rotazione
20
Rx(ϑx) =
1 0 0 0
0azd
−ayd
0
0ayd
azd
0
0 0 0 1
⎡
⎣
⎢ ⎢ ⎢ ⎢ ⎢ ⎢
⎤
⎦
⎥ ⎥ ⎥ ⎥ ⎥ ⎥
Ry(ϑy) =
d 0 −ax 0
0 1 0 0
ax 0 d 0
0 0 0 1
⎡
⎣
⎢ ⎢ ⎢ ⎢ ⎢
⎤
⎦
⎥ ⎥ ⎥ ⎥ ⎥
........
M=T(p0) Rx −ϑ x( ) Ry −ϑ y( ) Rz ϑ( ) Ry ϑy( ) Rx ϑ x( ) T −p0( ){ }{ }{ }{ }
⎧ ⎨ ⎩
⎫ ⎬ ⎭
⎧ ⎨ ⎩
⎫ ⎬ ⎭
21
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)
22
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
23
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
24
glPushMatrix();/* crea trasformazione di istanza */glTranslateF(…);glRotatef(…);glScalef(…);/* disegna l’oggetto */…glPopMatrix();/* ricrea la CTM */