Come rappresento
(internamente)una rotazione in 3D?
cioè anche gli orientamenti di un oggetto nello spazio
Rotazioni in R3:
quante possibili?
R0
R1
R2
R3
R4
R5
R6
R7
R8
R9
R R10
R11 R11
R12 R12
R13 R13
etc etc
Rotazioni in R3:
quante possibili?
R0
(e ovviamente includono l’identità)
Per paragone:
reppresentaz. delle traslazioni in 3D
Banale:
vettore di displacement (tre float)!
perfetta secondo tutti i criteri
(verificare!)
Per paragone:
reppr. delle rotazioni in 2D
Banale: un angolo (un float)
buona secondo tutti i criteri (verificare per esercizio!)
(unica scelta: degrees or radiants?)
caveat: interpolazione!
«pick the shortest route»
mix( 25°, 335° , 0.5 ) = 0 (ma, still easy)
[0,360) [0,2·Pi)
0°
25°
335° = -25°
Per paragone:
reppr. delle rotazioni in 2D
Passaggio angolo vettore
x y
α
Per paragone:
reppr. delle rotazioni in 2D
Passaggio angolo vettore
x y
α
pro tip: use atan2
Reppresentazioni per rotazioni (in 3D)
Molte possibili,
vanno più o meno bene coi vari criteri
Tutte molto diffuse ed usate
Modi per passare da una rappr. all’altra?
Reppresentazioni principali delle rotazioni
Matrici 3x3
quello tipic. usato durante il rendering (nella GPU)
Modo 1: matrice 3x3
(9 floats)
dopotutto, una rot è un caso di trasf affine
(sottomatrice 3x3 della matrice di trasf 4x4)
come sappiamo, R ortonormale con det = 1
R 0 0
0
1
0 0 0
Modo 1: matrice 3x3
(9 floats)
Prolissa (9 numeri invece di 3)
Facile da applicare (molt matrice-vettore)
come sappiamo, cumulabile con qualunque altra trasf. affine
Abb. facile da cumulare (molt matrice-matrice)
Facilissima da invertire (trasposiz matrice)
Problematica da interpolare:
R 0
k + (1-k) R 1 = M
in genere NON di rotazione (non ortonormale)
perché?
Modo 1: matrice 3x3
(9 floats) Molto efficiente da applicare
prodotti e somme, no trigonometria
Piu’ traslazione: matrice 4x4 (o 3x4)
cumulabile con tutte le altre trasf affini!
metodo tipic. adottato per memorizzare ed eseguire trasformazioni spaziali nel GPU-based rendering!
(nel vertex shader)
Reppresentazioni principali delle rotazioni
Matrici 3x3
Angoli di Eulero
il più intuitivo dei metodi
per specificare a mano una rot
e.g. ben compreso anche da artisti digitali
Modo 2: angoli di eulero
(3 floats)
Qualunque rotazione
può essere espressa come:
rotazione lungo asse X (di α gradi), seguita da:
rotazione lungo asse Y (di β gradi), seguita da:
rotazione lungo asse Z (di γgradi):
Angoli α β γ :
“angoli di Eulero” di quella rotazione
(quindi: le “coordinate” di quella rotaz)
oridine (X-Y-Z) arbitrariamente scelto,
(ma 1 volta x tutte)
Modo 2: angoli di eulero
(3 floats)
In linguaggio nautico / areonautico:
angoli di “rollio, beccheggio, imbardata”
rollio
(roll ) beccheggio (pitch )
imbardata (yaw )
Modo 2: angoli di eulero
(3 floats)
Implementaz.
fisica:
“mappamondo
a tre assi”
Modo 2: angoli di eulero
(3 floats)
Univoco ? 1:1 ?
1 rotaz 1 terna di angoli di Eulero ?
Quasi
(limintando
oppurtunamente gli angoli).
Brutta eccezione:
“GIMBAL LOCK”
quando 1 rotazione fa coincidere gli assi delle altre 2
(è inevitabile che possa accadere)
Modo 2: angoli di eulero
(3 floats)
Compattezza: perfect!
Da applicare: un po’ faticoso
(tre rotazioni in fila)
Da interpolare: possibile…
intrerpolaz dei tre angoli
(occhio ad interpolare angoli:
ricordarsi equivalenza angoli: α = α +360 (k) )
…ma risultati non sempre intuitivi)
Da cumulare / invertire: problematico…
perché sommare / ribaltare gli angoli non funziona?
da: angoli di eulero a: matrice 3x3
Facile!
Il viceversa?
(solo a suon di conti e funz trigon. inverse)
y x
z R R
R
M
Recap: rappresentaz. di rotaz.
1/2
3x3 Matrix Euler AnglesSpace efficient?
(in RAM, GPU, storage…)
Apply
(to points/vectors)
Invert
(produce inverse)
Cumulate
(with another rotation)
Interpolate
(with another rotation)
Intuitive?
(e.g. to manually set)
easy to do…
unintuitive result trigonometry sin/cos
?!?
9 products (3 dot products)
just transpose
9 scalars 3 scalars
(even small int!)
rollio &
beccheggio &
imbardata matrix
multiplication (9 dots)
E f fic ie n t / e a s y t o
Reppresentazioni principali delle rotazioni
Matrici 3x3
Angoli di Eulero
Asse + angolo
il metodo comunemente usato per es in fisica
Modo 3: asse e angolo
Qualunque rotazione data può essere espressa come:
una rotazione di un angolo attorno ad un asse
Angolo: uno scalare
(1 float)
Asse: un vettore unitario
(3 float) passante per l’origine
opportunamente scelti
Modo 3: asse e angolo
Compattezza:
abb buono: 4 float
Efficienza di applicazione: maluccio
modo migliore: passare a matrice 3x3 (come?) (o a quaternione: vedi poi)
Invertire: facilissimo
(ribaltare angolo oppure asse)
nota: se si invertono entrambi?
stessa rotazione!
Modo 3: asse e angolo
Nota:
(ax, ay, az, alpha) (-ax, -ay, -az, -alpha) sono la stessa rotazione!
Ogni rotazione ha
due rappresentaz equivalenti come asse e angolo!
(eccetto l’identità, che ne ha infinite:
alpha = 0, asse qualunque)
Modo 3: asse e angolo
Cumulare:
nient’affatto immediato
Interpolare: ottimo!
idea: interpolare asse, intrerpolare angolo
Alcuni semplici caveat:
1) bisogna prima flippare uno dei due (asse,angolo) se questo avvicina i due assi fra loro
2) angolo va interpolato… «modulo 360°» (again!)
3) l’asse va rinormalizzato post interpolaz
4) occhio ai casi degeneri (assi opposti)
best results! la rotazione giusta
eccetto la velocità di rotaz
Modo 3: asse e angolo:
variante
asse: v
(vett normale, |v | = 1)
angolo: α
(scalare)
rappresentarli internamente
come 1 solo vett: v’
(3 float in tutto)v’ = α v
angolo α = |v’ |
asse v =v’ / |v’ |
(nota: se angolo = 0, asse si perde… infatti non conta)
Più coinciso, ma per il resto equivalente
anzi, meglio: una sola rappresentaz per ogni rotaz (perchè?)
… anche per l’identità (perchè?)
da: asse e angolo a: matrice 3x3
esercizio!
Reppresentazioni principali delle rotazioni
Matrici 3x3
Angoli di Eulero
Asse + angolo
Quaternioni
Ripasso: numeri complessi
Conseguenze:
“Num complesso”: (a + b i )
interpretaz geom: punti 2D (a , b)
Moltiplicaz fra complessi: …
interpretaz geom: …
Dunque:
moltiplicare per ruotare in 2D numero complesso (attorno (a norma 1) all’origine)
numeri complessi rappresentaz (a norma 1) rotazioni in 2D Assunzione
“fantasiosa”:
c’è un 𝑖 t.c.
𝑖 = −1
Passare ai quaternioni
Conseguenze:
“Quaternione”: ( a i + b j + c k + d )
interpr. geom: punti 3D (a,b,c), quando d=0
Molitplicare due quat: …
Invertire un quat: …
Coniungare due quat q e p (fare q p q ): …
interpretaz geom:ruotare p
con la rotaz def da q
Dunque:
coniugare con un ruotare in 3D quat (con norma 1) (asse pass. x ori)
quaternioni rappresentaz (a norma 1) rotazioni in 3D
- Assunzione
“fantasiosa”:
ci sono 𝑖 , 𝑗 , 𝑘 t.c.
cioè:
i2= j2= k2= -1 ij = k ji = -k jk = i kj = -i ki = j ik = -j
x i j k i -1 +k -j j -k -1 +i k +j -i -1
Da asse+angolo a quaternione
rotaz: di α attorno all’asse (a
x,
ay,
az)
quaternione:
q = s ax
i +
sayj +
s azk +
ccon
c= cos( α / 2 )
s
= sin ( α / 2 )
cioè
q = ( s ax,
s ay,
s az, c )
nota: || q || = 1
vett. unitario
verificare!
Modo 4: “quaternioni”
(4 float)
Applicazione: facillimo ;)
ruotare
p
= xi+y j+z k p
ruotato =q · p · q
2 moltiplicaz quat.
Cumulare: facillimo ;)
1 moltiplicaz quat
Invertire: facillimo ;)
flippare la parte reale oppure quella immaginaria
se entrambe: rimane la stessa rotaz!
quat che rappresenta il punto di coord(x ,y,z)
Nota: parte reale = 0
Modo 4: “quaternioni”
(4 float)
Interpolare: facillimo ;) …e good results!
simili caveats di asse e angolo:
1) flippare un quaternione prima, se accorcia la distanza fra i due
2) ri-normalizzare il quaternione dopo
velocità: non corretta
c’è modo di correggerla
vedi: SLERP vs LERP
x a
i +
b
j +
c
k + d
e i -1 ae +
k be +
-j ce +
i de +
+
f j -k af +
-1 bf +
i cf +
j df +
+
g k j ag +
-i bg +
-1 cg +
k gf +
+
h i
ah + j bh +
k
ch + hd
Quaternion Multiplication
x a
i +
b
j +
c
k + d
e i -1 ae +
k be +
-j ce +
i de +
+
f j -k af +
-1 bf +
i cf +
j df +
+
g k j ag +
-i bg +
-1 cg +
k dg +
+
h i
ah + j bh +
k
ch + hd
Quaternion Multiplication
( w , h ) . ( v , d )
=
( w d + v h + v×w ,
h d – v∙w )
some vector
some scalar
v
w
x a
i +
b
j +
c
k + d
e i -1 ae +
k be +
-j ce +
i de +
+
f j -k af +
-1 bf +
i cf +
j df +
+
g k j ag +
-i bg +
-1 cg +
k dg +
+
h i
ah + j bh +
k
ch + hd
Recap: representing rotations
1/2
3x3 Matrix Euler AnglesSpace efficient?
(in RAM, GPU, storage…)
Apply
(to points/vectors)
Invert
(produce inverse)
Cumulate
(with another rotation)
Interpolate
(with another rotation)
Intuitive?
(e.g. to manually set)
easy to do…
unintuitive result trigonometry sin/cos
?!?
9 products (3 dot products)
just transpose
9 scalars 3 scalars
(even small int!)
roll &
pitch &
yaw matrix
multiplication (9 dots)
E f fic ie n t / e a s y t o
Recap: representing rotations
2/2
axis + angle (unitary)quaternionSpace efficient?
(in RAM, GPU, storage…)
Apply
(to points/vectors)
Invert
(produce inverse)
Cumulate
(with another rotation)
Interpolate
(with another rotation)
Intuitive?
(e.g. to manually set)
Notes… two representations for each rotation
(flip all no effect) (for different reasons)
sometimes to matrix?
+ trigonometry
4 scalars (or 3)
(but precision needed)
E f fic ie n t / e a s y t o
easy + best result
not really super easy
flip imaginary or real part
super easy:
1 quat product
easy
2 quat product
super easy
flip axis or angle
easy + good result
(except angular speed)
4 scalars
(but precision needed)
And the winner is…
Ovviamente,
i quaternioni perché sono più efficienti su tutte le op
Ovviamente, gli angoli di Eulero
perché sono più intuitivi (e pure più compatti)
Ovviamente, asse+angolo
perché hanno l’interpolazione più naturale (in molti casi, speed giusta di default)
Ovviamente, le matrici 3x3
perché sono lo standard in CG
perché esprimono non solo rot ma qualsiasi affine (eccetto la traslaz, che tanto è storata separatamente)
Switching between representations
3x3 MATRIX
AXIS + ANGLE
EULER ANGLES
QUATER- NION
rather trivial
(I expect you to be able to!)
interesting exercise
(try it, maybe)
GUI: come specifica
un utente le rotazioni in 3D?
Metodo ricorrente: rotation gizmo
(a volte: «arcball» o «trackball»)
tre handles per controllare i tre angoli di Eulero
o “free”, drag-n-drop “intuitivo”(metafora trackball)
GUI: come specifica
un untente le traslazioni in 3D?
“free”: drag-and-drop 2D in spazio immagine,
mantendo distanza da osservatore oppure
translation gizmo
orientato nello spazio mondo, oppure
orientato nello spazio oggetto
handlesper trasllungo assie/o piani
es: x spostare un oggetto
“in basso”
es: x spostare un oggetto lungo il
“suo” basso es: x spostare un oggetto
“qui, in questo punto dello schermo”
convenzione: Rosso = X Verde = Y Blu = Z
GUI: come specifica
un untente le scalature in 3D?
scaling gizmo
(tipic. orientato in spazio oggetto)
tre handles per le scalature anisotropichje + un handle centrale per scalature uniformi
Rotazioni in unity
Nella GUI del game tools:
Euler Angles
Internamente:
Quaternions
Nell’interfaccia degli scripts:
a scelta, (quat, euler, axis+angle…) con metodi setter/getter
Trasformazioni in Unity
Lineari (trasformaz. affini)
Similitudini (trasformaz. conformali)
“Mantengono gli angoli”
Rotaz + Traslaz + Scaling uniforme
Isometrie (rototraslazione)
“Mantengono la magnitudine”
) ( )
( )
( v
0v
1f v
0f v
1f
anisot ropico
class Transform
Rotazioni in OpenGL
Nelle API «old school»: glRotate3f
Asse e angolo
Internamente:
Matrici
(come tutte le altre trasformazioni spaziali)
Reppresentare rotazioni
Matrici 3x3
Angoli di Eulero
Asse + angolo
Quaternioni
+ Traslazione
(displ. vec)
Matrici 4x4 (o 3x4)