• Non ci sono risultati.

Marco Tarini -Video Game Dev Univ. InsubriaMath background 31Come rappresento (internamente) una rotazionein 3D?cioè anche gli orientamenti di un oggetto nello spazioRotazioniin R3: quantepossibili?

N/A
N/A
Protected

Academic year: 2021

Condividi "Marco Tarini -Video Game Dev Univ. InsubriaMath background 31Come rappresento (internamente) una rotazionein 3D?cioè anche gli orientamenti di un oggetto nello spazioRotazioniin R3: quantepossibili?"

Copied!
23
0
0

Testo completo

(1)

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

(2)

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!)

(3)

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)

25°

335° = -25°

Per paragone:

reppr. delle rotazioni in 2D

Passaggio angolo  vettore

x y

α

(4)

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?

(5)

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

(6)

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)

(7)

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)

(8)

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”

(9)

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?

(10)

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 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)

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

(11)

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

(12)

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)

(13)

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è?)

(14)

da: asse e angolo a: matrice 3x3

esercizio!

Reppresentazioni principali delle rotazioni

 Matrici 3x3

 Angoli di Eulero

 Asse + angolo

 Quaternioni

(15)

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

(16)

Da asse+angolo a quaternione

rotaz: di α attorno all’asse (a

x

,

ay

,

az

)

quaternione:

q = s ax

i +

say

j +

s az

k +

c

con

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

= 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

(17)

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

(18)

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 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)

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

(19)

Recap: representing rotations

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 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)

(20)

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)

(21)

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

(22)

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

0

v

1

f v

0

f v

1

f       

anisot ropico

class Transform

(23)

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)

Dual Quaternions

roto-traslazioni

Riferimenti

Documenti correlati

A simple rendering method is presented to avoid vertex seams in cylindrical and toroidal uv-mappings used for texture mapping (a vertex seam is a vertex dupli- cation of a

software tools, software eng., AI prog, CG prog, math, game design...). Mathematics for 3D

Marco Tarini - Video Game Dev Univ... Marco Tarini - Video Game Dev

Video Game Dev - Univ Insubria 2017/2018..

volumetric data, polygonal meshes, NURBS, splines, subdivision surfaces, LODs, multiresolution structures…. • 3D acquisition (catturare modelli 3D

un video game un game engine video game tools video game dev-teams. Skills e conoscenze che

Mathematics for 3D Game Progr. (3za ed)

– come sappiamo, cumulabile con qualunque altra trasf..