Controllare la prospettiva Daniele Marini 1 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 2 I parametri di controllo • • • • • • • PRP Projection Reference Point (COP) View Plane VPN View Plane Normal VUP View UP DOP Direction of Projection VRP View Reference Point CW center of the window 3 Orientare il piano di proiezione 4 Definire la viewport e la window 5 Definire il centro di proiezione 6 Se la proiezione è parallela 7 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 8 Altri schemi • Lo schema illustrato è tipico delle librerie PHIGS, GKS 3D • OpenGl offre un altro approccio: lookAt • Nei simulatori di volo si adotta lo schema “roll, pitch, yaw” 9 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 gluLookAt(eyex, eyey, eyez, aty, atx, atz, upx, upy, upz); 10 11 Roll, pitch, yaw 12 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 13 Dalle coordinate omogenee allo spazio 3D x xp z/ d y yp z /d z zp d z/d 14 Matrice canonica di trasformazione 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 15 Angolo di visione e frustum 16 Funzioni di OpenGL glFrustum(xmin, xmax, ymin, ymax, near, far); gluPerspective(fovy, aspect, near, far); Aspect = larghezza/altezza della window Fov: 17 Funzioni di OpenGL - proiezione parallela glOrtho(xmin, xmax, ymin, ymax, near, far); near e far possono essere anche negativi: non c’e’ divisione per 0 18 Proiezione parallela generica • 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 19 glOrtho(xmin, xmax, ymin, ymax, near, far); 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 20 • 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 21 Proiezioni parallele oblique q,f Angoli del fascio di proiettori con la normale al piano di proiezione 22 Trasformazione di shear 1 0 H 0 0 0 1 0 0 0 cot f 0 1 0 0 1 cot q P MorthoSTH(q , f ) 23 Prospettiva generica • Creare la matrice di normalizzazione • Deformare lo spazio • Proiettare in modo ortografico 24 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 Ai punti trasformati occorre applicare la divisione 25