• Non ci sono risultati.

E f fic ie n t / e a s y t o

N/A
N/A
Protected

Academic year: 2021

Condividi "E f fic ie n t / e a s y t o"

Copied!
16
0
0

Testo completo

(1)

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 Dev

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

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

(2)

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

(3)

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

(4)

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

(5)

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

(6)

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°

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

(7)

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

(8)

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

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

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

(10)

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

(11)

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

(12)

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

(13)

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

(14)

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

(15)

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

(16)

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

Riferimenti

Documenti correlati

GRAND BUFFET ROASTING IS A MINIMAL AND FUNCTIONAL LINE, ITS DESIGN REPRESENTS THE ITALIAN EXCELLENCE.. IT’S PERFECT FOR

persistenza della stessa. • Ricoverare le maestranze negli appositi locali e/o servizi di cantiere. b) Verificare la conformità delle opere provvisionali. c) Controllare che

*il contesto globale vede il valore e lo status sociale ed economico sempre più intrecciati con le capacità di stringere relazioni dinamiche di natura comunicativa ed

Moi je voulais un petit frère, mais papa et maman se disputaient tout le temps, et quand c’est comme ça impossible d’avoir des enfants… C’est pour ça que je me suis mise à

Obblighi dei lavoratori (art. Ciascuno dei lavoratori deve prendersi cura della propria salute e sicurezza e di quella delle altre persone presenti sul luogo di lavoro, su cui

Tutto ciò ha portato alla predisposizione, con l'avvallo della commissione contratti della Curia Mercatorum di Treviso, di 2 modelli di contratto a misura d'artigiano; una

Contiene corsi, giorni e orari delle lezione e i nomi delle insegnanti.  Avete a disposizione 4 iscrizioni a settimana, ma vi suggeriamo di dare continuità ai corsi scelti per

Tra le attività previste dal proget- to Savoir Faire, si inserisce il pre- sente lavoro relativo all’utilizzo di una moneta complementare per favorire lo sviluppo di imprese so-