Trasformazioni Corso di Programmazione Grafica e Laboratorio Daniele Marini.

29
Trasformazioni Corso di Programmazione Grafica e Laboratorio Daniele Marini

Transcript of Trasformazioni Corso di Programmazione Grafica e Laboratorio Daniele Marini.

Page 1: Trasformazioni Corso di Programmazione Grafica e Laboratorio Daniele Marini.

Trasformazioni

Corso di Programmazione Grafica e Laboratorio

Daniele Marini

Page 2: Trasformazioni Corso di Programmazione Grafica e Laboratorio Daniele Marini.

Concetti

• Spazio affine

• Coordinate omogenee

• Matrici

• Traslazione, Scala, Rotazione, Shear

• Prodotto matrice-vettore colonna

Page 3: Trasformazioni Corso di Programmazione Grafica e Laboratorio Daniele Marini.

Richiami di geometria affine

• Spazio vettoriale lineare: operazioni di somma tra vettori

• Campo scalare e operazioni prodotto vettore per scalare

• Spazio affine: addizione vettore - punto; l’operazione di sottrazione punto-punto produce un vettore

Page 4: Trasformazioni Corso di Programmazione Grafica e Laboratorio Daniele Marini.

Richiami di geometria affine

product)(dot interno prodotto

neapplicazio di punto del ne traslazio:vettore-punto somma v=P

punti due di differenza come vettore

),,(

),,(

222

zzyyxx

zyx

zyx

uvuvuvuv

Q

QPv

vvvv

vvvv

zyxP

product) (cross vettoreprodotto

zyyx

zxxz

yzzy

vuvu

vuvu

vuvu

vuw

Page 5: Trasformazioni Corso di Programmazione Grafica e Laboratorio Daniele Marini.

Richiami di geometria affine

uv0 sse ortogonali

(u v) u v linearità

1u1 2u2 .... nun w combinazione lineare

se 1u1 2u2 .... nun 0 vale per 1 2.. n 0

allora (u1,...,un ) sono lineamente indipendenti

n è la dimensione dello spazio, (u1,...,un ) è la base dello spazio

cos u .v

u .v angolo tra due vettori

sin u v

u . v il modulo del cross product dà il seno dell' angolo tra i due vettori

Page 6: Trasformazioni Corso di Programmazione Grafica e Laboratorio Daniele Marini.

Lo spazio affine

• Lo spazio può essere orientato in due modi:– mano sinistra: avvolgete la mano all’asse x e puntate

il pollice verso x a sinistra, z (medio) viene verso di voi e y (indice) va verso l’alto

– mano destra: avvolgete la mano all’asse x e puntate il pollice verso x a destra, z (medio) viene verso di voi e y (indice) va verso l’alto

• Questo definisce il world coordinate system in cui sono definiti gli oggetti

Page 7: Trasformazioni Corso di Programmazione Grafica e Laboratorio Daniele Marini.

Trasformazioni affini

• Rappresentate tramite matrici• Più trasformazioni possono essere

combinate moltiplicando le rispettive matrici tra loro, creando una sola trasformazione

• Una trasformazione si ottiene in generale combinando trasformazioni lineari (rotazioni, scala e shear) seguite da una traslazione

Page 8: Trasformazioni Corso di Programmazione Grafica e Laboratorio Daniele Marini.

Trasformazioni affini

• La trasformazione affine conserva le rette

• Possiamo descrivere un poliedro con i suoi vertici, facce e spigoli, questa proprietà ci garantisce che possiamo trasformare soltanto i vertici

p(t) tp0 (1 t) p1

Ap(t) tAp0 (1 t)Ap1

Page 9: Trasformazioni Corso di Programmazione Grafica e Laboratorio Daniele Marini.

Definizione degli oggetti

• Gli oggetti possono essere definiti in un proprio sistema di riferimento locale:

• i vertici dell’oggetto sono definiti rispetto a un orientamento proprio e naturale

• un oggetto complesso può essere decomposto in elementi più semplici col proprio riferimento locale e in seguito assemblato aggregando oggetti elementari

• un oggetto può essere istanziato più volte

• Per assemblare e istanziare un oggetto si applicano le trasformazioni affini, che cambiano il riferimento locale

Page 10: Trasformazioni Corso di Programmazione Grafica e Laboratorio Daniele Marini.

Trasformare gli oggetti

• Le trasformazioni agiscono sui vertici dell’oggetto

• Denotiamo i vertici (punti) come vettori colonna v

• R, T e S rappresentano gli operatori di rotazione, traslazione e scala

• Il punto trasformato è quindi:v’ = v + T traslazionev’ = S v scalav’ = R v rotazione

Page 11: Trasformazioni Corso di Programmazione Grafica e Laboratorio Daniele Marini.

Coordinate omogenee

Spazio delle classi di equivalenza: ogni punto in coordinatecartesiane 3D corrisponde a infiniti punti nello spazio omogeneo 4D che differiscono solo per un fattore moltiplicativo w:

V (x,y,z) corrisponde a :

V (X wx,Y wy,Z = wz,w)

Il passaggio dallo spazio omogeneo e lo spazio 3D:

x X /w

y Y /w

zZ /w

solitamente si sceglie w=1

Page 12: Trasformazioni Corso di Programmazione Grafica e Laboratorio Daniele Marini.

Coordinate omogenee

• Utilizzando le coordinate omogenee le trasformazioni necessarie alla modellazione possono essere espresse come matrici 4x4

• In particolare la traslazione viene espressa come

1 0 0

0 1 0'

0 0 1

0 0 0 1 1

x

y

z

T x

T yv Tv

T z

Page 13: Trasformazioni Corso di Programmazione Grafica e Laboratorio Daniele Marini.

Traslazione

1000

100

010

001

),,()(z

y

x

zyx t

t

t

tttTtT

)1,,,()(' zzyyxx tptptp ptTp

)()(1 tTtT

Page 14: Trasformazioni Corso di Programmazione Grafica e Laboratorio Daniele Marini.

Rotazione

1000

0cossin0

0sincos0

0001

)(

xR

1000

0cos0sin

0010

0sin0cos

)(

yR

1000

0100

00cossin

00sincos

)(

zRTRR 1

)()(1 ii RR

Page 15: Trasformazioni Corso di Programmazione Grafica e Laboratorio Daniele Marini.

Rotazione

rotazione attornoall’origine

rotazione attorno alcentro dell’oggetto:prima traslarepoi ruotarepoi contro-traslare

Page 16: Trasformazioni Corso di Programmazione Grafica e Laboratorio Daniele Marini.

Scala

1000

000

000

000

),,()(z

y

x

zyx s

s

s

sssSsS

)/1,/1,/1()(1zyx sssSsS

Page 17: Trasformazioni Corso di Programmazione Grafica e Laboratorio Daniele Marini.

Trasformazioni inverse

• Denotiamo le inverse come: T-1, S-1, R-1

• La traslazione inversa si ottiene negando i coefficienti di traslazione

• La scala inversa si ottiene prendendo il reciproco dei coefficienti

• La rotazione inversa si ottiene negando l’angolo di rotazione.

• Nota se M è una matrice ortogonale M-1=MT

Page 18: Trasformazioni Corso di Programmazione Grafica e Laboratorio Daniele Marini.

Trasformazione del corpo rigido

• Per i corpi rigidi la matrice di trasformazione può essere espressa come la concatenazione di una traslazione e una rotazione

1000

)(222120

121110

020100

z

y

x

trrr

trrr

trrr

RtTX

)()())(( 1111 tTRtTRRtTX T

Page 19: Trasformazioni Corso di Programmazione Grafica e Laboratorio Daniele Marini.

Trasformazione delle normali

• La matrice M associata ad un oggetto può essere utilizzata per trasformare punti, linee e poligoni così come vettori direzione

• Per la trasformazione delle normali invece deve essere utilizzata la matrice N=(M-1)T

• Se la matrice M è ortogonale N=(MT)T=M• Se M è composta da rotazioni, traslazioni e

scale uniformi non ho problemi con le normali

Page 20: Trasformazioni Corso di Programmazione Grafica e Laboratorio Daniele Marini.

Composizione di trasformazioni

• Si possono applicare trasformazioni in successione, moltiplicando in ordine opportuno le matrici (associatività)

v”=M2M1v = M2(M1v) =M2v’

– la trasf. M1 viene applicata per prima!

• ricordiamo che il prodotto di rotazioni non è commutativo: R2R1 ≠ R1R2

Page 21: Trasformazioni Corso di Programmazione Grafica e Laboratorio Daniele Marini.

Composizione di trasformazioni

• Possiamo applicare a ogni punto separatamente le matrici:(se ho 1000 punti devo applicare le matrici singolarmente per ognuno)

• Oppure calcolare prima la matrice M:

A B Cp q

M qp

C(B(A))

Page 22: Trasformazioni Corso di Programmazione Grafica e Laboratorio Daniele Marini.

Le trasformazioni per modellare

• Da oggetti prototipo a loro “istanze”

• Tre trasformazioni nell’ordine:– Scala– Rotazione– Traslazione

• Minst=T(R(S))

Page 23: Trasformazioni Corso di Programmazione Grafica e Laboratorio Daniele Marini.

Trasformazioni di Eulero

-z

y

x

head

pitch

roll

Page 24: Trasformazioni Corso di Programmazione Grafica e Laboratorio Daniele Marini.

Trasformazioni di Eulero

• Le trasformazioni di Eulero sono costruite come moltiplicazione di matrici di rotazione intorno ai tre assi

• L’inversa della trasformazione può essere calcolata come

( , , ) ( ) ( ) ( )z x yh p r r p hE R R R

1 ( )T T T T Tz x y y x z

E E R R R R R R

Page 25: Trasformazioni Corso di Programmazione Grafica e Laboratorio Daniele Marini.

Gimbal Lock

• Avviene quando le rotazioni sono concatenate in modo tale che un grado di libertà venga perso.

• Esempio:– rotazione di 90° intorno all’asse x – volendo ruotare intorno a z, a causa della

rotazione precedente, otterremo una rotazione intorno a y

Page 26: Trasformazioni Corso di Programmazione Grafica e Laboratorio Daniele Marini.

Gimbal Lock

• Esempio

cos cos sin sin 0 cos sin sin cos

( , / 2, ) sin cos cos sin 0 sin sin cos cos

0 1 0

cos( ) 0 sin( )

sin( ) 0 cos( )

0 1 0

r h r h r h r h

E h r r h r h r h r h

r h r h

r h r h

Page 27: Trasformazioni Corso di Programmazione Grafica e Laboratorio Daniele Marini.

Rotazione attorno a un punto e parallela a un asse

• Traslare l’oggetto nell’origine, i coefficienti della traslazione T sono riferiti al punto p

• Ruotare attorno all’origine di un angolo • Traslare inversamente nel punto p

M=T-1RT

Page 28: Trasformazioni Corso di Programmazione Grafica e Laboratorio Daniele Marini.

Rotazione intorno ad un asse generico

• Per ruotare un punto intorno ad un asse generico effettuo un cambiamento di sistema di riferimento e utilizzo le matrici di rotazione note

x

z

y

r

t

s

x

z

y

r

t

s

x

z

y

r

t

s

Page 29: Trasformazioni Corso di Programmazione Grafica e Laboratorio Daniele Marini.

Rotazione intorno ad un asse generico

srt

sss

s

/

e se)0,,(

e se),0,(

e se),,0(

yzxzxy

zyxyxz

zxyxyz

rrrrrr

rrrrrr

rrrrrr

MRMX

t

s

r

M

)(xT

T

T

T