Algebra dei vettori 2/2
Prodotto dot / inner / interno / scalare Prodotto cross / vettoriale
Algebra di punti e vettori
Differenza fra punto e punto = vettore
Somma punto + vettore = punto
Ripasso:
base vettoriale
Insieme di
nvettoriasse (qui: x,y,z )
Ogni vettore v esprimibile univoc.
come combinaz dei vettori asse
I pesi della combinaz sono le coord di v
y
x
z
Chiralità di un frame
Un sistema di riferimento ortogonale può essere sinistrorso o destrorso
sinistrorso destrorso
z y x× =
Ricordiamoci di usare la STESSA MANO per immaginare il prodotto cross
z y xcomunque!× =
Ripasso: sistema di
riferimento (geometric frame)
nvettori asse
+
1 punto origine
Ogni vettore v
comb lineare degli n
assiOgni punto p origine
+ comb. lin. assi
y
x
z o
(base vettoriale)
Trasformazioni spaziali
Punto
originale
Punto
trasformato
f
Vettore
originale
Vettore
trasformato
f
Trasformazioni spaziali
Funzioni
input: un punto (oppure un vettore) output: un punto (oppure un vettore) punti e vettori:
rappresentati da coordinate
trasformazioni:
“cambiano le coordinate”
nuove coords = funz( vecchie coords ) p
f f f
q
q = (p) v = (u)
f f
Trasformazioni spaziali:
intro
Concetto molto generale…
Parte di molte strutture dati:
nello scene graph (trasf. di modellazione) nelle animazioni cinematiche
nelle animazioni rigged (skeleton based)
Vengono usate in molti processi
nel rendering, dalla GPU (vertex shader!) trasformazione di mollezione, di vista, di proiezione trasformano geometria e normali delle mesh renderizzate nella modellazione, interattivamente, dall’artista
x deformare un’intero oggetto o una sua sottoparte
f
Es 1: trasformazione spaziale di modellazione
Spazio Oggetto
Spazio Mondo
p
f f f
q
Es 2: trasformazioni nel rendering
Spazio Oggetto
Spazio Mondo
Spazio Schermo Spazio
Vista
Trasforamzione di Modellazione
Trasforamzione di Vista
Trasforamzione di Proiezione e Viewport
z
Object Coordinates
Dare ad ogni oggetto il suo sistema di coordiante privato:
il suoObject Space;
y
y
y
y x
x
x
x
z
z
z
z
y
x
Es: scene graph
Mondo
T1 T2 T3 T4
Object Space (spazio oggetto)
spazio oggetto
1
spazio oggetto (“spazio macchina”)
origineodello spazio oggetto
x y
-1 2 3 -2
-3
assixe ydello spazio oggetto
1 2 3
-1 -2 -3
Object Coordinates
1.5
2.3 p = (1.5, 2.3)
coordinate dip in spazio oggetto
x y
spazio oggetto (“spazio macchina”)
Object Coordinates
1.5 2.3
p = (1.5, 2.3)
spazio oggetto (“spazio macchina”)
coordinate di p in spazio oggetto
x y
x y
spazio mondo
= (12.5, 8.1) 8.1
12.5
coordinate di p in spazio mondo
1 1
Object Coordinates
p = (1.5, 2.3)
spazio oggetto:
(“spazio macchina A”)
coordinate in spazio oggetto
x y
= (9.7, 4.2) 7.4
22.5
spazio oggetto:
(“spazio macchina B”) coordinate in spazio mondo
p = (1.5, 2.3)
= (22.5, 7.4)
9.7 1
1 4.2
spazio mondo
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)
) ( )
( )
(
v0 v1 f v0 f v1f
α + β = α + β
Nota:
sono chiuse rispetto a combinazione
tr. affini similit.
isom.
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)
) ( )
( )
(
v0 v1 f v0 f v1f
α + β = α + β
Rappr. punti e vettori in coord omogenee
POSIZIONI
punto p di coordinate cartesiane ( x , y , z ) coordiante omogenee di p : ( x , y , z , 1)
DIREZIONI / SPOSTAMENTI
vettore v di coordinate cartesiane ( x , y , z ) coordiante omogenee di v : ( x , y , z , 0)
PRELIMINARE
Trasformazioni affini
Definizioni equivalenti:
trasf esprimibili con moltiplicaz con matrice4x4 con ultima riga: 0,0,0,1
si moltiplica la matr il vett di coordinate omogenee cambio di frame
(di origine + sistema di assi catesiani) da: spazio di origine a: spazio di destinazione trasflineari: cioè t.c.
tasformazioni di un tetraedro in un tetraedro (in 3D) (in 2D: di un triangolo in un triangolo)
) ( )
( )
(
v0 v1 f v0 f v1f
α + β = α + β
Trasformazioni affini:
cosa fanno
mantengono sempre:
rapporti fra volumi parallelisimo fra rette
non mantengono (in generale):
volumi, o aree, o angoli, o lunghezze o rapporti fra aree, o fra lunghezze
non includono:
defomazioni prospettiche
Trasformazioni affini:
cosa fanno
Rotazioni Traslazioni
(di punti – x le direzioni non ha senso)
Scalature
uniformi o non
Skewing
… e combinazioni
(infatti includono tutte le isometrie)
infatti la classe è chiusa rispetto a combinazioni…
(basta moltiplicare le matrici!)
Trasformazioni affini
(nelle GUI): come si possono specificare
nota: questi controlli familiari (piu’ la traslazione, effettuata con drag-and-drop) sono sufficienti a specificare ogni possibile trasf affine in 2D
[DEMO]
Trasformazioni affini
(nelle GUI): come si possono specificare
Controllers(concetto generale)
aka:handles(maniglie)
aka (specie in 3D): glifi(glyphs) o gizmos
Elementi delle GUI per specificare… cose
Esempio: handles per specificare le trasf affini in 2D:
rotaz
skew orizz
skew verticale scalatura
(uniforme)
scalatura (orizz) scalatura
(vert)
Trasformazioni Affini
• Si possono tutte esprimere come una moltiplicazione con 1 matrice 4x4
sempre
=
1 1 0 0 0 1
3 2 1
34 33 32 31
24 23 22 21
14 13 12 11
3 2 1
γ γ γ
α α α α
α α α α
α α α α
γ γ γ f
coordinate affini punto di partenza
= 1
3 2 1
δ δ δ
coordinate affini punto di arrivo
conta solo questo
Trasformazioni Affini
• Caso vettori
sempre
=
1 1 0 0 0 1
3 2 1
34 33 32 31
24 23 22 21
14 13 12 11
3 2 1
γ γ γ
α α α α
α α α α
α α α α
γ γ γ f
coordinate affini vettore di partenza
= 1
3 2 1
δ δ δ
coordinate affini vettore di arrivo
0 0 ...0
Esempio di riscrittura come matrice 4x4:
trasformazione di traslazione rigida
+
=
′
′
′
0 1 1
z y x
z y x
z y x
α α α
=
1 1 0 0 0
1 0 0
0 1 0
0 0 1
1
z y x
z y x f
z y x
α α α
posso riscriverla come:
e cioè:
+ + +
=
1 1
z y x
z y x
z y x
f α
α α
vettore di traslazione
Trasformazione di
Traslazione rigida
l'inversa è ovviamente:
=
1 0 0 0
1 0 0
0 1 0
0 0 1 ) , , (
z y x
z y
x α
α α α
α α T
−
−
−
=
−
−
−
− =
1 0 0 0
1 0 0
0 1 0
0 0 1 ) , , ( ) , ,
1(
z y x
z y x z
y
x α
α α α
α α α
α
α T
T
matrice di
traslazione:
Trasformazione di
Traslazione rigida
cosa succede se la applico ad un vettore ?
=
1 1 0 0 0
1 0 0
0 1 0
0 0 1
0
z y x
z y x f
z y x
α α α
0 0
= 0 z y x
) (γ S
matrice di scaling
Trasformazione di
Scalatura uniforme
x y
x y
=
1 1
z y x
z y x
f γ
γ γ
=
1 1 0 0 0
0 0
0
0 0 0
0 0 0
1
z y x
z y x
f γ
γ γ
Trasformazione di
Scalatura generica
x y
x y
=
1 1
z y x
z y x f
z y x
γ γ γ
) , ,
(γ x γ y γ z S
matrice di scaling
=
1 1 0 0 0
0 0
0
0 0 0
0 0 0
1
z y x
z y x f
z y x
γ γ γ
inversa?
Trasformazione di
Scalatura generica
x y
x y
nota: la scalatura applicata ai punti
"scala" anche la distanza dall'origine
Trasformazione di
Scalatura generica
• Osservazioni :
– Fattori di scala inferiori a 1 avvicinano l’oggetto al punto fisso di riferimento (origine)
– Fattori di scala maggiori di 1 lo allontanano – Se s
x≠ s
yo s
y≠ s
zle proporzioni dell’oggetto non
sono mantenute (scalatura non uniforme, o anisotropica )
– Se s
x= s
y= s
zle proporzioni sono mantenute e si ha una scalatura uniforme (o isotropica )
Shearing
• Lo spostamento proporzionale alla pos y
=
=
′
=
′ +
=
′
1 0 0 0
0 1 0 0
0 0 1 0
0 0 cot 1 ) (
cot
θ θ
θ
Hxy
z z
y y
y x x
Rotazione attorno all'asse z
(x’,y’)
(x,y)
x y
z
α ρ
α ρ
sin cos
=
= y x
partenza:
) sin(
) cos(
β α ρ
β α ρ
+
′=
+
′= y
arrivo: x
ρ
α
β
β β
β β
cos sin
sin cos
y x
y x
+
=
−
= β α ρ β α ρ
β α ρ β α ρ
cos sin sin
cos
sin sin cos
cos
+
=
−
=
Rotazione attorno all'asse z
(x’,y’)
(x,y)
x y
z
ρ
β β
β β
cos sin
'
sin cos
y x
y
y x
x
+
=
−
′=
=
1 0 0 0
0 1 0 0
0 0 cos sin
0 0 sin - cos )
( β β
β β
Z θ R
= +
=
′
′
′
1 cos sin
sin - cos
1 ) ( 1
z y x
y x
z y x z R
y x
Z
β β
β β
β
α
β
Rotazione attorno all'asse x, y, o z
=
1 0 0 0
0 1 0 0
0 0 cos sin
0 0 sin - cos )
( θ θ
θ θ
Z θ R
=
1 0 0
0
0 cos sin
0
0 sin - cos 0
0 0 0
1 )
( θ θ
θ θ θ
RX
=
1 0 0 0
0 cos 0 sin -
0 0 1 0
0 sin 0 cos )
( θ θ
θ θ
Y θ R
e le inverse?
T
1 ( ) ( )
)
(θ X θ X θ
X R R
R − = − =
Rotazioni generiche
• Una rotazione generica è definita da:
– angolo u , – asse v
– punto di applicazione p
f• come si fa?
da XKCD
http://xkcd.com/184/
Rotazione intorno ad un asse parallelo all'asse z
x y
z x
y z
x y
traslazione T-1
rotazione R x
y
traslazione T
1
2
3
1. Porto il centro di rot nell'origine 2. Ruoto
3. Rimetto a posto
Rotazione intorno ad un asse parallelo all'asse z
x y
z x
y
z
f( p ) T ( R ( T =
-1p ) )
x y
traslazione T-1
rotazione R x
y
traslazione T
1
2
3
Composizione di trasformazioni
• Moltiplicazione matrici (vettori) ha la propretà associativa
f( p ) = T ( R ( T
-1p ) )
= (T R T
-1) p
una matrice
M
4x4 che fa tutto.• considerazioni sull'efficienza
• cosa possiamo dire sulla forma di M ?
• cosa succede se moltiplichiamo un vettore per M ?
Punti VS vettori
x y
z x
y
z
M
p M( p)
v M( v)
p = ( * , * , * , 1 ) punto all'angolo della casa (punto) v = ( * , * , * , 0 ) velocità vettoriale del fumo (vettore)
Ripassino
• Attenzione all'inversione: (AB)
-1= B
-1A
-1• Associativa si, ma commutativa no!
AB ≠ BA
• previsione:
determinare il corretto ordine delle trasformazioni non sarà intuitivo
x y
x y
RT TR
1 trasformazione affine = 1 matrice 4x4
Caso generale :
Memorizzabile anche come:
Mat3x3 + Vec3
M 0 0
0 1 0 0 0
t
vettore 3sottomatrice 3x3 Rotazione + Scalatura + Skewing
Traslazione
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.
… }
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;
}
… }
Reppresentazioni 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
Perché è utile interpolare trasformaz:
esempio: animazioni
tempo 100
tempo 200 tempo 150
T 1
T 2 T i
?
Perché è utile cumulare trasformaz:
esempio: scenegraph
spazio mondo (globale) spazio oggetto ruota 1 spazio oggetto automobile
Perché è utile cumulare trasformaz:
esempio: scenegraph
T
cT0
T1 T2
T3
T4 T5 T6
“
T3seguito da T0
”
NOTA:
cumulazione di rotazioni NONcommuta!!! (in 3D)
Perché è utile invertire trasformaz:
switch between spaces
T T
-1
spazio mondo spazio oggetto A
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
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)
) ( )
( )
(
v0 v1 f v0 f v1f
α + β = α + β
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)
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
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 !
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 ) ; }
}
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;
} }
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è?)
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è?)
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
R10
R11
R12
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 es.!)
(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 es 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 applicareprodotti e somme, no trigonometria
Piu’ traslazione: matrice 4x4
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 molto usato nei software
di modellazione
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)
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 e invertire: problematico…
perché sommare e invertire 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)
Intutive?
(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 fic ie n t / e a s y t o