Anteprima
Vedrai una selezione di 10 pagine su 43
Appunti completi corso Computer Grafica Pag. 1 Appunti completi corso Computer Grafica Pag. 2
Anteprima di 10 pagg. su 43.
Scarica il documento per vederlo tutto.
Appunti completi corso Computer Grafica Pag. 6
Anteprima di 10 pagg. su 43.
Scarica il documento per vederlo tutto.
Appunti completi corso Computer Grafica Pag. 11
Anteprima di 10 pagg. su 43.
Scarica il documento per vederlo tutto.
Appunti completi corso Computer Grafica Pag. 16
Anteprima di 10 pagg. su 43.
Scarica il documento per vederlo tutto.
Appunti completi corso Computer Grafica Pag. 21
Anteprima di 10 pagg. su 43.
Scarica il documento per vederlo tutto.
Appunti completi corso Computer Grafica Pag. 26
Anteprima di 10 pagg. su 43.
Scarica il documento per vederlo tutto.
Appunti completi corso Computer Grafica Pag. 31
Anteprima di 10 pagg. su 43.
Scarica il documento per vederlo tutto.
Appunti completi corso Computer Grafica Pag. 36
Anteprima di 10 pagg. su 43.
Scarica il documento per vederlo tutto.
Appunti completi corso Computer Grafica Pag. 41
1 su 43
D/illustrazione/soddisfatti o rimborsati
Disdici quando
vuoi
Acquista con carta
o PayPal
Scarica i documenti
tutte le volte che vuoi
Estratto del documento

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

Dettagli
Publisher
A.A. 2017-2018
43 pagine
2 download
SSD Scienze matematiche e informatiche INF/01 Informatica

I contenuti di questa pagina costituiscono rielaborazioni personali del Publisher fiorixf2 di informazioni apprese con la frequenza delle lezioni di Computer graphics e studio autonomo di eventuali libri di riferimento in preparazione dell'esame finale o della tesi. Non devono intendersi come materiale ufficiale dell'università Politecnico di Milano o del prof Gribaudo Marco.