Controllare le proiezioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

56
Controllare le proiezioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale

Transcript of Controllare le proiezioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

Page 1: Controllare le proiezioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

Controllare le proiezioni

Daniele Marini

Corso di Programmazione Grafica per il Tempo Reale

Page 2: Controllare le proiezioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

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

PGTR aa 2010/2011

Page 3: Controllare le proiezioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

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

PGTR aa 2010/2011

Page 4: Controllare le proiezioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

4

Sistemi di riferimento

World frame

Camera frame

PGTR aa 2010/2011

Page 5: Controllare le proiezioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

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

PGTR aa 2010/2011

Page 6: Controllare le proiezioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

6PGTR aa 2010/2011

Page 7: Controllare le proiezioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

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

PGTR aa 2010/2011

Page 8: Controllare le proiezioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

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

PGTR aa 2010/2011

Page 9: Controllare le proiezioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

9

Orientare il piano di proiezione

PGTR aa 2010/2011

Page 10: Controllare le proiezioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

10

Definire la viewport e la window

PGTR aa 2010/2011

Page 11: Controllare le proiezioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

11

Definire il centro di proiezione

(COP)

PGTR aa 2010/2011

Page 12: Controllare le proiezioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

12

Se la proiezione è parallela

PGTR aa 2010/2011

Page 13: Controllare le proiezioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

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

PGTR aa 2010/2011

Page 14: Controllare le proiezioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

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

PGTR aa 2010/2011

Page 15: Controllare le proiezioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

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

PGTR aa 2010/2011

Page 16: Controllare le proiezioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

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,1)• Per la rotazione R: per trovare la

direzione y il vettore relativo v deve essere ortogonale a n: n.v=0

PGTR aa 2010/2011

Page 17: Controllare le proiezioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

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=vxnPGTR aa 2010/2011

Page 18: Controllare le proiezioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

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

⎜ ⎜ ⎜ ⎜

⎟ ⎟ ⎟ ⎟

PGTR aa 2010/2011

Page 19: Controllare le proiezioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

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

⎜ ⎜ ⎜ ⎜

⎟ ⎟ ⎟ ⎟

PGTR aa 2010/2011

Page 20: Controllare le proiezioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

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

⎢ ⎢ ⎢ ⎢

⎥ ⎥ ⎥ ⎥

PGTR aa 2010/2011

Page 21: Controllare le proiezioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

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

PGTR aa 2010/2011

Page 22: Controllare le proiezioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

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

PGTR aa 2010/2011

Page 23: Controllare le proiezioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

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

PGTR aa 2010/2011

Page 24: Controllare le proiezioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

24

Proiezioni parallele oblique

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

DOP

y

x

z

normale

PGTR aa 2010/2011

Page 25: Controllare le proiezioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

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

PGTR aa 2010/2011

Page 26: Controllare le proiezioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

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(θ,φ)

PGTR aa 2010/2011

Page 27: Controllare le proiezioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

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

PGTR aa 2010/2011

Page 28: Controllare le proiezioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

28

z

x

yP(x,y,z)

P(xv,yv)

Piano di proiezione

Proiezione prospettica centrale - Calcolo analitico

Centro di proiezione

PGTR aa 2010/2011

Page 29: Controllare le proiezioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

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

PGTR aa 2010/2011

Page 30: Controllare le proiezioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

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

⎢ ⎢ ⎢ ⎢

⎥ ⎥ ⎥ ⎥

PGTR aa 2010/2011

Page 31: Controllare le proiezioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

31

Dalle coordinate omogenee allo spazio 3D

xp =x

z/ d

yp =y

z/d

zp =z

z/ d=d

PGTR aa 2010/2011

Page 32: Controllare le proiezioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

32

Prospettiva:Angolo di visione e frustum

PGTR aa 2010/2011

Page 33: Controllare le proiezioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

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

PGTR aa 2010/2011

Page 34: Controllare le proiezioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

34

Prospettiva generica

• Metodo della projection normalization– Creare la matrice di normalizzazione– Deformare lo spazio– Proiettare in modo ortografico

PGTR aa 2010/2011

Page 35: Controllare le proiezioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

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

⎢ ⎢ ⎢ ⎢

⎥ ⎥ ⎥ ⎥

PGTR aa 2010/2011

Page 36: Controllare le proiezioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

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

⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜

⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟

PGTR aa 2010/2011

Page 37: Controllare le proiezioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

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”

PGTR aa 2010/2011

Page 38: Controllare le proiezioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

38PGTR aa 2010/2011

Page 39: Controllare le proiezioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

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

PGTR aa 2010/2011

Page 40: Controllare le proiezioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

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

PGTR aa 2010/2011

Page 41: Controllare le proiezioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

Stereo e profondità percepita

• La stereovisualizzazione rafforza gli indizi di profondità

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

41PGTR aa 2010/2011

Page 42: Controllare le proiezioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

Profondità 3D

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

coerenti tra loro

42PGTR aa 2010/2011

Page 43: Controllare le proiezioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

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

43PGTR aa 2010/2011

Page 44: Controllare le proiezioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

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

44PGTR aa 2010/2011

Page 45: Controllare le proiezioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

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

45PGTR aa 2010/2011

Page 46: Controllare le proiezioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

Visione “sul piano schermo”

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

46PGTR aa 2010/2011

Page 47: Controllare le proiezioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

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

47PGTR aa 2010/2011

Page 48: Controllare le proiezioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

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

48PGTR aa 2010/2011

Page 49: Controllare le proiezioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

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ì!

49PGTR aa 2010/2011

Page 50: Controllare le proiezioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

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

50PGTR aa 2010/2011

Page 51: Controllare le proiezioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

Angolo di parallasse

= 2 atan(DX / 2d)

51PGTR aa 2010/2011

Page 52: Controllare le proiezioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

52PGTR aa 2010/2011

Page 53: Controllare le proiezioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

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

53PGTR aa 2010/2011

Page 54: Controllare le proiezioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

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!

54PGTR aa 2010/2011

Page 55: Controllare le proiezioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

55PGTR aa 2010/2011

Page 56: Controllare le proiezioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

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

• Nella cartella doc trovate una presentazione ben fatta sul calcolo dello stereo con codice di esempio OGL: Calculating Stereo Pairs.pdf

56PGTR aa 2010/2011