Quaternioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

42
Quaternioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale

Transcript of Quaternioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

Page 1: Quaternioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

Quaternioni

Daniele Marini

Corso di Programmazione Grafica per il Tempo Reale

Page 2: Quaternioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

2

Problema 1: “gimbal lock”

• blocco del giroscopio• esprimiamo le rotazioni con gli angoli

di Eulero, tre angoli di rotazione attorno agli assi coordinati (si pensi a un velivolo, yaw (head), pitch, roll)

• implementiamo gli angoli di Eulero con le matrici appena esaminate

PGTR aa 2010/2011

Page 3: Quaternioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

3

• eseguiamo una rotazione di yaw di 90°• eseguiamo una rotazione di pitch di 90°• esprimiamo la matrice come funzione di tre

parametri E(h,p,r) [concatenazione di tre matrici di rotazione Rz(h). Rx(p). Ry(r)] dopo la prima trasformazione abbiamo E(h, r)=

• abbiamo perso l’informazione relativa all’angolo , un grado di libertà, non possiamo più ruotare attorno a z (roll)€

cosrcosh− sin rsinh 0 cosrsinh+ sin rcosh

sin rcosh+ cosrsinh 0 sin rsinh− cosrcosh

0 1 0

⎜ ⎜ ⎜

⎟ ⎟ ⎟

PGTR aa 2010/2011

Page 4: Quaternioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

4

Problema 2: Interpolare rotazioni

• nella animazione si richiede di modificare la posizione di un oggetto o della camera con traslazioni e rotazioni

• interpolare traslazioni non pone problemi• Anche la rotazione deve poter essere

espressa in forma parametrica per semplificare il calcolo delle interpolazione delle rotazioni

PGTR aa 2010/2011

Page 5: Quaternioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

5

• Infatti:– se incrementiamo di una piccola quantita’ un angolo

più volte nascono problemi di arrotondamento– se abbiamo rotazione attorno a un solo asse nascono

irregolarità e movimenti a scatto– se abbiamo più rotazioni, dopo un po’ di applicazioni

la matrice non è più ortogonale e la scena si deforma– si può risolvere il problema “rinormalizzando” la

matrice a ogni passo

• comunque è una soluzione costosa

PGTR aa 2010/2011

Page 6: Quaternioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

6

Una trackball virtuale• Immaginate una trackball: la

rotazione della sfera controlla la rotazione nel sistema.

• Con il mouse si può ricavare la posizione equivalente sulla sfera di raggio unitario con una proiezione invertibile, noti x e z si ricava y=(1-x2-y2)1/2

• La rotazione sulla sfera da P a Q si svolge su un arco di cerchio, il cui piano è individuato dai due vettori su P e Q, con n normale a questo piano

• La rotazione avviene dunque attorno ad n

PGTR aa 2010/2011

Page 7: Quaternioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

7

Specificare le rotazioni

• Una matrice di rotazione generica dipende da 9 parametri

• una rotazione richiede un’asse di rotazione n e un angolo : 4 parametri (3 per il vettore, 1 per l’angolo)

• Abbiamo anche visto come considerare la rotazione attorno a un asse generico come cambiamento di riferimento

PGTR aa 2010/2011

Page 8: Quaternioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

8

Specificare le rotazioni

• Un altro modo di considerare la rotazione attorno a un asse generico:– Vogliamo ruotare il vettore r attorno

all’asse n di un angolo

PGTR aa 2010/2011

Page 9: Quaternioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

9

rRr

n

V

il vettore r può essere scomposto in una componente parallela a n e in una ortogonale:r||=(n.r) xnLa componente ortogonale si trova per differenza dal vettore r:rL=r - (n.r) xnla componente || resta invariata nella rotazione, varia solo la componente L (rossa). Definiamo un vettore V ortogonale a rL:V=nx rL = nxr con cui possiamo esprimere il vettore ruotato (rosso) in funzione di V:

r||

rL

RrL = (cosθ)rL+ (sinθ)V

quindi :

Rr = Rr + RrL

= Rr + (cosθ)rL+ (sinθ)V

= n.r × n + (cosθ)(r − n.r × n) + (sinθ)n × r

= (cosθ)r + (1− cosθ)n(n.r) + (sinθ)n × r

RrL

PGTR aa 2010/2011

Page 10: Quaternioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

10

Specificare le rotazioni

• Con questi metodi possiamo specificare rotazioni generiche e interpolare rotazioni

• Peccato che al momento sappiamo specificare una rotazione solo con matrici di Eulero

PGTR aa 2010/2011

Page 11: Quaternioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

I quaternioni

Page 12: Quaternioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

12

Numeri complessi (richiami)

I numeri complessi sono una estensione dei numeri reali e sono indispensabili per risolvere equazioni del tipo: z=(-1)1/2  . Adottando il simbolo i per denotare la radice quadrata dell'unita negativa, la soluzione a questa equazione diventa z = ± i.Un numero complesso z è una coppia ordinata di numeri reali. Si può quindi rappresentare un numero complesso con la notazione  

z=(x,y) dove x rappresenta la parte reale, denotata anche con Re{z}, mentre y rappresenta la parte immaginaria, denotata anche conIm{z}.

PGTR aa 2010/2011

Page 13: Quaternioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

13

Un numero complesso si può anche rappresentare nella forma z=x+iy (nella teoria dei segnali si usa il simbolo j per la costante immaginaria i). Questa forma di rappresentazione dei numeri complessi viene anche chiamata "forma Cartesiana". I numeri complessi possono anche essere pensati come punti del "piano complesso", perciò i numeri complessi possono essere considerati come un diverso modo con cui studiare la geometria analitica del piano. Si usa anche la rappresentazione in coordinate polari

PGTR aa 2010/2011

Page 14: Quaternioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

14

Per convertire un numero complesso dalla forma cartesiana a quella polare si ricorre a proprietà trigonometriche e al teorema di Pitagora; infatti ricordiamo che: 

x = r cos    y= r sin  ed, equivalentemente, le componenti r e di un numero complesso in coordinate polari si convertono in forma cartesiana con le due equazioni:

r = x 2 + y 2

θ = arctany

x

PGTR aa 2010/2011

Page 15: Quaternioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

15

La rappresentazione in forma polare più adeguata è basata sulla formula di Eulero che permette di rappresentare un numero complesso come esponenziale in base e in forma trigonometrica:

Le formule di Eulero inverse permettono di ottenere seno e coseno dalla rappresentazione esponenziale di un numero complesso:

 

La coppia di valori (cos  sin rappresenta un qualunque punto su un cerchio di raggio unitario centrato nell'origine, al variare di ; perciò per individuare qualsiasi punto nel piano è sufficiente moltiplicare la forma esponenziale per il modulo r:

e iθ = cosθ + isinθ

cosθ =e iθ + e−iθ

2

sinθ =e iθ − e−iθ

2i

z = re iθ = rcosθ + irsinθ

PGTR aa 2010/2011

Page 16: Quaternioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

16

Sono definite numerose operazioni tra numeri complessi, in particolare:  somma :           z1 + z2 =(x1 + iy1)+(x2 + iy2)=(x1+x2) +  i(y1+y2)sottrazione:      z1 - z2 =(x1 + iy1)-(x2 + iy2)=(x1 -x2) +  i(y1 -y2)complesso coniugato: z* = (x + iy)* = (x - iy) Le operazioni di prodotto e divisione sono più semplici nella forma polare, ricordando le proprietà degli esponenziali: prodotto:         z1 . z2 =r1 ei r2  ei  = r1 . r2 ei(

divisione:        z1 / z2 =r1 ei r2  ei  = r1 / r2 ei(

 

PGTR aa 2010/2011

Page 17: Quaternioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

17

Quaternioni e rotazioni

• la rotazione di un vettore r di un angolo si può esprimere con un operatore chiamato quaternione, caratterizzato da 4 numeri reali

• abbiamo 4 gradi di libertà invece dei 9 elementi della matrice, come per la rotazione attorno a un asse generico

• useremo quaternioni unitari• i quaternioni possono essere considerati come

una generalizzazione dei numeri complessi, con uno scalare s come parte reale e un vettore v come parte immaginaria

PGTR aa 2010/2011

Page 18: Quaternioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

18

• denotiamo un quaternione q con:q = s + xi + yj + zk

dove i,j,k sono i quaternioni unitari e corrispondono ai vettori unitari degli assi in un sistema vettoriale e hanno le proprietà:

i2= j2= k2=ijk=-1; ij=k; ji=-k• da queste proprietà ricaviamo le

operazioni di somma e moltiplicazione• Questa definizione è dovuta a Hamilton

PGTR aa 2010/2011

Page 19: Quaternioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

19

Quaternioni

• Una notazione più recente dovuta a Gibbs vede il quaternione come composto da una parte scalare s che corrisponde alla parte reale di un numero immaginario, e da una parte vettoriale v che corrisponde alla parte immaginaria del numero complesso in 4 dimensioni: [s,v]

• La parte vettoriale complessa si esplicita nella forma: v = (x,y,z)

PGTR aa 2010/2011

Page 20: Quaternioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

20

Numeri e vettori reali come quaternioni

• Secondo la notazione di Gibbs un numero reale s si può scrivere come quaternione la cui parte immaginaria è nulla: (s,0)

• Mentre un vettore reale in R3 si può scrivere come quaternione la cui parte scalare è nulla: (0,v)

PGTR aa 2010/2011

Page 21: Quaternioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

21

Definizioni

PGTR aa 2010/2011

Page 22: Quaternioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

22

Proprietà 1

PGTR aa 2010/2011

Page 23: Quaternioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

23

Proprietà 2

PGTR aa 2010/2011

Page 24: Quaternioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

24

Proprietà 3

PGTR aa 2010/2011

Page 25: Quaternioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

25

• La moltiplicazione ha un inverso:

basta verificare che q q* è la norma:

da cui qq-1=q-1q=1

•ricordiamo la moltiplicazione:qq’=(ss’-vv’, vxv’ +sv’ + s’v)

PGTR aa 2010/2011

Page 26: Quaternioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

26

Quaternioni unitari

• Se |q|=1 il quaternione è detto unitario• L’insieme dei quaternioni unitari forma una sfera in uno

spazio a 4 dimensioni• Si può dimostrare che se q=(v,s ) allora esiste un vettore v’

e un angolo tale che: q=(cos , v’sin )• Se q è unitario allora q=(cos , sin n) con n unitario • i quaternioni non sono commutativi rispetto al

prodotto(ricordiamo: qq’=((vxv’ +sv’ + s’v), ss’-vv’), esempio:

q1=(<0,0,1>,2) q2=(<1,0,0>,1)q1q2=(<0,1,0>+2<1,0,0>+<0,0,1>, 2-0 )=(<2,1,1>,2)

q2q1=(<0,-1,0>+<0,0,1>+2<1,0,0>, 2-0)=(<2,-1,1>,2)

PGTR aa 2010/2011

Page 27: Quaternioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

27

La rotazione con quaternioni• r è definito dal quaternione p=(0,r)

• definiamo l’operatore Rq=q(.)q-1 con q quaternione unitario (s,v)

• applicato a p l’operatore dà: qpq-1

• in forma esplicita:

• Rq(p)=(0,(s2-v.v)r+2v(v.r)+2s(vxr))

• ricordando che: se q è unitario allora q=(cos , sin ncon n unitario e sostituendo si ha:

rRr

n

Vr||

rLRrL

Rq(p)=(0,(cos2 -sin2 )r+2 sin2n(n.r)+2 cossinnxr))=

(0, rcos2 +(1- cos2n(n.r)+sin2nxr))

PGTR aa 2010/2011

Page 28: Quaternioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

28

• confrontiamo la:(0, rcos2 +(1- cos2n(n.r)+sin2nxr))

• con l’equazione ricavata prima:

• a meno del coefficiente 2 sono identiche• la rotazione di un vettore r di (n) si può quindi

attuare:• passando allo spazio dei quaternioni• rappresentando la rotazione con un quaternione unitario

q=(cos , sin n• applicando l’operatore q(.)q-1 al quaternione (0,r)

• la rotazione si parametrizza quindi con i 4 parametri: cos , sin nx, sin ny, sin nz

(cosθ)r + (1− cosθ)n(n.r) + (sinθ)n × r

PGTR aa 2010/2011

Page 29: Quaternioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

29

ancora un esempio

• ruotiamo un oggetto di 180° attorno all’asse x con la sequenza di rotazioni R(0,0,0), ... R(t,0,0), ..., R(,0,0) con 0<=t<=1

• la seconda sequenza ruota attorno y, z : R(0,0,0), ... R(0, t, t), ..., R(, , )

• la posizione finale e’ identica, ma l’oggetto “twista” nella seconda

• occorre controllare i 3 angoli di Eulero per governare la sequenza desiderata

• da qui l’uso dei quaternioni

PGTR aa 2010/2011

Page 30: Quaternioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

30

con i quaternioni

• la rotazione ottenuta con la sequenza R(0,0,0), ... R(t,0,0), ..., R(,0,0) è rappresentata dal quaternione (cos(/2), sin(/2)(1,0,0))=(0,(1,0,0))

• la rotazione ottenuta con la sequenza R(0,0,0), ... R(0, t, t), ..., R(, , ) è rappresentata dal prodotto dei due quaternioni (0,(0,1,0))(0,(0,0,1))=(0,(1,0,0))

• Il risultato è uguale

PGTR aa 2010/2011

Page 31: Quaternioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

31

Interpolare

• una sequenza di rotazioni puo’ ora essere attuata da una sequenza di quaternioni

• la sequenza di matrici di rotazione espresse con angoli di Eulero viene trasformata in una sequenza di quaternioni che danno origine a una nuova sequenza di matrici di rotazione

• come?PGTR aa 2010/2011

Page 32: Quaternioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

32

Entrare e uscire dallo spazio dei quaternioni

• data una matrice generale di rotazione determinare il quaternione corrispondente

• dato un quaternione determinare la corrispondente matrice di rotazione

PGTR aa 2010/2011

Page 33: Quaternioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

33

• per ruotare un vettore p di un angolo con il quaternione q usiamo l’operatore: q(0,p)q-1

• dove q=(cos(sinn)=(s,(x,y,z)) • si può dimostrare che questo corrisponde ad

applicare al vettore la matrice di rotazione:

M =

1− 2(y 2 + z2) 2xy − 2sz 2sy + 2xz 0

2xy + 2sz 1− 2(x 2 + z2) −2sx + 2yz 0

−2sy + 2xz 2sx + 2yz 1− 2(x 2 + y 2) 0

0 0 0 1

⎜ ⎜ ⎜ ⎜

⎟ ⎟ ⎟ ⎟

PGTR aa 2010/2011

Page 34: Quaternioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

34

• la trasformazione inversa, dalla matrice al quaternione, consiste nel prendere una generica matrice:

• in cui M3,3=1; M0,3=M1,3=M2,3=M3,0=M3,1=M3,2=0• altri vincoli sulla matrice sono:

– la somma degli elementi diagonali è: 4-4(x2+y2+z2)– il quaternione deve essere unitario, quindi: – s2+ x2+y2+z2=1 da cui: 4-4(x2+y2+z2)=4-4(1- s2)=4 s2

M0,0 M0,1 M0,2 M0,3

M1,0 M1,1 M1,2 M1,3

M2,0 M2,1 M2,2 M2,3

M3,0 M3,1 M3,2 M3,3

⎜ ⎜ ⎜ ⎜

⎟ ⎟ ⎟ ⎟

PGTR aa 2010/2011

Page 35: Quaternioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

35

• da queste equazioni si ricava:

s = ±1

2M0,0 + M1,1 + M2,2 + M3,3

e inoltre :

x =M2,1 − M1,2

4s

y =M0,2 − M2,0

4s

z =M1,0 − M0,1

4s

PGTR aa 2010/2011

Page 36: Quaternioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

36

Interpolazione lineare sferica SLERP

• SLERP: Spherical Linear Interpolation• per interpolare tra due quaternioni

unitari determinando i quaternioni intermedi che identificano le matrici di rotazione ricordiamo che lo spazio dei quaternioni unitari forma una ipersfera nello spazio 4d, perciò tutti i quaternioni interpolati giacciono sulla sfera stessa.

PGTR aa 2010/2011

Page 37: Quaternioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

37

• una interpolazione lineare ingenua produce angoli diseguali e quindi una variazione di velocità, da qui la nozione di interpolazione sferica:

• interpoliamo lungo una linea geodesica che ha gli esteremi nei punti chiave

• in due dimensioni (per semplicità) i punti A,B sono separati dall’angolo , e p forma con A un angolo . Deriviamo p con interpolazione sferica con l’equazione parametrica: p=A+B;

A Bp

PGTR aa 2010/2011

Page 38: Quaternioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

38

• p=A+B poiché:• |p|=1; A.B=cos()• A.p=cos()• ricaviamo: • p=Asin( -)/sin()+Bsin()/sin()

PGTR aa 2010/2011

Page 39: Quaternioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

39

• generalizzando in 4d l’interpolazione tra due quaternioni unitari q1 e q2 che formano l’angolo: q1.q2 = cos() si ha, considerando come parametro u (0<=u<=1):

slerp(q1,q2,u) = q1

sin((1− u)Ω)

sin(Ω)+ q2

sin(Ωu)

sin(Ω)

PGTR aa 2010/2011

Page 40: Quaternioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

40

• esistono due possibili archi geodesici che vanno da q1 a q2 uno segue il percorso più breve, l’altro il più lungo, e questo equivale a interpolare lungo l’angolo o l’angolo 2. Ciò consegue dal fatto che gli operatori q(.)q-1 e (-q)(.)(-q)-1 producono il medesimo risultato

• per decidere quale percorso seguire occorre valutare la grandezza della distanza tra i due quaternioni e tra il primo e il secondo negato:

• Quindi calcolare (p-q).(p-q) e(p+q).(p+q) e scegliere il minore, sostituendo, nel caso, q con -q.

PGTR aa 2010/2011

Page 41: Quaternioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

41

• L’interpolazione tra più di due posizioni chiave produce geodesiche che possono essere discontinue nella derivata prima, il che dà luogo a movimento con scatti.

• per ovviare si valuta la velocità angolare e si suddividono gli intervalli per il parametro in modo adeguato (più fitti quando la velocità è maggiore).

PGTR aa 2010/2011

Page 42: Quaternioni Daniele Marini Corso di Programmazione Grafica per il Tempo Reale.

42

un po’ di link

• http://www.gamedev.net/reference/articles/article1095.asp

• keyword per ricerca in rete: quaternion, euler angle

PGTR aa 2010/2011