M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 1 4 / 1 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Transform
x
y
z v
0v
1v
2 world Coordinates1) transformazione di vista 2) transformazione di proiezione 3) transformazione di viewport
y 2
-z v
0v
1v
2view Coordinates (a.k.a. eye Coordinates)
y x -z v
0v
1v
2v
0v
2v
1v
0v
1v
2 screen Space3
“Clip”
Coordinates
1
1 -1
-1 x
x
y
z v
0v
1v
2 object Coordinates0) transformazione di modellazione
0
1
z Object Coordinates
• Dare ad ogni oggetto il suo sistema di coordiante privato:
il suo Object Coordinates;
y
y y
y x
x x
x
z
z
z
z
y
x
Es: scene graph
«Spazio Mondo»
T1 T2 T3 T4
Object Coordinates
• Dare ad ogni oggetto il suo sistema di coordiante privato:
il suo Object Coordinates;
• Durante il transform, prima di tutto
portare ogni oggetto nello sist di coordinate comuni:
da Object Coordinates a World Coordiantes
– consente di riutilizzare lo stesso modello più volte nella stessa scena – ogni istanza: stesse Object Coordinates dei vertici,
ma una trasformazione (di "modellazione") diversa per arrivare a World Coordinates diverse
– Es: ruote di una macchina (4 volte l'istanza di una ruota)
alberi, case, sedie in una stanza, pedoni su una scacchiera, etc, etc, etc
Object Space (analogo in 2D)
• spazio oggetto
1
spazio oggetto (“spazio macchina”) origine
odello
spazio oggetto
x y
-1 2 3 -2
-3
assi
xe y dello spazio oggetto
1 2 3
-1 -2 -3
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 1 4 / 1 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Object Coordinates (analogo in 2D)
• coordinate oggetto
1.5
2.3 p = (1.5, 2.3)
spazio oggetto (“spazio macchina”)
coordinate di
pin spazio oggetto
x y
vec2 x( 1.5 , 2.3 );
. . .
Object Coordinates (analogo in 2D)
• coordinate mondo
1.5 2.3
p = (1.5, 2.3)
spazio oggetto (“spazio macchina”)
coordinate di
pin spazio oggetto
x y
x y
spazio mondo
= (12.5, 8.1) 8.1
12.5
coordinate di
pin spazio mondo
1 1
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 1 4 / 1 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Object Coordinates
1.5 2.3
p = (1.5, 2.3)
spazio oggetto (“spazio macchina”)
coordinate di p in spazio oggetto
x y
x y
spazio mondo
= (12.5, 8.1) 8.1
12.5
coordinate di p in spazio mondo
1 1
11 5.8
=
1 0 . 0
1 . 8
5 . 12
1 0 . 0
3 . 2
5 . 1
1 0 0 0
0 . 0 1 0 0
8 . 5 0 1 0
11
0
0
1
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 1 4 / 1 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Transformazione di Modellazione
x
y
z v
0v
1v
2 world Coordinates1) transformazione di vista 2) transformazione di proiezione 3) transformazione di viewport
y 2
-z v
0v
1v
2view Coordinates (a.k.a. eye Coordinates)
y x -z v
0v
1v
2v
0v
2v
1v
0v
1v
2 screen Space3
Normalized Device Coordinates
1
1 -1
-1 x
x
y
z v
0v
1v
2 object Coordinates0) transformazione di modellazione
0
1
Scene composite (gerarchicamente)
sist coord macchina
sist coord
ruota
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 1 4 / 1 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Rendering di scene composite
spazio mondo (globale) spazio oggetto ruota 1 spazio oggetto automobile
Scene graph
V
M
0M
1M
2M
3M
4M
5M
6posizonamento della automobile
(rispetto al mondo) posiz. della
ruota (rispetto
all’
automobile)
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 1 4 / 1 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Scene graph
V
M
0M
1M
2M
3M
4M
5M
6spazio mondo spazio
vista
spazio auto 1
spazio
auto 2 spazio
auto 3
spazio
ruota A spazio ruota B
spazio
ruotaC spazio ruotaD M
0· M
3Settare la matrice di model view
/* globals (the current “state”) */
mat4 mv; // current model-view matrix (the “state”) ...
void draw( Mesh x ) // nb: using the global mv, p, etc /* draw scene */
mv = V; // V = view matrix
draw( track ); // assuming track object space // is also object space
mv = V * M0 ;
draw( car_chassis );
mv = V * M0 * M3;
draw( wheel );
mv = V * M0 * M4;
draw( wheel );
...
come ottimizzare e razionalizzare?
(soprattutto il numero di matix molt?)
Settare la matrice di model view
• Idea: navigare l’albero della scena depth first (scene graph)
– init: model-view = view
– seguendo i link da padre a figlio:
• cumulare la matrice di modellaz. associata (molt. a DESTRA)
– tornando al padre:
• ripristinare la matrice (come?...)
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 1 4 / 1 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Stack di matrici di model-view!
I · V M
I · V · M 0
I·V·M 0 ·M 3
Stack di matrici di model-view!
• Matrice in testa allo stack = model-view corrente
• Operazioni che servono : (es. in un API / una lib)
1. sovrascrivere identità nella matrice in testa
• x inizializzazione!
2. moltiplicare matrice-in-testa per 1 matrice data
• nb: si moltiplica a destra: M
[top]= M
[top]* M
new• dunque: “ultima cosa che faccio, 1ma cosa che avviene”
3. push : replicare matrice in testa in nuovo livello)
• x quando scendo di un livello!
• “salva la matrice corrente”
4. pop : scartare la matrice in testa
• x quando salgo di livello!
• “recupera l’ultima matrice salvata”
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 1 4 / 1 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Scene graph
V
M
0M
1M
2M
3M
4M
5M
6setIdentity mult(V) push
mult(M0)
draw( car , red);
push
mult(M3)
draw( wheel );
pop push
mult(M4)
draw( wheel );
pop
… pop push
mult(M1)
drawMacchina(Green);
… pop mult(Traslaz…)
mult(Rotaz…)
mult(Scale…)
oppure molte, per es
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 1 4 / 1 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Un trucco
M
0M
1M
2M
3M
4M
5M
6M
9photocamera montata sull’automobile
posizonamento della camera (rispetto all’automobile)
spazio mondo
Un trucco
V
M
0M
1M
2M
3M
4M
5M
6M
9photocamera montata sull’automobile
posizonamento della camera (rispetto all’automobile)
spazio mondo spazio
vista
= ( M
2M
9)
-1= M
9-1M
2-1Un trucco
la trasformaz di modellazione necessaria per piazzare un oggetto in una certa pos
è l’inversa
della trasformaz di vista necessaria per piazzare la camera in quella pos
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 1 4 / 1 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Un altro modo ancora
per definire la matrice di vista una semplice “Trackball”:
phi theta
z -x
y
Un semplice esempio di trackball
• Interfaccia base per selezionare un punto di vista
• Due angoli (phi e theta) + distanza (ro) – (es mappati su assi X Y mouse + mousewheel)
• Utile per visualizzare un piccolo oggetto – permettere alla camera di ruotargli intorno
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 1 4 / 1 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
setIdentity
mult( translation(0,0,-ro) ) mult( rotationX (-theta) ) mult( rotationY (-phi) )
Next: trasformazione di proiezione
z
y
x v
0v
1v
21
1) transformazione di vista 2) transformazione di proiezione 3) transformazione di viewport
y
-z v
0v
1v
2view Coordinates
y -x -z v
0v
1v
2v
0v
2v
1v
0v
1v
2 screen Space3
Clip
1
1 -1
-1 x
z
y
x v
0v
1v
2 object Coordinates0
0) transformazione di modellazione
2
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 1 4 / 1 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Trasformazione di proiezione
• Prima o poi dovremo farlo: da 3D a 2D !
y 2
-z v
0v
1v
2view Coordinates (a.k.a. eye Coordinates)
y x -z v
0v
1v
2v
0v
2v
1Clipcoordinates
1
1 -1
-1 x
Nota:
solo per i punti! (es. i vertici dei triangoli) non per i vettori (es. le normali dei triangoli) Le normali si possono “fermare” allo spazio vista (o anche solo mondo)
( cmq lo spazio in cui che saranno utilizzate, vedi lighting dopo)
Trasformazione di proiezione
• Vecchio problema:
– (in arte, architettura progettazione)
• come riportare – oggetti 3D – su un
piano 2D
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 1 4 / 1 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Spazio “clip”
• X e Y: da -1 a +1
– indipendentemente da dimensioni / proporzioni del viewport – X = -1 bordo sx X = +1 bordo dx
– Y = -1 bordo inf Y = +1 bordo sup – origine: centro del’immagine renderizzata I – se un punto ha una coord X o Y al di fuori
di [-1, +1] => non è nel quadro
• (vedremo, vale anche per la Z)
• Oggetto (o primitiva) solo parzialmente nel viewport:
«clip» it !
– andrà spezzata in una parte da mostrare, e una no – da cui il nome dello spazio
• Modo 1:
– da 3D a 2D? facile: ignoriamo la z (per ora) – per la x e y uno zoom factor k
= 1/raggio della scena che vogliamo inquadrare – matrice corrisponente:
Trasformazione di proiezione
=
1 0 0 0
0 1 0 0
0 0 0
0
0
0
k
k
P Z
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 1 4 / 1 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Trasformazione di proiezione
• E' una proiezione ortogonale
– non c'è prospettiva – simula:
• il punto di vista all'infinito
• con un cannocchiale mooolto potente
• lunghezza focale infinita
– direzioni di vista costanti su tutta la scena
Trovare le differenze...
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 1 4 / 1 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Trovare le differenze...
Come si svolge fisicamente il processo:
• Occhio o macchina fotografica il concetto è lo stesso:
lenti
CCD o pellicola
(2D screen buffer)
lenti
retina
(2D screen buffer)
distanza
focale distanza
focale
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 1 4 / 1 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Nostro modello semplificato:
• pin-hole camera
distanza focale
-x y
-z image
plane
Parametri intrinseci della camera:
(quelli principali)
• dim image plane ( w , h ) (per ora: 2,2)
• distanza focale ( d ) oppure angolo Field of View ( FoV )
– (come ottenere uno dall’altro?)
– d si usa nei conti, ma FoV è intuitivo da settare, :
• FoV grande >60° (dist foc. piccola): «grandangolo»
• FoV piccolo <45° (dist foc. grande): «teleobiettivo»
distanza focale d
w
h Field of View (verticale)
(angolo)
Pin Hole camera
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 1 4 / 1 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
per semplicità, immaginiamoci il piano immagine davanti alla camera (e nn ribaltato), piuttosto che·· dietro (e ribaltato).
(cioe’ sul piano z = - d ) (in spazio vista!)
Matematicamente
y
-z
distanza focale d
image plane
centro di proiezione (origine)
x
) , , ( x y z
) , , ( x
py
pz
p
=
z y x k z y x
p p p
Nota:
non è lineare né affine;
non è reversibile.
non mantiene: rapporto fra distanze colineari
con k t.c. z
p= − d
z d k = − /
quindi…
−
⋅
−
⋅
−
=
d z y d
z x d
z y x
p p p
/ /
e
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 1 4 / 1 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Nostro modello semplificato:
nota: niente lenti – non modellandole,
ci siamo giocati (per ora) i "difetti" delle lenti:
• range di fuoco finito
• flares
• distorsioni radiali
Estendiamo la rappresentazione di punti e vettori in coordinate omogenee
= 1 z y x p
= 0 z y x v r
Punti: Vettori:
1 0
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 1 4 / 1 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Rappresentazione di punti e vettori in coordinate omogenee
=
* z y x p
= 0 z y x v r
Punti: Vettori:
!=0 0
Estendiamo la notazione
• Esprimo i punti anche con la notazione
0
con ≠
= w
w wz wy wx p
w wz wy wx
1 z y x
divisione per 4ta comp
anche detta
normalizzazione affine
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 1 4 / 1 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Estendiamo la notazione
• Per es:
10 30 10 20
1 3 1 2
1 . 0
3 . 0
1 . 0
2 . 0
2 6 2
4 sono alcune
coordinate omogene equivalenti del punto che ha le seguenti
coordinate cartesiane
3 1 2
0 3 1
2 sono le
coordinate omogene del vettore che ha le
seguenti
coordinate cartesiane
3 1 2
…
punto
vettore queste
sono in
“forma normale”
( w = 1 )
Coordinate omogenee di punti
• Il punto P di coordinate cartesiane (x,y,z) è rappresentato in coordinate omogenee
come (xw,yw,zw , w), con w qualunque (ma non 0)
• Set di coordinate omogenee diversi (x, y, z, w) e (x′, y′, z′, w′) possono rappresentare lo stesso punto;
– [quando?]
• Quando w = 1 (forma canonica ) le coord cartesiane del punto coincidono con le prime tre coord omogenee.
• Con (x, y, z, w ≠ 0) si rappresentano punti , con (x, y, z, 0) si rappresentano vettori.
• Nota: tutte le matrici di trasformazione viste fin’ora funzionanto
anche con questa notazione generalizzata! Es: VERIFICA.
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 1 4 / 1 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Proiezione prospettica
−
=
0 / 1 0 0
0 1 0 0
0 0 1 0
0 0 0 1
d P
−
=
d z
z y x
z y x
/ 1
P
−
−
−
1 / /
d d z
y d z
x
divisione per 4ta comp
matrice di trasformazione per la
proiezione prospettica
In realtà.
la 3 e 4 si lasciano invariate…
i valori (originali) ci saranno utili !
In realtà non si scarta la terza dimensione:
ci servirà
y P
-z v
0v
1v
2view Coordinates (a.k.a. eye Coordinates)
x no rm al iz za zi on e af fin e
y
z
x
clip space [ancora 3D!]
un bel CUBO!
Moltiplicazione per la matrice di
proiezione
La parte visibile casca in [-1,1] x [-1,1] x [-1,1]
quindi dette anche
"Normalized Device
Coordinates"
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 1 4 / 1 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Proiezione Prospettica: che effetto fa
Proiezione Prospettica: che effetto fa
d infinito (diventa una proiezione ortogonale)
d piccolo d grande
−
=
0 / 1 0 0
0 1 0 0
0 0 1 0
0 0 0 1
d P
Più distorsione prospettica.
Effetto "fish-eye"
(grandangolo)
Proporzioni più mantenute Effetto "zoom"
(eg. vista dal
satellite)
Dettaglio tecnico
• Il rasterizzatore: (comportamento fisso)
– prende vertici in clip coordinates
– produce frammenti a una data screen coordinates
• cioè le «in pixel», e.s. in [0..539] x [0..479]
– applica cioè la trasf di viewport automaticamente (e, prima, anche la div per w )
quindi:
• Il vertex processor (programmabile!)
– deve produrre clip coordiantes del vert. processato (anche non in forma normale, w !=1)
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 1 4 / 1 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Next: trasformazione di proiezione
x
y
z v
0v
1v
21
1) transformazione di vista 2) transformazione di proiezione 3) transformazione di viewport
y
-z v
0v
1v
2view Coordinates
y x -z v
0v
1v
2v
0v
2v
1v
0v
1v
2 screen SpaceClip
1
1 -1
-1 x
x
y
z v
0v
1v
2 object Coordinates0
0) transformazione di modellazione
2
3
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 1 4 / 1 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a
Dettaglio tecnico
fra m m en ti (c ia sc un o co n sc re en c oo rd .)
Ve rti ci de lla m es h pixel
finali
(nello screen-buffer)
Ve rti ci pr oi et ta ti (c lip c oo rd s! )
Z
rasterizer triangoli
co m pu ta zi on i pe r f ra m m en to
z
y
x v
0v
1v
2v
0v
1v
2rasterizer segmenti rasterizer
punti
co m pu ta zi on i pe r v er tic e
OBJECT
COORDS CLIP
COORDS SCREEN
COORDS
Trasformazione di viewport
• Clip frame: (-1 , +1) x (-1 , +1)
– quadrato!
• Viewport: [ 0..resX ] x [ 0..resY ]
– rettangolare!
• Trasf. Viewport (automatica, nel rasterizz)
– scaling NON uniforme – (e traslazione)
quindi:
• per mantenere l’ aspect ratio bisogna includere
nel passaggio precedente (la proiezione!)
uno scaling NON uniforme (in verso opposto)
M a r c o T a r i n i ‧ C o m p u t e r G r a p h i c s ‧ 2 0 1 4 / 1 5 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a