Controllare la prospettiva Daniele Marini 1 Calcolo analitico y P(x,y,z) Centro di proiezione P(xv,yv) z x Piano di proiezione 2 ... in sezione ... y P(x,y,z) yv Centro di proiezione z d Piano di proiezione y/yv = z/d yv = y/(z/d) x/xv = z/d xv = x/(z/d) 3 Frames • Il frame è un contesto di: – sistema di riferimento – e 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 4 Camera frame • Quasi tutti gli ambienti e le librerie adottano 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 • L’obiettivo non è modellato (foro stenopeico) • 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 o uscente dalla macchina fotografica 5 6 Prospettiva canonica • Camera frame orientato come il world frame • Asse ottico coincidente con asse z, entrante nell’obiettivo • Per portare una scena nella configurazione canonica è necessaria una catena di trasformazioni da applicare conoscendo i parametri principali 7 I parametri di controllo • PRP Projection Reference Point o COP Center of Projection • View Plane • VPN View Plane Normal • VUP View UP • DOP Direction of Projection (per le proiezioni parallele) • VRP View Reference Point • CW center of the window 8 Orientare il piano di proiezione 9 Definire la viewport e la window 10 Definire il centro di proiezione 11 Se la proiezione è parallela 12 Trasformazioni normalizzate • Dati VPN, VUP si ottiene la view orientation matrix V • La forma della V è: V=TR con T traslazione nel VRP, R rotazione opportuna per orientare la view rispetto alla configurazione canonica 13 Matrice canonica di trasformazione prospettica 1 0 M 0 0 0 0 0 1 0 0 1/d 0 x x y y p * M q z z 1 z / d 0 1 0 0 14 Dalle coordinate omogenee allo spazio 3D x xp z/ d y yp z /d z zp d z/d 15 Matrice canonica di proiezione parallela ortogonale 1 0 M 0 0 0 1 0 0 0 0 0 0 0 0 0 1 x x y y p * M q z 0 1 1 16 Funzioni di OpenGL - proiezione parallela ortogonale glOrtho(xmin, xmax, ymin, ymax, near, far); near e far possono essere anche negativi: non c’e’ divisione per 0 17 • Trasla origine del view volume nell’origine del view volume canonico • Riscala il view volume • P è la matrice di proiezione • zmax = far • zmin = near • completata la trasformazione si può chiamare la glOrtho 18 glOrtho(xmin, xmax, ymin, ymax, near, far); traslazione al centro del view volume scalatura 2 xmax xmin 0 P ST 0 0 0 0 2 ymax ymin 0 0 0 2 zmax zmin 0 xmax xmin xmax xmin ymax ymin ymax ymin zmax zmin zmax zmin 1 19 Proiezioni parallele oblique q,f Angoli del fascio di proiettori con la normale al piano di proiezione y DOP x z 20 Proiezioni parallele oblique • orientare la direzione di proiezione in modo che sia parallela a z, con trasformazione di shear controllata dagli angoli q,f • rinormalizzare il view volume con scala e traslazione (come sopra) • proiettare con la matrice ortografica 21 Trasformazione di shear e proiezione parallela ortogonale 1 0 H 0 0 0 1 0 0 0 cot f 0 1 0 0 1 cot q P MorthoSTH(q , f ) 22 Proiezione parallela generica • Deformare il volume con shear per condursi a ortogonale • Ricondursi alla configurazione canonica: normalizzazione – Convertire il volume di vista in una configurazione standard: costruzione della matrice di proiezione: opera in “window coordinates” (comprendono z) – Proiettare il volume deformato • Il volume canonico per la proiezione parallela è normalizzato in -1,+1 23 Angolo di visione e frustum 24 Funzioni di OpenGL glFrustum(xmin, xmax, ymin, ymax, near, far); gluPerspective(fovy, aspect, near, far); Aspect = larghezza/altezza della window Fov: 25 Prospettiva generica • Metodo della projection normalization – Creare la matrice di normalizzazione – Deformare lo spazio – Proiettare in modo ortografico 26 Prospettiva generica (cont) • Si suppone di proiettare in modo canonico con la distanza del centro di proiezione d=-1 lungo l’asse z • la matrice Mpersp diventa: 1 0 M persp 0 0 0 0 1 0 0 1 0 1 0 0 0 0 27 Prospettiva generica (cont) • applichiamo a un punto la matrice non singolare N (simile a Mpersp) 1 0 N 0 0 0 0 0 0 1 0 x' x; y' y; z' z ; w' z x y x" ; y" ; z" z z z 0 1 0 0 28 Prospettiva generica (cont) • dobbiamo determinare , • assumiamo un angolo di visione di 90° • quindi i piani di clipping laterali sono: x=+-z y=+-z • dopo la trasformazione i piani diventano: x=+-1 y=+-1 • i piani di clipping frontale e di sfondo siano: zmin<zmax<0 • vogliamo imporre che siano in -1 e +1 per avere il volume canonico 29 Prospettiva generica (cont) • zmin e zmax dopo la trasformazione diventano: z"min zmin z"max z max se poniamo zmax z min 2z max zmin ; zmax zmin zmax zmin i piani di clipping vengono trasformati in : zmin 1 zmax 1 30 Prospettiva generica (cont) la matrice N viene chiamata matrice di normalizzazione prospettica 1 0 N 0 0 0 0 1 0 zmax zmin 0 zmax zmin 0 1 P Mortho N 1 0 Mortho 0 0 0 1 0 0 0 0 0 0 0 0 zmax * zmin 2 zmax zmin 0 0 0 0 1 31 Prospettiva generica (cont) • se il frustum non fosse simmetrico e a 90° ci si può ricondurre a questo caso con una trasformazione di shear 32 Altri schemi • Lo schema illustrato è tipico delle librerie PHIGS, GKS 3D • OpenGl offre anche un altro approccio: lookAt • Nei simulatori di volo si adotta lo schema “roll, pitch, yaw” 33 LookAt • E’ un metodo più diretto e più naturale: – la camera è localizzata in un punto e (eypoint - o punto di vista) specificato nel world frame – La camera è orientata nella direzione individuata dal vettore congiungente e con il punto a (at point - punto osservato) • I punti e ed a individuano il VRP e la VPN • Gli ultimi tre parametri identificano il VUP gluLookAt(eyex, eyey, eyez, aty, atx, atz, upx, upy, upz); 34 35 Roll, pitch (head), yaw 36