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

56
Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica aa 2007/2008

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

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

Controllare le proiezioni

Daniele Marini

Corso Di Programmazione Grafica aa 2007/2008

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

Programmazione Grafica aa2007/2008 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 2007/2008.

Programmazione Grafica aa2007/2008 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 2007/2008.

Programmazione Grafica aa2007/2008 4

Sistemi di riferimento

World frame

Camera frame

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

Programmazione Grafica aa2007/2008 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 2007/2008.

Programmazione Grafica aa2007/2008 6

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

Programmazione Grafica aa2007/2008 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 2007/2008.

Programmazione Grafica aa2007/2008 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 2007/2008.

Programmazione Grafica aa2007/2008 9

Orientare il piano di proiezione

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

Programmazione Grafica aa2007/2008 10

Definire la viewport e la window

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

Programmazione Grafica aa2007/2008 11

Definire il centro di proiezione

(COP)

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

Programmazione Grafica aa2007/2008 12

Se la proiezione è parallela

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

Programmazione Grafica aa2007/2008 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 2007/2008.

Programmazione Grafica aa2007/2008 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 2007/2008.

Programmazione Grafica aa2007/2008 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 2007/2008.

Programmazione Grafica aa2007/2008 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 2007/2008.

Programmazione Grafica aa2007/2008 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 2007/2008.

Programmazione Grafica aa2007/2008 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 2007/2008.

Programmazione Grafica aa2007/2008 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 2007/2008.

Programmazione Grafica aa2007/2008 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 2007/2008.

Programmazione Grafica aa2007/2008 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 2007/2008.

Programmazione Grafica aa2007/2008 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 2007/2008.

Programmazione Grafica aa2007/2008 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 2007/2008.

Programmazione Grafica aa2007/2008 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 2007/2008.

Programmazione Grafica aa2007/2008 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 2007/2008.

Programmazione Grafica aa2007/2008 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 2007/2008.

Programmazione Grafica aa2007/2008 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 2007/2008.

Programmazione Grafica aa2007/2008 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 2007/2008.

Programmazione Grafica aa2007/2008 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 2007/2008.

Programmazione Grafica aa2007/2008 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 2007/2008.

Programmazione Grafica aa2007/2008 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 2007/2008.

Programmazione Grafica aa2007/2008 32

Prospettiva:Angolo di visione e frustum

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

Programmazione Grafica aa2007/2008 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 2007/2008.

Programmazione Grafica aa2007/2008 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 2007/2008.

Programmazione Grafica aa2007/2008 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 2007/2008.

Programmazione Grafica aa2007/2008 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 2007/2008.

Programmazione Grafica aa2007/2008 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 2007/2008.

Programmazione Grafica aa2007/2008 38

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

Programmazione Grafica aa2007/2008 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 2007/2008.

Programmazione Grafica aa2007/2008 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||)

Page 41: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica aa 2007/2008.

Stereo e profondità percepita

• La stereovisualizzazione rafforza gli indizi di profondità

• Nella immagini 2D:• Prospettiva• Dimensioni relative• Dettagli• Occlusioni• Luci e ombre• Velocità relativa

Programmazione Grafica aa2007/2008 41

Page 42: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica aa 2007/2008.

Profondità 3D

• Disparità binoculare• Accomodazione• Convergenza• Questi tre indizi devono essere

coerenti tra loro

Programmazione Grafica aa2007/2008 42

Page 43: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica aa 2007/2008.

Stereo coppie

• Proiettando stereo coppie si produce disparità interoculare

• Questo indizio è in conflitto con l’accomodamento perché la messa a fuoco avviene su un medesimo piano

• Il conflitto di accomodamento si è verificato essere tollerabile se la distanza di separazione massima sul piano immagine resta entro un intervallo di 1/30 della distanza dal piano immagine

Programmazione Grafica aa2007/2008 43

Page 44: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica aa 2007/2008.

Visione “al di là dello schermo”

• Nello schema l’oggetto appare dietro lo schermo; i punti generati dalle due proiezioni sono sul lato relativo all’occhio corrispondente

• Parallasse positiva; massima parallasse per il punto all’infinito; è pari alla distanza interoculare

Programmazione Grafica aa2007/2008 44

Page 45: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica aa 2007/2008.

Visione “al di qua dello schermo”

• Parallasse negativa

• Parallasse pari alla distanza interoculare quando il punto si trova a metà della distanza dal piano di proiezione

Programmazione Grafica aa2007/2008 45

Page 46: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica aa 2007/2008.

Visione “sul piano schermo”

• Si ha parallasse nulla e il punto viene proiettato senza disparità sul piano immagine

Programmazione Grafica aa2007/2008 46

Page 47: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica aa 2007/2008.

Tecniche di calcolo della stereo proiezione: toe-in

scorretta• Toe in: due proiezioni prospettiche da due

punti separati dalla distanza interoculare (circa 65 mm)

• Introduce anche una parallasse verticale fastidiosa

Programmazione Grafica aa2007/2008 47

Page 48: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica aa 2007/2008.

Tecniche di calcolo della stereo proiezione: off-axis

corretta• Due proiezioni con assi tra loro

paralleli; richiede un trimming dell’immagine per considerare solo la parte comune

Programmazione Grafica aa2007/2008 48

Page 49: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica aa 2007/2008.

Confronto

• Il metodo toe-in introduce una parallasse verticale; si implementa facilmente e tutte le librerie grafiche lo supportano

• Il metodo off-axis non produce parallasse verticale; non tutte le librerie lo supportano. OpenGl sì!

Programmazione Grafica aa2007/2008 49

Page 50: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica aa 2007/2008.

Parametri

• Il grado di effetto stereo dipende dalla distanza del centro di proiezione dal piano e dalla separazione

• In generale un buon effetto non faticoso richiede separazione pari a 1/20 della distanza dal piano

• Inoltre occorre evitare che la parallasse superi la distanza interoculare

Programmazione Grafica aa2007/2008 50

Page 51: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica aa 2007/2008.

Angolo di parallasse

= 2 atan(DX / 2d)

Programmazione Grafica aa2007/2008 51

Page 52: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica aa 2007/2008.

Programmazione Grafica aa2007/2008 52

Page 53: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica aa 2007/2008.

Trimming

• Per calcolare il trimming nel metodo off-axis

= e.w / [2f0 tan(/2)]

•  dove: e distanza interoculare

• w larghezza immagine

• fo lunghezza focale (a parallasse 0)

angolo apertura desiderato

Programmazione Grafica aa2007/2008 53

Page 54: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica aa 2007/2008.

Trimming

• Dopo il trimming l’angolo di apertura effettivo è:

’ atan([(w+ ) tan(w• Notare che OpenGL usa un angol di

apertura verticale non orizzontale, occorre calcolarselo!

Programmazione Grafica aa2007/2008 54

Page 55: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica aa 2007/2008.

Programmazione Grafica aa2007/2008 55

Page 56: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica aa 2007/2008.

Stereo e OpenGL

• Con OGL per creare una coppia stereo si usano le funzioni glFrustum.

• Se si usasse gluLookAt si applicherebbe il metodo toe-in

Programmazione Grafica aa2007/2008 56