controllare le proiezioni daniele marini corso di programmazione grafica

56
Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica

Upload: bernardetta-ferri

Post on 02-May-2015

219 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica

Controllare le proiezioni

Daniele Marini

Corso Di Programmazione Grafica

Page 2: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica

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

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

4

Sistemi di riferimento

World frame

Camera frame

Page 5: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica

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

6

Page 7: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica

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

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

9

Orientare il piano di proiezione

Page 10: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica

10

Definire la viewport e la window

Page 11: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica

11

Definire il centro di proiezione

(COP)

Page 12: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica

12

Se la proiezione è parallela

Page 13: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica

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

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

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

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

Page 17: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

32

Prospettiva:Angolo di visione e frustum

Page 33: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica

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

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

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

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

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

38

Page 39: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica

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

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

Stereo e profondità percepita

• La stereovisualizzazione rafforza gli indizi di profondità

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

41

Page 42: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica

Profondità 3D

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

coerenti tra loro

42

Page 43: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica

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

43

Page 44: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica

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

44

Page 45: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica

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

45

Page 46: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica

Visione “sul piano schermo”

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

46

Page 47: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica

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

47

Page 48: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica

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

48

Page 49: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica

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

49

Page 50: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica

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

50

Page 51: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica

Angolo di parallasse

= 2 atan(DX / 2d)

51

Page 52: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica

52

Page 53: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica

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

53

Page 54: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica

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!

54

Page 55: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica

55

Page 56: Controllare le proiezioni Daniele Marini Corso Di Programmazione Grafica

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

56