Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica aa 2005/2006.

40
Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica aa 2005/2006

Transcript of Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica aa 2005/2006.

Page 1: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica aa 2005/2006.

Controllare le proiezioni

Daniele Marini

Corso Di Programmazione Grafica aa 2005/2006

Page 2: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica aa 2005/2006.

Programmazione Grafica aa2005/2006 2

2 tipi principali

• Proiezioni parallele:– Centro di proiezione all’infinito

• Proiettori ortogonali oppure• Proiettori obliqui• Proiezioni multiple (più viste)• Proiezioni a una sola vista

– Assonometrie– Cavaliera o Cabinet

• Proiezioni prospettiche– Centro di proiezionie a distanza finita

• Un solo punto di fuga: prospettiva centrale• 2 o 3 punti di fuga: prospettiva accidentale

Page 3: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica aa 2005/2006.

Programmazione Grafica aa2005/2006 3

Frames

• Il frame è un contesto di:– sistema di riferimento – e trasformazioni geometriche associate

• Consideriamo questi due frame:– 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

Page 4: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica aa 2005/2006.

Programmazione Grafica aa2005/2006 4

Sistemi di riferimento

World frame

Camera frame

Page 5: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica aa 2005/2006.

Programmazione Grafica aa2005/2006 5

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

Page 6: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica aa 2005/2006.

Programmazione Grafica aa2005/2006 6

Page 7: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica aa 2005/2006.

Programmazione Grafica aa2005/2006 7

Prospettiva canonica

• Camera frame orientato come il world frame

• Asse ottico coincidente con asse z, entrante nell’obiettivo

• Piano di proiezione coincidente con il piano x,y

• Per portare una scena nella configurazione canonica è necessaria una catena di trasformazioni da applicare conoscendo i parametri principali

Page 8: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica aa 2005/2006.

Programmazione Grafica aa2005/2006 8

Proiezione generica - 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

Page 9: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica aa 2005/2006.

Programmazione Grafica aa2005/2006 9

Orientare il piano di proiezione

Page 10: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica aa 2005/2006.

Programmazione Grafica aa2005/2006 10

Definire la viewport e la window

Page 11: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica aa 2005/2006.

Programmazione Grafica aa2005/2006 11

Definire il centro di proiezione

(COP)

Page 12: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica aa 2005/2006.

Programmazione Grafica aa2005/2006 12

Se la proiezione è parallela

Page 13: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica aa 2005/2006.

Programmazione Grafica aa2005/2006 13

Proiezioni parallele

• Si azzera la componente z• Tutta la difficoltà della proiezione parallela consiste nell’orientare correttamente il modello rispetto al piano di proiezione

Page 14: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica aa 2005/2006.

Programmazione Grafica aa2005/2006 14

• Dati VPN, VUP si ottiene la view view orientation matrixorientation matrix V

• La forma della V è: V=TR • T è la traslazione nel VRP, • R è una rotazione opportuna per orientare la view rispetto alla configurazione canonica

• Con queste trasformazioni ci si porta nella configurazione canonica

Trasformazioni normalizzateTrasformazioni normalizzate

Page 15: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica aa 2005/2006.

Programmazione Grafica aa2005/2006 15

Costruzione della matrice di orientamento

di vista V• Definiamo posizione e orientamento della proiezione nel riferimento world

• Supponiamo di avere (in 4d):• VRP(x,y,z,1)• VPN (nx,ny,nz,1)• VUP (vup_x, vup_y, vup_z,0) punto all’infinito

Page 16: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica aa 2005/2006.

Programmazione Grafica aa2005/2006 16

Costruzione della matrice V

• Poniamo l’origine in VRP, VPN sarà la direzione dell’asse z, da VUP ricaviamo la direzione y, la direzione x si ricava per prodotto vettore tra z e x

• Traslazione in VRP con T(-x,-y-z)• Per la rotazione R: per trovare la direzione y il vettore relativo v deve essere ortogonale a n: n.v=0

Page 17: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica aa 2005/2006.

Programmazione Grafica aa2005/2006 17

Costruzione della matrice V

• v è la proiezione di vup sul piano identificato da n, quindi è combinazione lienare di n e vup:

• v=an+bvup

• Ponendo b=1 (vettori normalizzati) si ricava a=-(vup.n/n.n) da cui:

• v=vup- (vup.n/n.n)• Il terzo asse z si ottiene per prodotto: u=vxn

Page 18: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica aa 2005/2006.

Programmazione Grafica aa2005/2006 18

Costruzione della matrice V

• Normalizzando tutti i vettori u’,v’,n’, la matrice di rotazione seguente

• Orienta un vettore in u’,v’,n’ rispetto al riferimento originale, quindi trasponiamo per compiere la rotazione desiderata

A =

u'x v'x n'x 0

u'y v'y n'y 0

u'z v'z n'z 0

0 0 0 1

⎜ ⎜ ⎜ ⎜

⎟ ⎟ ⎟ ⎟

R =

u'x u'y u'z 0

v 'x v'y v 'z 0

n'x n'y n'z 0

0 0 0 1

⎜ ⎜ ⎜ ⎜

⎟ ⎟ ⎟ ⎟

Page 19: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica aa 2005/2006.

Programmazione Grafica aa2005/2006 19

Costruzione della matrice V

• Finalmente la matrice V si ottiene moltiplicando la R per la traslazione T

V = RT =

u'x u'y u'z −xu'x −yu'y −zu'zv'x v 'y v'z −xv'x −yv'y −zv'zn'x n'y n'z −xn'x −yn'y −zn'z0 0 0 1

⎜ ⎜ ⎜ ⎜

⎟ ⎟ ⎟ ⎟

Page 20: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica aa 2005/2006.

Programmazione Grafica aa2005/2006 20

Matrice canonica di proiezione parallela

ortogonale

Mortho =

1 0 0 0

0 1 0 0

0 0 0 0

0 0 0 1

⎢ ⎢ ⎢ ⎢

⎥ ⎥ ⎥ ⎥

p =

x

y

z

1

⎢ ⎢ ⎢ ⎢

⎥ ⎥ ⎥ ⎥

* Mortho = q =

x

y

0

1

⎢ ⎢ ⎢ ⎢

⎥ ⎥ ⎥ ⎥

Page 21: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica aa 2005/2006.

Programmazione Grafica aa2005/2006 21

Funzioni di OpenGL - proiezione parallela

ortogonaleglOrtho(xmin, xmax, ymin, ymax, near, far);

Definisce un view volume, rispetto al quale si fa il clipping

near e far possono essere anche negativi: non c’e’ divisione per 0

Page 22: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica aa 2005/2006.

Programmazione Grafica aa2005/2006 22

• La configurazione prevede di essere in condizioni canoniche per l’orientamento, inoltre:• Traslare l’origine del view volume nell’origine del view volume canonico• Riscalare il view volume per normalizzarlo in -1,1• zmax = far• zmin = near• completata la trasformazione si può chiamare la glOrtho• Le coordinate trasformate sono nel riferimento NDC normalized devices coordinates

Parallela ortogonale -2

Page 23: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica aa 2005/2006.

Programmazione Grafica aa2005/2006 23

glOrtho(xmin, xmax, ymin, ymax, near, far);

P =ST=

2xmax−xmin

0 0 −xmax+xminxmax−xmin

02

ymax−ymin0 −

ymax+yminymax−ymin

0 02

zmax−zmin−zmax+zminzmax−zmin

0 0 0 1

⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢

⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥

traslazioneal centro delview volumescalatura

Parallela ortogonale - 3

Page 24: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica aa 2005/2006.

Programmazione Grafica aa2005/2006 24

Proiezioni parallele oblique

Angoli del fascio di proiettori con la normale al piano di proiezione

DOP

y

x

z

normale

Page 25: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica aa 2005/2006.

Programmazione Grafica aa2005/2006 25

Proiezioni parallele oblique - 2

• orientare la direzione di proiezione in modo che sia parallela a z, con trasformazione di shear controllata dagli angoli

• rinormalizzare il view volume con scala e traslazione (come sopra)

• proiettare con la matrice ortografica

Page 26: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica aa 2005/2006.

Programmazione Grafica aa2005/2006 26

Trasformazione di shear e proiezione parallela

ortogonale

H =

1 0 −cotθ 0

0 1 −cotφ 0

0 0 1 0

0 0 0 1

⎢ ⎢ ⎢ ⎢ ⎢

⎥ ⎥ ⎥ ⎥ ⎥

P =MorthoSTH(θ,φ)

Page 27: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica aa 2005/2006.

Programmazione Grafica aa2005/2006 27

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

Page 28: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica aa 2005/2006.

Programmazione Grafica aa2005/2006 28

z

x

yP(x,y,z)

P(xv,yv)

Piano di proiezione

Proiezione prospettica centrale - Calcolo

analitico

Centro di proiezione

Page 29: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica aa 2005/2006.

Programmazione Grafica aa2005/2006 29

z

y

Piano di proiezioned

P(x,y,z)

yv

y/yv = z/dyv = y/(z/d)

x/xv = z/dxv = x/(z/d)

... in sezione ...

Centro di proiezione

Page 30: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica aa 2005/2006.

Programmazione Grafica aa2005/2006 30

Matrice canonica di trasformazione prospettica

M =

1 0 0 0

0 1 0 0

0 0 1 0

0 0 1/d 0

⎢ ⎢ ⎢ ⎢

⎥ ⎥ ⎥ ⎥

p =

x

y

z

1

⎢ ⎢ ⎢ ⎢

⎥ ⎥ ⎥ ⎥

* M = q =

x

y

z

z /d

⎢ ⎢ ⎢ ⎢

⎥ ⎥ ⎥ ⎥

Page 31: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica aa 2005/2006.

Programmazione Grafica aa2005/2006 31

Dalle coordinate omogenee allo spazio 3D

xp =xz/d

yp =yz/d

zp =zz/d

=d

Page 32: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica aa 2005/2006.

Programmazione Grafica aa2005/2006 32

Prospettiva:Angolo di visione e

frustum

Page 33: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica aa 2005/2006.

Programmazione Grafica aa2005/2006 33

Prospettiva:Funzioni di OpenGL

glFrustum(xmin, xmax, ymin, ymax, near, far);

gluPerspective(fovy, aspect, near, far);Aspect = larghezza/altezza della windowFovy:angolo di apertura verticale

Page 34: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica aa 2005/2006.

Programmazione Grafica aa2005/2006 34

Prospettiva generica

• Metodo della projection normalization– Creare la matrice di normalizzazione

– Deformare lo spazio– Proiettare in modo ortografico

Page 35: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica aa 2005/2006.

Programmazione Grafica aa2005/2006 35

Prospettiva generica (cont)

• Si suppone di proiettare in modo canonico con la distanza del centro di proiezione

d=-1 lungo l’asse z– Se non siamo in queste condizioni si rototrasla il sistema e si applica una trasformazione di shear

• la matrice Mpersp canonica è:

M persp =

1 0 0 0

0 1 0 0

0 0 1 0

0 0 −1 0

⎢ ⎢ ⎢ ⎢

⎥ ⎥ ⎥ ⎥

Page 36: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica aa 2005/2006.

Programmazione Grafica aa2005/2006 36

Prospettiva generica (cont)

• Siano l,r,t,b,n,f i 6 parametri che definiscono il frustum di visione• OGL per operare la proiezione costruisce la matrice:

– In questo schema 0<n<f, quindi il frustum di visione viene traslato nelle z positive

P =

2n

r − l0

r + l

r − l0

02n

t − b

t + b

t − b0

0 0 −f + n

f − n−

2 fn

f − n0 0 −1 0

⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜

⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟

Page 37: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica aa 2005/2006.

Programmazione Grafica aa2005/2006 37

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” - “rollio, beccheggio, imbardata”

Page 38: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica aa 2005/2006.

Programmazione Grafica aa2005/2006 38

Page 39: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica aa 2005/2006.

Programmazione Grafica aa2005/2006 39

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);

Page 40: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica aa 2005/2006.

Programmazione Grafica aa2005/2006 40

Trasformazione di vista - LookAt

0 0 0 1

x y z x

x y z y

x y z z

s f up

u s f

s s s e

u u u eM

f f f e

= ×= ×

−⎛ ⎞⎜ ⎟−⎜ ⎟=⎜ ⎟− − − −⎜ ⎟⎝ ⎠