|
|
|
cignoni@iei.pi.cnr.it |
|
http://vcg.iei.pi.cnr.it/~cignoni |
|
|
|
|
|
|
Il primo step della pipeline di rendering è
quello di trasformare la scena nel sistema di riferimento della camera |
|
|
|
|
|
Perché ogni oggetto ha il suo sistema di
riferimento? |
|
Uso Multiplo di uno stesso oggetto |
|
Posizione parametrica |
|
|
|
|
Si dice che un punto P è rappresentato dalla
matrice colonna p |
|
|
|
|
|
E un vettore w è rappresentato dalla matrice
colonna a |
|
|
|
|
Notare che se u è un vettore solo 9 elementi di
A sono usati nella trasformazione |
|
|
|
|
|
|
|
|
|
|
|
|
|
La quarta colonna corrisponde alla quarta riga
della matrice di cambiamento di frame, che conteneva il nuovo punto di
origine del frame (che chiaramente non serve se si parla di vettori) |
|
|
|
|
|
|
modifica i punti di un frame sommando a tutti i
punti un vettore di spostamento d |
|
|
|
|
|
|
|
|
|
|
|
Di una rotazione si deve specificare |
|
angolo, |
|
asse |
|
punto di
applicazione |
|
|
|
|
Caso semplice asse z, intorno all’origine, di un
angolo q |
|
Possiamo considerare il problema in 2d |
|
|
|
|
|
|
|
Le matrici di rotazione viste finora sono
invertibili facilmente. |
|
|
|
|
|
|
|
Quindi basta trasporre… |
|
|
|
|
Finora abbiamo visto solo rotazioni intorno
all’origine e lungo gli assi. |
|
Una rotazione arbitraria si ottiene componendo
piu’ rotazioni e traslazioni |
|
|
|
|
Non rigida |
|
Non uniforme lungo gli assi |
|
Solo centrata all’origine |
|
|
|
|
Le trasformazioni sono matrici |
|
L’applicazione di trasformazione è la
moltiplicazione di una matrice per un vettore. |
|
L’applicazione di una sequenza di trasformazioni
ad un punto corrisponde ad una sequenza di moltiplicazioni di di matrici
per vettori |
|
Associatività |
|
|
|
|
|
|
|
|
Conviene se si deve
trasformare un solo punto |
|
|
|
Conviene se si deve
trasformare molti punti |
|
|
|
|
La moltiplicazione tra matrici NON è commutativa |
|
Quindi l’ordine delle trasformazioni È
importante |
|
|
|
|
|
Si ottiene spostando tutto il sistema di
riferimento nel punto, facendo la rotazione e rimettendo tutto a posto |
|
|
|
|
|
|
|
L’idea e’ quella di fare : |
|
due rotazioni che portino l’asse di rotazione
specificato a coincidere con l’asse z, |
|
la rotazione lungo quell’asse di quanto
specificato |
|
rimettere tutto a posto |
|
|
|
|
|
|
|
trovare non è semplice… |
|
|
|
|
Sarebbe derivabile dalle altre… |
|
Lo spostamento e’ proporzionale alla coord y; |
|
|
|
|
|
|
|
|
|
Nello Stato di OpenGL ci sono tre matrici 4x4 di
trasformazioni |
|
ModelView |
|
Project |
|
Texture |
|
Una di queste e’ sempre la matrice corrente |
|
Tutte i comandi che modificano matrici fanno
sempre riferimento alla matrice corrente |
|
|
|
|
|
|
Per cambiare matrice Corrente |
|
glMatrixMode() |
|
GL_MODELVIEW |
|
GL_PROJECTION |
|
GL_TEXTURE |
|
Per rimpiazzare la matrice |
|
glLoadIdentity() |
|
glLoadMatrix(Pointer to a matrix); |
|
Tutti gli altri comandi modificano (moltiplicano
per un altra matrice) la matrice corrente. |
|
|
|
|
|
|
|
|
Leggere una matrice |
|
glGetDoublev(GL_MODELVIEW_MATRIX,pointer_to_matrix) |
|
Nota: nello scambio diretto di matrici OpenGL
assume che siano memorizzate in column major order (e.g. per colonne) |
|
|
|
|
|
|
|
Rotazioni |
|
glRotatef(angle, ax,ay,az); |
|
Traslazioni |
|
glTranslatef(dx,dy,dz); |
|
Scalature |
|
glScalef(sx,sy,sz) |
|
|
|
Generica |
|
glMultMatrix(matrix_pointer) |
|
|
|
|
I comandi opengl postmoltiplicano la matrice
corrente per quella specificata |
|
|
|
|
La matrice corrente puo’ essere salvata in uno
stack e recuperata successivamente |
|
glPushMatrix() |
|
glPopMatrix() |
|
|
|
|
|
Il Matrix Stack e’ particolarmente utile quando
si disegnano scene strutturate |
|
|
|