Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
vuoi
o PayPal
tutte le volte che vuoi
C C
Abbiamo osservato il mondo da tante angolazioni, ma era statico… ora vogliamo muovere
gli oggetti nella scena! E ci serve, indovina… una matrice! Chiamata WORLD MATRIX
Praticamente è la matrice che “muove” un oggetto dalle LOCAL COORDINATES (quelle
in cui l’oggetto è stato creato) nelle coordinate dello spazio, cioè le world.
La traslazione di un oggetto dal local al global equivale a traslare il “centro” dell’oggetto,
che non è il baricentro o qualcosa di fisico. È la coordinata (0 0 0) delle local coordinates.
La scelta di questo punto nel modello è importante: se stai creando una persona ha senso
mettere questo punto tra i piedi, in modo che quando sposti il personaggio in una certa
posizione quello ha i piedi per terra e non la testa per terra e il resto sta sotto il
pavimento :D
In generale per spostare un oggetto dalle local coordinates a quelle global servono tre
trasformazioni eseguite in quest’ordine:
- Scaling
- Rotazione
- Traslazione
Per quanto riguarda la rotazione, essa va compiuta con un certo ordine degli assi. Gli
ANGOLI EULERIANI sono dei parametri per definire la rotazione di un oggetto nello
spazio 3D. Questi angoli si chiamano ROLL (rollio), PITCH (beccheggio), YAW
(imbardata). Sono le rotazioni usate per gli aerei :D presentiamo queste rotazioni in un
sistema di coordinate z-up, poi vedremo y-up. Significa che la y positiva guarda a nord. Gli
oggetti 3D sono modellati in modo che guardino verso la x positiva.
Il ROLL è rotazione rispetto alla direzione in cui l’oggetto si muove. È appunto il rollio,
quello che aveva Vettel a Singapore nelle qualifiche per cui si sollevava una ruota. Un
angolo positivo fa ruotare l’oggetto in senso orario.
Il PITCH è quello che fa impennare le moto. Si fa con una rotazione lungo la y. Una
rotazione positiva fa puntare l’oggetto verso il basso.
Lo YAW è quando una macchina fa una curva. Si effettua lungo la z e una rotazione
positiva è in senso antiorario (zero gradi corrisponde a est e 90 gradi a nord).
Le rotazioni si fanno nell’ordine RPY (cioè xyz tenendo conto che la z guarda verso l’alto).
Nella convenzione y-up si mantiene l’ordine RPY in cui però ogni angolo è riferito ad un
asse diverso, cioè zxy (e gli oggetti guardano inizialmente l’asse z positivo, per cui tutte le
convenzioni sono da rivedere). Riassumendo scaling > rotation rpy > translation
La camera vista all’inizio di questa lezione segue gli angoli euleriani y-up ma gli angoli
sono negativi e le rotazioni positive vanno in senso antiorario… perché? Perché la
telecamera di base guarda verso la direzione negativa della z! E quindi cambiano i segni…
Un oggetto 3D quindi può essere posizionato usando 9 parametri: 3 di traslazione, 3 di
rotazione e 3 di scaling. La WORLD MATRIX sarà la combinazione di queste tre
trasformazioni (funziona per la nostra convenzione y-up):
M = T(p p p )*R (ψ)*R (θ)*R (φ)*S(s s s )
W x y z y x z x y z
Qui abbiamo usato gli angoli euleriani ma danno problemi in alcune situazioni… Hanno un
difetto chiamato GIMBAL LOCK. Il gimbal è un anello che può ruotare lungo il suo
diametro. Se abbiamo tre gimbal connessi uno dentro l’altro possiamo orientare un
oggetto in qualsiasi posizione vogliamo (è uno strumento usato per le fotocamere o i
telefoni). Il problema è che i movimenti sono connessi: quando modifichi lo yaw modifichi
anche il pitch e il roll, così quando modifichi il pitch cambi anche il roll. I tre parametri non
sono indipendenti. In pratica accade che se il pitch è di 90 gradi, lo yaw e il roll si fondono
e si perde un grado di libertà nella rotazione! Così si ha un lock e per poter muovere
liberamente l’oggetto devi fare movimenti complessi e strani a vedersi. L’oggetto segue
movimenti strambi e arbitrari e rende le animazioni delle schifezze. Questo problema si
risolve usando i QUATERNIONI che vedremo alla fine del corso. Gli angoli euleriani sono
comunque molto usati perché il gimbal lock è un problema che si verifica raramente in
molte applicazioni comuni. Si verifica laddove gli oggetti hanno libertà completa di
muoversi, per esempio nelle simulazioni spaziali e di volo in generale.
Quando abbiamo un oggetto 3D importato e lo dobbiamo inserire in un ambiente 3D,
servono una serie di trasformazioni:
- WORLD TRANSFORM
- VIEW TRANSFORM
- PROJECTION
- NORMALIZATION
- SCREEN TRANSFORM
Tutte le fasi a parte la normalizzazione si fanno con una matrice, quindi i primi tre passaggi
li puoi fondere in un’unica matrice.
Inizi che hai il modello 3D in coordinate locali, alle quali aggiungi la quarta coordinata
uguale a 1 per ottenere le coordinate omogenee. Moltiplicando questi punti con la world
matrix ottieni la prima trasformazione: sposti l’oggetto dalla posizione di creazione a
quella in cui vuoi l’oggetto nel mondo. Poi ti serve la view matrix, quella che ti permette di
vedere un oggetto da una certa posizione della telecamera (applichi la view matrix con la
tecnica look-in-direction oppure look-at). Poi applichi la projection matrix per decidere
come si devono vedere gli oggetti lontani. C’è un problemino qui… se la proiezione è
parallela, le coordinate risultanti sono già normalizzate. Ma con la proiezione in prospettiva
quelle che ottieni non sono normalizzate, vengono chiamate coordinate clipping e
capiremo il perché.
Siccome i primi tre passaggi sono moltiplicazioni con una matrice, puoi fonderle in
un’unica matrice detta appunto world-view-projection M = M * M * M
WVP P V W
La NORMALIZZAZIONE consiste nel dividere ogni coordinata con la quarta componente
in modo che essa sia uguale a 1. Per la proiezione parallela questo passaggio non serve.
L’ultimo passaggio, la screen transform, è quella che trasforma le coordinate
normalizzate in quelle hardware dei pixel viste nella prima lezione. Ma questi ultimi due
passaggi sono eseguiti internamente dal driver. L’utente invece imposta le prime tre
matrici.
L’ultima volta abbiamo praticamente finito di vedere come gestire i punti di un oggetto. Li
spostiamo ovunque dove vogliamo. Ma nella realtà i punti sono connessi tra loro e creano
oggetti con forme complesse. Uno potrebbe pensare: perché non rappresentare un
oggetto come un insieme di punti? In certe situazioni si usa, ma per un vero oggetto 3D
dovresti usare così tanti punti che sarebbe impossibile farlo (o comunque come
performance farebbe davvero schifo). Un oggetto con 10000 punti è ancora “vuoto”…
Innanzitutto rappresentiamo un oggetto attraverso la sua superficie e all’interno sono vuoti.
Per descrivere le superfici esistono numerosi strumenti matematici. La geometria
computazionale è quella branca a metà tra matematica e informatica che studia come
rappresentare oggetti geometrici con un calcolatore. Esistono le MESHES, le SUPERFICI
HERMITIANE, i NURBS, l’HSS e le METABALL. Noi ci basiamo sulle meshes, perché
qualsiasi metodo matematico viene ridotto a questo durante il rendering, è il modello
hardware.
Le mesh (superfici poligonali) sono oggetti che si possono descrivere come una serie di
poligoni contigui. Sfere, cilindri e coni NON sono meshes perché i cerchi non sono
poligoni. Tuttavia esistono dei trucchi per unire i poligoni in modo per cui anche se un
oggetto è una mesh appare comunque come se fosse una superficie continua. Ma
l’oggetto è sempre lo stesso!
Ricordati che un poligono è composto da FACCE (faces), LATI (edges) e VERTICI
(vertices). Un oggetto che ha ogni lato adiacente ad esattamente due facce è detto 2-
MANYFOLD. Ci sono oggetti in cui un lato è contiguo ad una sola faccia o a più di due:
questi sono oggetti non reali e un po’ strani, vanno gestiti con cura. Semplificano la
modellazione di alcuni oggetti (per esempio un’elica, una scatola che si può aprire, un libro
in cui ogni foglio è sottile...). Questi oggetti generano problemi con alcuni algoritmi che si
aspettano che l’oggetto sia 2-manyfold. Per questo d’ora in poi è implicito che
maneggiamo un 2-manyfold. È un po’ come lo scaling fatto con s = 0.
Una mesh è un insieme di… triangoli che condividono alcuni lati. Sai bene che se prendi
tre punti non allineati, quelli rappresentano un triangolo e tra essi passa un solo piano. Se
abbiamo un poligono con più di tre lati, lo possiamo ridurre ad un insieme di triangoli.
Questa operazione è detta TESSELLAZIONE ed è piuttosto semplice da fare. Ci sono
comunque diversi algoritmi per farlo, perché un poligono lo puoi spezzare in modi diversi e
alcune divisioni sono preferibili ad altre.
Le mesh sono codificate come un insieme di vertici. Ma i triangoli? Capiamo facilmente
che ogni vertice appartiene a più triangoli, quindi se per ogni triangolo indichiamo ogni
vertice, li ripetiamo un sacco di volte inutilmente… Per questo sono state create diverse
codifiche per i triangoli: TRIANGLE LISTS, TRIANGLE STRIPS, TRIANGLE FANS. La
triangle list è quella che per ogni triangolo indica i tre vertici, quindi non c’è nessuno
sharing. È utile quando i triangoli sono separati tra loro. Se tu scrivi nove vertici, ottieni tre
triangoli. Nel triangle strip i primi due vertici compongono una linea, poi ogni vertice
successivo forma un triangolo con i due vertici precedenti. Per codificare N triangoli ti
servono N+2 vertici. Infine nel triangle fan tutti i triangoli condividono un vertice. In pratica
il primo vertice è quello comune a tutti, poi ogni nuovo vertice forma un triangolo unendosi
al vertice precedente e al primo della lista. Anche qui servono N+2 vertici per codificare N
triangoli. Ci sono oggetti in cui la codifica più naturale è la strip, altri in cui è più naturale il
fan, e usare l’altro metodo è più complicato o magari impossibile. Ci sono persino figure
che non puoi codificare né con lo strip né con il fan e puoi o usare la list, oppure dividere
l’oggetto in due pezzi, uno codificato col fan e l’altro con lo strip. Sono tutti problemi di
geometria computazionale.
In alcuni casi i vertici devono comunque essere ripetuti. Tra l’altro essi in realtà non sono
codificati con solo 3 punti, ma ci sono altri parametri per consentire il rendering. Nelle
animazioni ogni vertice ha ben 8 parametri… che vedremo più avanti. Due vertici sono
uguali se tutti gli 8 parametri sono uguali, non basta la posizione. Come detto lo stesso
oggetto può essere codificato in più modi. In genere in una sfera i due poli sono codificati
con il fan, mentre gli anelli