Come rappresento le trasformazioni
Per esempio, con una matr 4x4:
class Transform { // fields:
Mat4x4 m;
// methods:
Vec4 apply( Vec4 p ); // p in coord omogenee Vec3 applyToPoint( Vec3 p ); // p in coord cartes.
Vec3 applyToVector( Vec3 v ); // p in coord cartes.
… }
03-06-2016 Marco Tarini - Master Game Dev
Come rappresento le trasformazioni
Oppure, per es, con matr3x3 + vett traslazione:
class Transform { // fields:
Mat3x3 m; // rotaz, skew, scale Vec3 t; // translaz
// methods:
Vec3 applyToPoint( Vec3 p ){
return m * p + t;
}
Vec3 applyToVector( Vec3 v ){
return m * p;
}
…
03-06-2016
}
Marco Tarini - Master Game DevReppresentazioni possibili per trasformazioni: criteri
Buone (o meno) per:
compattezza
quanto sono prolisse in memoria?
facilità di applicazione
quanto è oneroso applicare ad uno (o ventimila) punti / vettori?
interpolabilità
è possibile/facile trovare un’inerpolazione fra N trasformaz date?
quanto è “buono” il risultato combinabilità
è facile trovare la risultante di N trasformaz date, eseguite in successione?
invertibilità
è facile trovare la trasformaz inversa?
intuitività
quanto è difficile spiegarla ai modellatori / editori di scene / etc
03-06-2016 Marco Tarini - Master Game Dev
Perché è utile interpolare trasformaz:
esempio: animazioni
tempo 100
tempo 200 tempo 150
T 1
T 2 T i
?
03-06-2016 Marco Tarini - Master Game Dev
Perché è utile cumulare trasformaz:
esempio: scenegraph
spazio mondo (globale) spazio oggetto ruota 1 spazio oggetto automobile
03-06-2016 Marco Tarini - Master Game Dev
Perché è utile cumulare trasformaz:
esempio: scenegraph
T c
T 0
T 1 T 2
T 3
T 4 T 5 T 6
“ T 3
seguito da T 0 ”
NOTA:
cumulazione di trasf.
03-06-2016 Marco Tarini - Master Game Dev
Perché è utile invertire trasformaz:
switch between spaces
T T
-1
spazio mondo spazio oggetto A
03-06-2016 Marco Tarini - Master Game Dev
Come rappresento le trasformazioni
Quindi servono metodi come:
class Transform { // fields:
…
// methods:
Vec3 applyToPoint( Vec3 p );
Vec3 applyToVector( Vec3 v );
Transform cumulateWith( Transform& t );
Transform inverse();
Transform interpolateWith( Transform& t , float k );
}
Sinonimi comuni al posto di interpolate:
blend, mix, lerp
03-06-2016 Marco Tarini - Master Game Dev
Classi utili
di trasformazioni spaziali
Isometrie (rototraslazioni)
“Mantengono le distanze”
Rotaz + Traslaz
Similitudini (trasformaz. conformali)
“Mantengono gli angoli”
Rotaz + Traslaz + Scaling uniforme
Lineari (trasformaz. affini)
03-06-2016 Marco Tarini - Master Game Dev
Un’altra classe di trasf (senza nome) spesso usata nei Game Engines
Le trasformazioni ottenibili combinando:
Rotazioni Traslazioni
Scalature… ma anche NON uniformi
(un altro sottoinsieme delle trasformazioni affini) Utile in pratica
facile da specificare, abb. flessibile e intuitiva Bruttina in teoria
non e’ chiusa rispetto a combinazione :-O :-(
(e non mantiene… angoli, nulla)
03-06-2016 Marco Tarini - Master Game Dev
Come rappresento le trasf.
isometriche / conformali
Sotto problema: come rappresento le rotazioni
class Transform { // fields:
Rotation r;
float s; // scale Vec3 t; // translation
// methods: … }
class Rotation { // fields:
Mat3x3 m;
// methods: … }
Non
necessariamente cosi’!
stiamo per vedere valide alternative
03-06-2016 Marco Tarini - Master Game Dev
Osservazione
se la mia trasformazione è rappresentata da rotazione
+ traslazione
+ (eventualmente) scalatura allora la posso agevolmente
applicare (a punti e vettori)
cumulare (con altre trasformazioni)
invertire interpolare
a patto di saperlo fare con le rotazioni !
03-06-2016 Marco Tarini - Master Game Dev
Osservazione
Esempio: applicazione a punti e vettori
class Transform { // fields:
Rotation r;
Vec3 t; // translation
Transform applyToPoint( Vec3 p ){
return r.apply( p ) + t ; }
Transform applyToVector( Vec3 v ){
return r.apply( v ) ; }
}
nb: usata “a scatola chiusa”
03-06-2016 Marco Tarini - Master Game Dev
Osservazione
Esempio: interpolare transf
class Transform { // fields:
Rotation r;
Vec3 t; // translation
Transform mixWith( Transform b , float k ){
Transform result;
result.r = this.r.blendWith( b.r , k );
result.t = this.t * k + b.t * (1-k);
return result;
}
}
03-06-2016 Marco Tarini - Master Game Dev
Osservazione
Esempio: inversione
class Transform { // fields:
Rotation r;
Vec3 t; // translation
Transform inverse(){
Transform result;
result.r = this.r.inverse();
result.t = result.r.apply( -this.t );
return result;
}
}
NB!
(perchè?)
03-06-2016 Marco Tarini - Master Game Dev
Osservazione
Esempio: cumulare trassf
class Transform { // fields:
Rotation r;
Vec3 t; // translation
Transform cumulateWith( Transform b ){
Transform result;
result.r = this.r.cumulateWith( b.r );
result.t = b.r.apply( this.t ) + b.t;
return result;
}
}
NB!
(perchè?)
03-06-2016 Marco Tarini - Master Game Dev
Come rappresento (internamente)
una rotazione in 3D?
cioè anche gli orientamenti di un oggetto nello spazio
03-06-2016 Marco Tarini - Master Game Dev
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
03-06-2016 Marco Tarini - Master Game Dev
Rotazioni in R3:
quante possibili?
R0
(e ovviamente includono l’identità)
03-06-2016 Marco Tarini - Master Game Dev
Per paragone:
reppresentaz. delle traslazioni in 3D
Banale:
vettore di displacement (tre float)!
perfetta secondo tutti i criteri (verificare!)
03-06-2016 Marco Tarini - Master Game Dev
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°
03-06-2016 Marco Tarini - Master Game Dev
Per paragone:
reppr. delle rotazioni in 2D Passaggio angolo vettore
x y
α
03-06-2016 Marco Tarini - Master Game Dev
Per paragone:
reppr. delle rotazioni in 2D Passaggio angolo vettore
x y
α
pro tip: use atan2
03-06-2016 Marco Tarini - Master Game Dev
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?
03-06-2016 Marco Tarini - Master Game Dev
Reppresentazioni principali delle rotazioni
Matrici 3x3
quello tipic. usato durante il rendering (nella GPU)
03-06-2016 Marco Tarini - Master Game Dev
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
03-06-2016 Marco Tarini - Master Game Dev
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é?
03-06-2016 Marco Tarini - Master Game Dev
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)
03-06-2016 Marco Tarini - Master Game Dev
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
03-06-2016 Marco Tarini - Master Game Dev
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)
03-06-2016 Marco Tarini - Master Game Dev
Modo 2: angoli di eulero (3 floats)
In linguaggio nautico / areonautico:
angoli di “rollio, beccheggio, imbardata”
rollio (roll )
beccheggio (pitch )
imbardata (yaw )
03-06-2016 Marco Tarini - Master Game Dev
Modo 2: angoli di eulero (3 floats)
Implementaz.
fisica:
“mappamondo a tre assi”
03-06-2016 Marco Tarini - Master Game Dev
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)
03-06-2016 Marco Tarini - Master Game Dev
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?
03-06-2016 Marco Tarini - Master Game Dev
da: angoli di eulero a: matrice 3x3
Facile!
Il viceversa?
(solo a suon di conti e funz trigon. inverse)
03-06-2016 Marco Tarini - Master Game Dev
Recap: rappresentaz. di rotaz.
1/2 3x3 Matrix Euler Angles
Space 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… skew + scale! Free
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)GIMBAL LOCK
E f f i c i e n t / e a s y t o
03-06-2016 Marco Tarini - Master Game Dev
Reppresentazioni principali delle rotazioni
Matrici 3x3
Angoli di Eulero Asse + angolo
il metodo comunemente usato per es in fisica
03-06-2016 Marco Tarini - Master Game Dev
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
03-06-2016 Marco Tarini - Master Game Dev
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!
03-06-2016 Marco Tarini - Master Game Dev
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)
03-06-2016 Marco Tarini - Master Game Dev
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
03-06-2016 Marco Tarini - Master Game Dev
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è?)
03-06-2016 Marco Tarini - Master Game Dev
da: asse e angolo a: matrice 3x3
esercizio!
03-06-2016 Marco Tarini - Master Game Dev
Reppresentazioni principali delle rotazioni
Matrici 3x3
Angoli di Eulero Asse + angolo Quaternioni
03-06-2016 Marco Tarini - Master Game Dev
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
03-06-2016 Marco Tarini - Master Game Dev
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
03-06-2016 Marco Tarini - Master Game Dev
Da asse+angolo a quaternione
rotaz: di α attorno all’asse (a x , a y , a z ) quaternione:
q = s a x i + s a y j + s a z k + c con
c = cos( α / 2 ) s = sin ( α / 2 )
cioè q = ( s a x , s a y , s a z , c ) nota: || q || = 1
vett. unitario
verificare!
03-06-2016 Marco Tarini - Master Game Dev
Modo 4: “quaternioni” (4 float)
Applicazione: facillimo ;) ruotare p = x i+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
03-06-2016 Marco Tarini - Master Game Dev
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
03-06-2016 Marco Tarini - Master Game Dev
Recap: rappresentaz. di rotaz.
2/2 axis + angle (unitary) quaternion Space 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 f i c i e n t / e a s y t o
easy
(best results!)
not really super easy
flip di parte reale o imm.
super easy:
1 prodotto quat
easy:
2 prodotti quat
super easy
flip di asse o angolo
easy + good result
(except speed)4 scalars
(but precision needed)
03-06-2016 Marco Tarini - Master Game Dev
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)
03-06-2016 Marco Tarini - Master Game Dev
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)
03-06-2016 Marco Tarini - Master Game Dev
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)
convenzione: Rosso = X Verde = Y Blu = Z
03-06-2016 Marco Tarini - Master Game Dev
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 handles per trasl lungo assi e/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”
03-06-2016 Marco Tarini - Master Game Dev
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
convenzione: Rosso = X Verde = Y Blu = Z
03-06-2016 Marco Tarini - Master Game Dev
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
03-06-2016 Marco Tarini - Master Game Dev
Trasformazioni in Unity
Lineari (trasformaz. affini)
Similitudini (trasformaz. conformali)
“Mantengono gli angoli”
Rotaz + Traslaz + Scaling uniforme
Isometrie (rototraslazione)
“Mantengono la magnitudine”
Rotaz + Traslaz
anisotropico
class Transform
03-06-2016 Marco Tarini - Master Game Dev
Rotazioni in OpenGL
Nelle API «old school»: glRotate3f Asse e angolo
Internamente:
Matrici
(come tutte le altre trasformazioni spaziali)
03-06-2016 Marco Tarini - Master Game Dev
Reppresentare rotazioni
Matrici 3x3 Angoli di Eulero Asse + angolo Quaternioni
+ Traslazione
(displ. vec)
Matrici 4x4 (o 3x4) Dual Quaternions
roto-traslazioni
03-06-2016 Marco Tarini - Master Game Dev
Promemoria domande che ci siamo posti alla lavagna
Quale quaternione rappresenta:
la rotazione di 0 gradi (qualunque asse)?
la rotazione di 180 gradi attorno all’asse delle X?
quali angoli di eulero?
quale matrice 3x3?
idem, per rotaz di 90 gradi, asse delle Y
Verificare che coningando tali quaternioni con xi+yj+zk si ottengono i risultati attesi
rotaz del punto/vettore (x,y,z)
03-06-2016 Marco Tarini - Master Game Dev
Promemoria domande che ci siamo posti alla lavagna
Dato un quaternione che ruota di un certo asse e un certo angolo, cosa succede se:
flip di asse O di angolo flip di asse E di angolo angolo = angolo + 2 Pi
Applica ai quaternioni visti nei punti sopra (compreso l’ide)
(2 Pi) radianti, o 360°
03-06-2016 Marco Tarini - Master Game Dev
Promemoria domande che ci siamo posti alla lavagna
mondo
B
E F
G
T 0 T 1 T 2
T 3
T 4
T 5
T 6
C D
H L
T 7
03-06-2016 Marco Tarini - Master Game Dev
Promemoria domande che ci siamo posti alla lavagna
Quale è la trasformaz globale del nodo L?
Se rendo il nodo L figlio del nodo D (non più del suo attuale padre) , come devo modificare la sua trasf locale, affinchè non muti la sua posizione globale (in spazio mondo)?
Modifico la trasf locale associata al nodo L (T 7 ) moltiplicandola con una nuova trasf Tu, es una traslazione (magari dettata da un edit di uno scener).
cioè T 7 T 7 * Tu
cosa succede? L trasla di Tu, con la traslaz espressa nel frame locale di L (nello spazio oggetto di L)
Come devo modificare T 7 affinchè la trasformazione Tu avvenga invece nel frame globale (in spazio mondo)?
T 7 …?
03-06-2016 Marco Tarini - Master Game Dev