Trasformazioni Affini Cambi di Sistemi di riferimento Object
by user
Comments
Transcript
Trasformazioni Affini Cambi di Sistemi di riferimento Object
Cambi di Sistemi di riferimento Il primo step della pipeline di rendering è quello di trasformare la scena nel sistema di riferimento della camera Costruzione di Interfacce Lezione 5 Trasformazioni Affini [email protected] http://vcg.iei.pi.cnr.it/~cignoni Costruzione di Interfacce - Paolo Cignoni Object Frame Coordinate Omogenee 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 Costruzione di Interfacce - Paolo Cignoni 2 3 Costruzione di Interfacce - Paolo Cignoni Trasformazioni Affini α1 α p = 2 α 3 1 δ 1 δ a = 2 δ 3 0 4 Traslazione Notare che se u è un vettore solo 9 elementi di A sono usati nella trasformazione modifica i punti di un frame sommando a tutti i punti un vettore di spostamento d α11 α12 α13 α14 γ 1 α α 22 α 23 α 24 γ 2 Au = 21 α 31 α 32 α 33 α 34 γ 3 0 0 1 0 0 P′ = P + d p' = p + d 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) Costruzione di Interfacce - Paolo Cignoni 5 Costruzione di Interfacce - Paolo Cignoni 6 1 Traslazione p' = p + d p′ = Tp Traslazione x ′ α x x y ′ α y p = p′ = d = y ′ z α z z 1 0 1 1 0 T= 0 0 1 0 T(α x , α y , α z ) = 0 0 0 0 αx 1 0 αy 0 1 αz 0 0 1 Costruzione di Interfacce - Paolo Cignoni 0 0 αx 1 0 αy 0 1 αz 0 0 1 7 Costruzione di Interfacce - Paolo Cignoni Rotazione Caso semplice asse z, intorno all’origine, di un angolo θ Possiamo considerare il problema in 2d angolo, asse punto di applicazione x = ρ cos φ y = ρ sin φ x′ = ρ cos(φ + θ ) (x’,y’) θ ρ y ′ = ρ sin(φ + θ ) 9 Rotazione Costruzione di Interfacce - Paolo Cignoni 10 x' x x cosθ − y sin θ y ' y x sin θ + y cosθ = R (θ ) z = z' z z 1 1 1 y = ρ sin φ x′ = ρ cos φ cosθ − ρ sin φ sin θ = x cosθ − y sin θ y ′ = ρ cos φ sin θ + ρ sin φ cosθ = x sin θ + y cosθ cosθ sin θ R z (θ ) = 0 0 − sin θ x cosθ y Costruzione di Interfacce - Paolo Cignoni (x,y) Rotazione x = ρ cos φ x′ cosθ y ′ = sin θ 8 Rotazione Di una rotazione si deve specificare Costruzione di Interfacce - Paolo Cignoni 0 0 −αx 1 0 −αy 0 1 − αz 0 0 1 1 0 T −1 (α x , α y , α z ) = T( −α x ,−α y ,−α z ) 0 0 11 − sin θ cosθ 0 0 0 0 0 0 1 0 0 1 Costruzione di Interfacce - Paolo Cignoni 12 2 Rotazioni 0 1 0 cosθ R X (θ ) = 0 sin θ 0 0 cosθ 0 R Y (θ ) = − sin θ 0 0 − sin θ cosθ 0 0 sin θ 1 0 0 cosθ 0 0 Rotazione inversa Le matrici di rotazione viste finora sono invertibili facilmente. 0 0 0 1 R −1 (θ ) = R ( −θ ) sin( −θ ) = − sin(θ ) cos( −θ ) = cos(θ ) Quindi basta trasporre… 0 0 0 1 Costruzione di Interfacce - Paolo Cignoni R −1 (θ ) = R T (θ ) 13 Costruzione di Interfacce - Paolo Cignoni Rotazioni 14 Scalatura 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 x′ = β x x y′ = β y y z′ = β z z β x 0 T( β x , β y , β z ) = 0 0 Costruzione di Interfacce - Paolo Cignoni 15 Composizione di Trasformazioni 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à q = CBAp 0 0 βy 0 0 βz 0 0 0 0 0 1 Costruzione di Interfacce - Paolo Cignoni 16 Composizione di trasformazioni Conviene se si deve trasformare un solo punto Conviene se si deve trasformare molti punti q = (C(B(Ap ))) q = (CBA )p q = (C(B(Ap ))) q = (CBA )p Costruzione di Interfacce - Paolo Cignoni 17 Costruzione di Interfacce - Paolo Cignoni 18 3 Composizione di Trasformazioni La moltiplicazione tra matrici NON è commutativa Quindi l’ordine delle trasformazioni È importante Composizione di Trasformazioni q = RTp q = TRp y y x Costruzione di Interfacce - Paolo Cignoni 19 Rotazione intorno ad un punto Costruzione di Interfacce - Paolo Cignoni 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 R = R x ( −θ x )R y ( −θ y ) R z (θ z ) R y (θ y )R x (θ x ) R p = T(p)R 0T(-p) trovare θ y θ x non è semplice… x Costruzione di Interfacce - Paolo Cignoni 21 Costruzione di Interfacce - Paolo Cignoni Shearing Nello Stato di OpenGL ci sono tre matrici 4x4 di trasformazioni ModelView Project Texture x′ = x + y cot θ y′ = y Una di queste e’ sempre la matrice corrente Tutte i comandi che modificano matrici fanno sempre riferimento alla matrice corrente z′ = z 0 0 0 0 1 0 0 1 Costruzione di Interfacce - Paolo Cignoni 22 OpenGL Sarebbe derivabile dalle altre… Lo spostamento e’ proporzionale alla coord y; 1 cot θ 0 1 H xy (θ ) = 0 0 0 0 20 Rotazione intorno ad un asse Si ottiene spostando tutto il sistema di riferimento nel punto, facendo la rotazione e rimettendo tutto a posto y x 23 Costruzione di Interfacce - Paolo Cignoni 24 4 Opengl OpenGl Per cambiare matrice Corrente glMatrixMode( *** ) Leggere una matrice glGetDoublev(GL_MODELVIEW_MATRIX,poi nter_to_matrix) Nota: nello scambio diretto di matrici OpenGL assume che siano memorizzate in column major order (e.g. per colonne) GL_MODELVIEW GL_PROJECTION GL_TEXTURE Per rimpiazzare la matrice glLoadIdentity() glLoadMatrix(Pointer to a matrix); a0 a 1 a2 a3 Tutti gli altri comandi modificano (moltiplicano per un altra matrice) la matrice corrente. Costruzione di Interfacce - Paolo Cignoni in gradi! 25 OpenGL a4 a8 a5 a9 a6 a10 a7 a11 a12 a13 a14 a15 Costruzione di Interfacce - Paolo Cignoni 26 Composizione di Matrici in Opengl I comandi opengl postmoltiplicano la matrice corrente per quella specificata Rotazioni glRotatef(angle, ax,ay,az); Traslazioni glTranslatef(dx,dy,dz); Scalature q = RTp Stato della matrice corrente dopo il comando a sinistra glRotate glTranslate I R RT y glScalef(sx,sy,sz) q = TRp I T TR glTranslate glRotate y Generica glMultMatrix(matrix_pointer) x Costruzione di Interfacce - Paolo Cignoni 27 Stack di matrici 28 Stack di Matrici La matrice corrente puo’ essere salvata in uno stack e recuperata successivamente glPushMatrix() glPopMatrix() Costruzione di Interfacce - Paolo Cignoni x Costruzione di Interfacce - Paolo Cignoni 29 Il Matrix Stack e’ particolarmente utile quando si disegnano scene strutturate // Whole car transformation // eg position of the car on the road glTranslate(CarPos) glRotate(CarDirection,0,1,0) For(i=0;i<4;++i) { glPushMatrix(); // relative single wheel position glTranslate(wheelpos[i]); DrawWheel(i); glPopMatrix(); } Costruzione di Interfacce - Paolo Cignoni 30 5 Trasformazioni Composizione di Matrici in Opengl Due trasformazioni vengono applicate ai vertici della geometria che voglio disegnare I comandi opengl postmoltiplicano la matrice corrente per quella specificata q = RTp glTranslate glScale Stato della matrice corrente dopo il comando a sinistra I T TS q = TRp glScale glTranslate y Trasformazione di Modellazione I S ST Porta la geometria nel sistema di riferimento standard della camera y Proiezione di vista Proietta la geometria dal sistema di riferimento della camera sul piano di proiezione. x Costruzione di Interfacce - Paolo Cignoni x 31 Elementi di base Costruzione di Interfacce - Paolo Cignoni 32 Prospettiva Classica Il problema è quello classico, da sempre affrontato, nell’arte, in architettura e della progettazione, di riuscire a riportare su di un piano, in maniera rigorosa un oggetto tridimensionale. Costruzione di Interfacce - Paolo Cignoni 33 Proiezioni ortografiche classiche 34 Proiezioni Assonometriche Piani di proiezione in posizione non vincolata: L’oggetto ha una struttura regolare, ben assimilabile ad un parallelepipedo; Proietto sui lati del box. Centro di proiezione, all’infinito, proiettori paralleli e perpendicolari al piano di proiezione Piano di proiezione: Simmetrico ai 3 assi (isometrica) Simmetrico rispetto a 2 assi (dimetrico) Posizione qualsiasi (trimetrica) Centro di proiezione, all’infinito, proiettori paralleli e perpendicolari al piano di proiezione Piano di proiezione perpendicolare agli assi del sistema di riferimento Costruzione di Interfacce - Paolo Cignoni Costruzione di Interfacce - Paolo Cignoni 35 Costruzione di Interfacce - Paolo Cignoni 36 6 Proiezioni Oblique Ortografica Proiettori paralleli ma non perpendicolari al piano di proiezione Costruzione di Interfacce - Paolo Cignoni 37 Proiezioni prospettiche Costruzione di Interfacce - Paolo Cignoni 38 Prospettiva classica Caratteristica principale: Al solito nella visione tradizionale del disegno tecnico si è soliti distinguere vari tipi di proiezione prospettica, indicando il numero di punti all’infinito (vanishing points); diminuzione della dimensione apparente degli oggetti all’aumentare della distanza dall COP. I proiettori passano tutti per il COP a) three vanishing points b) two vanishing points c) one vanishing points Caso Classico Il centro di proiezione simmetrico rispetto alla finestra nel piano di proiezione Caso generico, COP svincolato dal piano di proiezione Costruzione di Interfacce - Paolo Cignoni 39 Prospettiva Classica 40 Camera Frame In realtà questi, come nel caso ortogonali sono solo vincoli sul piazzamento del piano di proiezione One point Persp: Piano di proiezione parallelo ad uno dei piani del sistema di riferimento Two point Persp: Piano di proiezione perpendicolare ad uno dei piani del sistema di riferimento Three Point Persp: Piano di proiezione Libero Costruzione di Interfacce - Paolo Cignoni Costruzione di Interfacce - Paolo Cignoni 41 Si assume che la camera sia piazzata con il centro di proiezione sull’origine e diretta verso l’asse z negativo. È compito della matrice di Modellazione portare gli oggetti in questo frame. Questo sistema di riferimento è detto camera frame, o eye frame y z Costruzione di Interfacce - Paolo Cignoni x 42 7 Sistemi di coordinate in OpenGL Object: la ruota con l’origine nel centro. World: la ruota piazzata nel sistema di riferimento del mondo (e.g. quello classico con y = alto del mondo, ecc,). Cambia quando si muove la macchina Eye: Il sistema di riferimento in cui l’origine e’ il centro di proiezione, la z è la direzione di vista ecc. Cambia quando muovo l’osservatore. Clip Normalized device Window Costruzione di Interfacce - Paolo Cignoni 43 Piazzare la camera Costruzione di Interfacce - Paolo Cignoni 44 La camera (il centro di proiezione) è centrata in un punto detto VRP (view Reference Point) Il Piano di proiezione è perpendicolare ad un vettore VPN (view plane normal) 0 0 0 1 −?d 0 0 1 0 0 Del piano e’ necessario specificare anche l’orientamento, quindi Si specifica VUP (view up vector) 45 Piazzare la camera Costruzione di Interfacce - Paolo Cignoni 46 Camera axis in world space La trasformazione non e’ altro che un cambio di sistemi di riferimento. Basta definire gli assi e l’origine del un sistema di riferimento in termini dell’altro. Noi abbiamo la posizione della camera nel sistema di riferimento world Dobbiamo ancora esprimere gli assi del sistema di riferimento camera in sr World. Costruzione di Interfacce - Paolo Cignoni Matrice di trasformazione che fa parte delle matrici di modellazione Passa dalle coordinate di mondo alle coordinate di occhio Caso Generale Definire una camera significa definire una proiezione (prospettica) 1 0 Costruzione di Interfacce - Paolo Cignoni Come si specifica il sistema di riferimento della camera? Piazzare la camera Caso semplice, Voglio piazzare la camera in modo che inquadri oggetti centrati sull’origine (del sistema di riferimento mondo), guardando lungo la z negativa (come di default) E` solo una traslazione sull’asse z: 1 0 T= 0 0 Sistema di riferimento della Camera 47 Uno alla volta. L’asse z della camera e’ semplicemnte la direzione di proiezione, cioe’ la normale al piano di proiezione L’asse x della camera deve essere perpendicolare al vettore up e all’asse z appena trovato x = up × z L’asse y e’ semplicemente il prodotto vettore tra gli altri due assi che ho trovato (attenti al segno) y = z×x Costruzione di Interfacce - Paolo Cignoni 48 8 Cambio di Frame Dati due sistemi di riferimento. Cambio di Frame {v1, v2 , v3 , P0 } {u1, u2 , u3 , Q0 } u1 = γ 11v1 + γ 12 v2 + γ 13v3 Esprimiamo uno in termini dell’altro: Questo definisce la matrice 4x4 di cambiamento di frame La matrice di cambiamento di frame v1 u1 v u 2 = M 2 v3 u3 P0 Q0 u2 = γ 21v1 + γ 22v2 + γ 23v3 u3 = γ 31v1 + γ 32 v2 + γ 33v3 Q0 = γ 41v1 + γ 42v2 + γ 43v3 + P0 γ 11 γ M = 21 γ 31 γ 41 Costruzione di Interfacce - Paolo Cignoni γ 12 γ 22 γ 32 γ 42 γ 13 γ 23 γ 33 γ 43 0 0 0 1 Date le due rappresentazioni a,b in coordinate omogenee in differenti frame (sia di un vettore che di un punto), vale: v1 v1 u1 v v u 2 2 T T 2 ⇒ a = MT b b =a =b M v3 v3 u3 Costruzione P0-Paolo Cignoni P0 di Interfacce Q0 T 49 50 Eye to World Noi abbiamo Camera e suoi parametri in coordinate di mondo. Vogliamo trovare la trasf M che prenda la rappresentazione di un punto pw in coordinate omogenee spazio di mondo e ne dia la sua rappresentazione in coordinate di camera pe. Esprimo il sistema di riferimento della camera in termini dello spazio di mondo Costruzione di Interfacce - Paolo Cignoni Costruzione di Interfacce - Paolo Cignoni p e = Mp w {u, v, n, P0 } {x, y, z,0} p w = Mp e u = ux x + u y y + uz z ux u M= y n = nx x + n y y + nz z uz P0 = p x x + p y y + pz z + 0 0 v = v x x + v y y + vz z 51 World to eye Per invertirla si nota che la possiamo scrivere come un prodotto tra Rot e Tras nx vy vz ny nz 0 0 px 1 0 py = TR = pz 0 1 0 0 0 1 0 0 1 0 0 px ux p y u y pz u z 1 0 Costruzione di Interfacce - Paolo Cignoni 0 0 px py pz 1 52 Invertire Traslazioni e rotazioni è facile… da world a eye vx nx ny nz World to Eye A noi serve la matrice inversa: u x u M= y uz 0 vx vy vz vy nx vy vz ny nz 0 0 M = (TR ) −1 0 0 0 1 53 −1 u x v =R T = x n x 0 −1 u x v x n x 0 −1 uy vy uz vz ny 0 nz 0 uy uz vy ny vz nz 0 0 0 1 0 0 0 0 1 0 0 0 − px 1 0 − py = 0 1 − pz 0 0 1 − p x u x − p y u y − pz uz − p x v x − p y v y − pz vz − p x n x − p y n y − pz nz 1 Costruzione di Interfacce - Paolo Cignoni 54 9 In opengl Matrici di Proiezione Prospettica Grazie al cielo in opengl tutto ciò è ben semplice gluLookAt( eyex, eyex, eyex, atx,aty,atz, upx,upy,upz); Definisce la trasformazione che porta dallo spazio di mondo allo spazio di eye; NOTA bene la gluLookAt va nella ModelView Matrix Assunto che siamo nel sistema di riferimento della camera con il centro di proiezione nell’origine, e il piano di proiezione a distanza d lungo l’asse -z Vogliamo trovare la proiezione ( x p , y p , z p ) sul piano di proiezione di un punto ( x, y , z ) Costruzione di Interfacce - Paolo Cignoni 55 Proiezione Prospettica Estendiamo la nostra def di coordinate omogenee dicendo che un punto p può essere rappresentato come wx wy p= con w ≠ 0 wz w Un punto in 3D corrisponde ad una linea in 4d. Posso Sempre recuperare la forma con 1 come quarto elemento Posso fare matrici che modificano il quarto elemento. x xp = z d x z/d yp = y z/d Nota che questa trasformazione non è lineare, né affine, né reversibile. Costruzione di Interfacce - Paolo Cignoni 57 Coordinate Omogenee Costruzione di Interfacce - Paolo Cignoni 58 Proiezione prospettica in opengl In particolare possiamo definire la matrice x 1 0 0 0 x x z/d 0 1 0 0 y y y ≈ M= p= q = Mp = 0 0 1 0 z z z/d d 0 0 1 / d 0 1 z / d 1 Che effettua la trasformazione prospettica, purchè si normalizzi dividendo per la quarta componente Costruzione di Interfacce - Paolo Cignoni 56 Coordinate Omogenee Si ottiene che: xp = Costruzione di Interfacce - Paolo Cignoni 59 Finora abbiamo definito solo l’operazione di proiezione. Per definire una camera dobbiamo anche definire il view volume Angle of view Near and far clipping planes Costruzione di Interfacce - Paolo Cignoni 60 10 Proiezione prospettica in opengl Proiezioni Ortogonali Caso particolare di proiezione parallela in cui le linee di proiezione sono perpendicolari al view plane La proiezione è semplicemente glFrustum(xmin,xmax,ymin,ymax,near,far); gluPerspective(fov,aspect,near,far) -far -near xp = x -far yp = y zp = 0 x p 1 y 0 p = z p 0 1 0 -near Costruzione di Interfacce - Paolo Cignoni 61 Proiezioni Ortogonali in OpenGL glOrtho(xmin,xmax,ymin,ymax,near,far); I clipping planes sono a z= -near e z=-far Costruzione di Interfacce - Paolo Cignoni 62 Hidden Surface Removal Si deve disegnare sul frame buffer solo quelle porzioni di primitive che sono davanti a tutte le altre; esistono numerosi algoritmi Tecnica Zbuffer, per ogni pixel dello schermo memorizzo la minima distanza dal centro di proiezione disegnata in quel pixel. Quando rasterizzo, disegno (e aggiorno lo zbuffer, solo se davanti. -far -far -near -near Costruzione di Interfacce - Paolo Cignoni 0 0 0 x 1 0 0 y 0 0 0 z 0 0 0 1 63 Window e Device coords Costruzione di Interfacce - Paolo Cignoni 64 Normalized Device Coord In Opengl si distingue tra Normalized Device (screen) Coords In Opengl Perspective Transf + division Convertono a Normalized Device Coord La geometria è quindi clippata sul Canonical View Volume Sono 3d e mantengono la depth Window Coord Sono 2d. x = ±1 y = ±1 z = ±1 Costruzione di Interfacce - Paolo Cignoni 65 Costruzione di Interfacce - Paolo Cignoni 66 11 Mapping the view volume Esempio tipico Un app carica/genera un oggetto in un suo sistema di riferimento e lo vuole far vedere. Sul Canonical view Volume, In questo caso la proiezione ortografica diventa 2 x − x min max 0 0 0 0 0 2 y max − y min 0 − 0 0 2 far − near 0 xmax + xmin xmax − xmin y + ymin − max y max − y min far + near − far − near − (1,1,-1) Calcolare il bbox dell’oggetto. Spostare l’oggetto nell’origine Scalare l’oggetto fino alla dimensione desiderata che sia compatibile con le dim del mio volume di vista traslare l’oggetto nel volume di vista (-1,-1,1) Costruzione di Interfacce - Paolo Cignoni 67 Costruzione di Interfacce - Paolo Cignoni 68 Esempio tipico L’ordine delle cose deve essere quello giusto glMatrixMode (GL_PROJECTION); glLoadIdentity (); gluPerspective(ViewAngle,1,.1,10); glMatrixMode (GL_MODELVIEW); glLoadIdentity (); glTranslatef(0,0,-4); float d = 2.0/m.bbox.Diag(); glScalef(d, d, d); glTranslate(-m.bbox.Center()); DrawMyObject(); Costruzione di Interfacce - Paolo Cignoni 69 12