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

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

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

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

Controllare le proiezioni

Daniele Marini

Corso Di Programmazione Grafica aa 2006/2007

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

Programmazione Grafica aa2006/2007 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 2006/2007.

Programmazione Grafica aa2006/2007 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 2006/2007.

Programmazione Grafica aa2006/2007 4

Sistemi di riferimento

World frame

Camera frame

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

Programmazione Grafica aa2006/2007 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 2006/2007.

Programmazione Grafica aa2006/2007 6

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

Programmazione Grafica aa2006/2007 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 2006/2007.

Programmazione Grafica aa2006/2007 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 2006/2007.

Programmazione Grafica aa2006/2007 9

Orientare il piano di proiezione

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

Programmazione Grafica aa2006/2007 10

Definire la viewport e la window

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

Programmazione Grafica aa2006/2007 11

Definire il centro di proiezione

(COP)

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

Programmazione Grafica aa2006/2007 12

Se la proiezione è parallela

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

Programmazione Grafica aa2006/2007 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 2006/2007.

Programmazione Grafica aa2006/2007 14

• Dati VPN, VUP si ottiene la view orientation view orientation matrixmatrix 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 2006/2007.

Programmazione Grafica aa2006/2007 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 2006/2007.

Programmazione Grafica aa2006/2007 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 y

• 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 2006/2007.

Programmazione Grafica aa2006/2007 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 2006/2007.

Programmazione Grafica aa2006/2007 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 2006/2007.

Programmazione Grafica aa2006/2007 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 2006/2007.

Programmazione Grafica aa2006/2007 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 2006/2007.

Programmazione Grafica aa2006/2007 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 2006/2007.

Programmazione Grafica aa2006/2007 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 2006/2007.

Programmazione Grafica aa2006/2007 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 2006/2007.

Programmazione Grafica aa2006/2007 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 2006/2007.

Programmazione Grafica aa2006/2007 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 2006/2007.

Programmazione Grafica aa2006/2007 26

Trasformazione di shear e proiezione parallela obliqua

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 2006/2007.

Programmazione Grafica aa2006/2007 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 2006/2007.

Programmazione Grafica aa2006/2007 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 2006/2007.

Programmazione Grafica aa2006/2007 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 2006/2007.

Programmazione Grafica aa2006/2007 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 2006/2007.

Programmazione Grafica aa2006/2007 31

Dalle coordinate omogenee allo spazio 3D

xp =x

z/ d

yp =y

z/d

zp =z

z/ d=d

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

Programmazione Grafica aa2006/2007 32

Prospettiva:Angolo di visione e frustum

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

Programmazione Grafica aa2006/2007 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 2006/2007.

Programmazione Grafica aa2006/2007 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 2006/2007.

Programmazione Grafica aa2006/2007 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 2006/2007.

Programmazione Grafica aa2006/2007 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 2006/2007.

Programmazione Grafica aa2006/2007 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 2006/2007.

Programmazione Grafica aa2006/2007 38

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

Programmazione Grafica aa2006/2007 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 2006/2007.

Programmazione Grafica aa2006/2007 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

= ×= ×

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

e=(ex,ey,ez)a=(ax,ay,az)up=upx,upy,upz)ftemp=(a-e)f=ftemp/||ftemp||)