|
|
|
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
sul piano di proiezione di un punto |
|
|
|
|
Si ottiene che: |
|
|
|
|
|
|
|
|
|
Nota che questa trasformazione non è lineare, né
affine, né reversibile. |
|
|
|
|
Estendiamo la nostra def di coordinate omogenee
dicendo che un punto p può essere rappresentato come |
|
|
|
|
|
|
|
|
|
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. |
|
|
|
|
|
|
In particolare possiamo definire la matrice |
|
|
|
|
|
|
|
|
|
|
|
Che effettua la trasformazione prospettica,
purchè si normalizzi dividendo per la quarta componente |
|
|
|
|
|
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 |
|
|
|
|
glFrustum(xmin,xmax,ymin,ymax,near,far); |
|
gluPerspective(fov,aspect,near,far) |
|
|
|
|
Caso particolare di proiezione parallela in cui
le linee di proiezione sono perpendicolari al view plane |
|
La proiezione è semplicemente |
|
|
|
|
|
|
glOrtho(xmin,xmax,ymin,ymax,near,far); |
|
I clipping planes sono a z= -near e z=-far |
|
|
|
|
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. |
|
|
|
|
|
|
|
In Opengl si distingue tra |
|
Normalized Device (screen) Coords |
|
Sono 3d, quel che si vede e’ nel canonical view
volume. |
|
Window Coord |
|
Sono sempre
3d, ma con x,y espresse in pixel, e la z in [0,1]; |
|
|
|
|
In Opengl Perspective Transf + division
Convertono a Normalized Device Coord |
|
La geometria è quindi clippata sul |
|
Canonical View Volume |
|
|
|
|
|
|
|
|
|
|
Sul Canonical view Volume, |
|
In questo caso la proiezione ortografica diventa |
|
|
|
|
Anche le trasf prospettiche mappano sul
canonical view volume |
|
In questo caso l’applicazione della matrice di
proiezione prospettica distorce la scena in maniera tale da introdurre il
rimpicciolimento prospettico. |
|
|
|
|
Il passaggio da normalized device coords a
window coord. è gestito dalla viewport transformation |
|
|
|
|
In opengl il passaggio da Normalized Device
(screen) Coords a window coord e’ controllato dal comando |
|
glViewport(x,y,w,h) |
|
x,y
origine del lower left corner della finestra |
|
w,h dimensioni in pixel della finestra |
|
|
|
Nota in effetti anche la z puo’ essere mappata
in un range diverso (ma sempre incluso) da [0,1] |
|
glDepthRange(znear, zfar) |
|