GRAFICA TRI-DIMENSIONALE
Produzione di immagini di scene tridimensionali mediante elaboratore.
Processo di formazione di un'immagine
Due stadi fra loro indipendenti:
- Modellazione =
definizione della scena da visualizzare e del suo contesto
- Rendering = formazione dell'immagine
Modellazione
Definisce:
- gli oggetti geometrici che formano la scena e la loro
collocazione nello spazio
- informazioni che influiranno sull'aspetto degli oggetti
(es: colore, capacita' di reagire alla luce...)
- l'illuminazione (es: posizione delle sorgenti luminose, loro
intensita'...)
- il modo in cui la scena deve essere guardata
(es: come e' collocato l'osservatore, proprieta' della telecamera...)
L'output di questo stadio e' la scena pronta per essere guardata.
La modellazione e' fatta dal programmatore che scrive il codice
dell'applicazione grafica, servendosi delle funzioni messe a
disposizione da una libreria grafica (noi vedremo la libreria
OpenGL).
Rendering
L'input di questo stadio e' la scena con le sue informazioni di
contesto, prodotta dallo stadio di modellazione.
L'output di questo stadio e' l'immagine (matrice di pixel con valori di
colore, da inviare ad una finestra sullo schermo).
Il rendering e' fatto automaticamente dal sistema grafico
quando si esegue l'applicazione.
Gli oggetti e il loro aspetto
Il programmatore specifica la geometria degli oggetti mediante
primitive geometriche e il loro aspetto mediante attributi pittorici.
Primitive geometriche
La libreria grafica mette a disposizione primitive geometriche
cioe' tipi predefiniti di oggetti semplici.
Con queste primitive il programmatore costruisce gli oggetti della scena.
- Primitive 0-dimensionali = punti
- Primitive 1-dimensionali = segmenti, linee poligonali aperte o chiuse
- Primitive 2-dimensionali = triangoli, quadrilateri, poligoni
Le primitive sono descritte in termini di vertici, dove vertice =
coppia (in 2D) o terna (in 3D) di coordinate.
Le coordinate dei vertici sono espresse in un sistema
di riferimento, detto sistema di coordinate di modellazione
(MC = Modeling Coordinates).
Ciascun oggetto della scena e' descritto da un insieme di primitive.
Esempio: tetraedro descritto da 4 triangoli.
Attributi pittorici
Il sistema prevede attributi pittorici che influenzano
l'apparenza delle primitive quando sono rese.
-
Grandezza del marchio usato per i punti
-
Spessore del tratto usato per le linee
-
Modalita' di riempimento delle primitive 2-dimensionali
-
Proprieta' di materiale che determinano la reazione della primitiva
alla luce e quindi il suo colore (ved. dopo)
Gli attributi sono parte dello stato del sistema, non sono
associati alle singole primitive.
Una primitiva e' disegnata con gli attributi impostati
nello stato corrente del sistema.
Illuminazione
Gli oggetti sono visibili all'osservatore perche' la luce
(emessa da sorgenti luminose) colpisce le primitive e queste ne
riflettono una parte verso l'osservatore.
Fattori che entrano in gioco:
-
Sorgenti luminose: determinano la luce che colpira'
le primitive
-
Materiale: determina
la capacita' delle primitive di riflettere la luce
Tipi di luce
Distinguiamo tre tipi di luce in base al loro comportamento:
- luce ambiente
- luce diffusa
- luce speculare
Luce ambiente
Non proviene da una direzione particolare, non viene riflessa in
una direzione particolare.
Colpisce con la stessa intensita' ogni punto indipendentemente
dall'inclinazione della superficie a cui il punto appartiene.
Non utile a creare effetto 3D.
Attribuisce a un oggetto formato da facce con inclinazioni diverse
un unico colore uniforme.
Quindi l'oggetto appare come un'unica macchia di colore senza
effetto di tridimensionalita'.
Luce diffusa
Proviene da una direzione in particolare, non viene riflessa in
una direzione particolare.
Colpisce ogni punto con intensita' che dipende dall'angolo
formato dalla direzione della luce con la normale alla superficie
in quel punto.
E' quella che crea effetto 3D: facce con inclinazioni diverse
riflettono la luce con intensita' diversa.
L'intensita' con cui l'osservatore vede illuminata una faccia non
dipende dalla posizione dell'osservatore.
Luce speculare
Proviene da una direzione in particolare,
viene riflessa in una direzione in particolare.
L'intensita' con cui l'osservatore vede illuminata una faccia
dipende dalla posizione dell'osservatore.
Crea effetti di "luccichio" tipici di metalli o vetro.
Sorgenti luminose
Ogni sorgente e' caratterizzata da
- posizione nello spazio
- qualita' e quantita' di luce emessa
Posizione
Si considerano sorgenti puntiformi.
In base alla collocazione distinguiamo tre tipi di sorgenti:
- All'infinito:
posizionate in un punto (x,y,z,w) con w=0,
i raggi luminosi sono paralleli
- Al finito:
posizionate in punto (x,y,z,w) con w=1,
i raggi luminosi escono dal punto in tutte le direzioni
-
Spot:
al finito ma i raggi escono solo all'interno di un cono,
NON le consideriamo qui.
Luce emessa
Ogni sorgente luminosa emette tutti e tre i tipi di luce
(ambiente, diffusa, speculare).
Ciascun tipo ha un certo colore e intensita'.
La luce emessa da una sorgente e' descritta da una terna RGB per
ogni tipo di luce.
Il colore e' dato dalla proporzione fra rosso, verde, blu.
L'intensita' e' data dal valore.
Se un tipo di luce non e' emesso, la terna e' (0,0,0) = luce nera.
Proprieta' di materiale
Il materiale e' un attributo presente nello stato del sistema
che influenza le primitive.
Un materiale e' caratterizzato da:
-
quanta della luce ricevuta viene riflessa dalla primitiva
per ciascuno dei tre tipi di luce (ambiente, diffusa, speculare)
-
quanta luce e' emessa dalla primitiva stessa
(primitiva che "brilla di luce propria")
Un materiale e' descritto da una terna RGB per ciascun tipo di luce
e una terna RGB per la luce emessa.
Se un tipo di luce non e' riflesso dal materiale,
la terna e' (0,0,0) = nessuna riflessione.
Se il materiale non emette luce propria, la luce emessa e' (0,0,0) =
luce nera.
Interazione fra luce e materiale
Reazione alla luce ambiente:
si moltiplicano componente per componente la terna RGB
della luce ambiente e la terna RGB della reazione del materiale alla
luce ambiente.
Reazione alla luce diffusa:
si procede nello stesso modo che per la luce ambiente ma
il risultato si moltiplica per il coseno dell'angolo
formato dalla direzione della luce incidente con la normale
alla primitiva (=1 se la luce incide perpendicolarmente, 0
se e' radente).
Reazione alla luce speculare:
come per la luce diffusa ma alla luce riflessa e' attribuita
una direzione di riflessione e si moltiplica anche per il coseno
dell'angolo formato dalla luce riflessa con la direzione dello
sguardo dell'osservatore.
Le reazioni ai tre tipi di luci si sommano fra loro e si sommano
alla luce emessa.
Modularita' nella modellazione
Una scena e' composta di vari oggetti
(es: stanza con mobili), ed anche un singolo oggetto puo' essere
composto di parti (es: tavolo = 1 piano + 4 gambe, dove le gambe sono
uguali fra loro, cambia solo la posizione).
E' conveniente modellare separatamente ogni oggetto della scena
(o ogni parte di un oggetto).
Ciascun oggetto e' cosi' definito in un sistema di coordinate di
modellazione proprio, chiamato
sistema di coordinate di modellazione
(MC = Modeling Coordinates).
Poi si compone la scena collocando i vari oggetti in un sistema di
riferimento comune, detto sistema di coordinate della scena
o del mondo (WC = World Coordinates).
Si possono anche collocare piu' copie dello stesso oggetto in posizioni
diverse.
Per collocare un oggetto nella scena lo si sottopone a
trasformazioni geometriche:
traslazioni, rotazioni, scalature,
dette trasformazioni di modellazione.
Inoltre posso sottoporre ogni copia di un oggetto ad attributi
pittorici diversi.
Vantaggi dell'approccio modulare alla modellazione:
-
Scrivo meno codice (evito di replicare la definizione di oggetti
uguali).
-
Facile modificare la scena. Es: per spostare un oggetto
basta cambiare la trasformazione ad esso applicata (non devo
cambiare tutte le coordinate nelle primitive che lo descrivono).
L'osservatore
Specifiche di vista: descrivere dove e' collocato
l'osservatore rispetto alla scena o (equivalentemente)
la scena rispetto all'osservatore.
Ho la scena espressa in coordinate del mondo.
Devo dire al sistema grafico:
-
posizione dell'osservatore (un punto) = dove e' la telecamera
-
direzione di vista (un vettore) = verso dove la punto
-
direzione dell'alto (un vettore) = come la tengo girata
Trasformazioni di vista
In base a queste informazioni il pacchetto grafico porta la scena
in un altro sistema di coordinate, dette coordinate di vista
(view coordinates) o dell'occhio (eye coordinates),
che e' definito rispetto all'osservatore.
Per esempio, in OpenGL (altri sistemi hanno diverse convenzioni):
-
l'origine e' nel punto di vista
-
la direzione dell'asse y e' la direzione dell'alto
-
la direzione dell'asse z e' l'opposta della direzione di vista
-
la direzione dell'asse x e' t.c. la terna di assi xyz sia orientata
nel modo consueto
La trasformazione da coordinate del mondo a coordinate di vista
e' detta trasformazione di vista e consiste
in traslazione + rotazione.
La telecamera
Specifiche di proiezione e clipping:
descrivere la telecamera usata per guardare la scena.
Ho la scena collocata davanti all'osservatore (cioe' espressa
in coordinate di vista). Devo dire al sistema grafico:
- con che lente la guardo = tipo di
proiezione (ortogonale, prospettica):
stabilisce la scena come sara' deformata
- quanta parte ne inquadro = volume di vista:
cio' che cade fuotri dal volume di vista sara' tagliato
(clipping)
Tipi di proiezione
-
Proiezione ortografica: proietta con un fascio di rette parallele
tra loro e perpendicolari al piano di proiezione,
mantiene le proporzioni relative tra gli oggetti.
-
Proiezione prospettica: proietta con un fascio di rette centrate
nel punto di vista, non le mantiene le proporzioni (amplifica gli
oggetti vicini, riduce quelli lontani).
Volume di vista
La forma del volume di vista dipende dal tipo di proiezione:
Proiezione ortogonale
Parallelepipedo retto con facce allineate con le
direzioni dei piani coordinati del sistema di coordinate di vista.
Il parallelepipedo e' descritto dalle sue coordinate
xyz minime e massime.
- x fra left e right
- y fra bottom e top
- z fra near e far
Proiezione prospettica
Tronco di piramide le cui facce laterali convergono
nel punto di vista (= origine del sistema di coordinate dell'occhio),
e le cui basi sono parallele al piano xy dell'occhio.
- sulla base minore del tronco di piramide, le x sono fra left e right
- sulla base minore del tronco di piramide, le y sono fra bottom e top
- le z del tronco di piramide sono fra near e far
L'intervallo delle x e delle y sulla base maggiore del tronco di piramide
si desumono a partire dalle informazioni di cui sopra.
Trasformazioni di proiezione
In base alle specifiche di proiezione, il sistema trasforma la scena
(la parte di essa contenuta nel volume di vista) in un sistema di
coordinate normalizzato pronto per la trasformazione da 3D a 2D,
detto sistema di coordinate normalizzate di proiezione
(NPC).
NPC e' un cubo con intervallo di coordinate
prefissato (es: in OpenGL le coordinate sono tra -1 ed 1, in altri sistemi
sono tra 0 e 1).
Una coppia di facce del cubo e' parallela al piano
su cui dovra' essere formata l'immagine, le altre facce sono
parallele alla direzione di vista.
In openGL il piano immagine e' parallelo al piano xy del cubo
e la direzione di vista e' parallela all'asse z del cubo.
NOTA BENE: NPC e' ancora un sistema di riferimento tridimensionale!
Nel cubo viene mappato tutto e solo il contenuto del volume di vista,
deformandolo opportunamente.
Questa trasformazione e' detta trasformazione di proiezione.
-
Proiezione ortogonale: deformazione = scalatura (eventualmente
con fattori diversi nelle tre direzioni xyz).
Il parallelepipedo viene traslato e scalato per coincidere con il cubo NPC.
-
Proiezione prospettica: deformazione allarga la parte vicina
(verso la base minore del tronco di piramide) e restringe
la parte lontana (verso la base maggiore) in quanto entrambe
le basi del tronco di piramide devono essere rese uguali alla
faccia del cubo.
Deformazione prospettica
Il tronco di piramide viene deformato (dilatando la parte vicina,
restringendo la parte lontana) per coincidere con il cubo NPC.
Non e' una trasformazione rigida!
Vediamo come si deformano le coordinate x,y in una
trasformazione prospettica.
O = punto di vista (origine), P = (x,y,z) = punto nel volume di vista.
Nella trasformazione, il punto P riceve le stesse coordinate x ed y di
tutti gli altri punti
giacenti sulla retta congiungente OP, in particolare le stesse coordinate
del punto P' = (x',y',near) intersezione di OP con la base minore
della piramide.
Vediamo per esempio la coordinata y.
In figura la sezione con piano di taglio il piano x=0:
Il rapporto fra y' ed y dice quanto la y di P viene compressa/dilatata.
Sfruttando la similitudine fra i triangoli OHP e OH'P' otteniamo
y' = y * near/z
Piu' P e' vicino al punto di vista (z minore) e piu' la y viene dilatata.
Analogamente si ottiene x' = x * near/z
Poi viene eseguita la normalizzazione per ridurre l'intervallo dei
valori delle coordinate fra -1 ed 1.
Passaggio da 3D a 2D
Il contenuto del cubo NPC viene mappato in 2D schiacciandolo sul piano
di proiezione.
In OpenGL questo corrisponde ad uno schiacciamento lungo l'asse z.
Le primitive bidimensionali risultanti da questo schiacciamento sono
discretizzate mediante rasterizzazione per portarle in un sistema
di riferimento discreto solidale con la finestra di rendering.
Tale sistema di riferimento di arrivo e' chiamato device coordinates
o screen coordinates ed e' un sistema di coordinate intere
dove 1 unita' = 1 pixel.
Qui viene eseguita anche l'eliminazione delle parti nascoste:
quando due primitive diverse sono intersecate dallo stesso raggio visuale,
solo la piu' vicina all'osservatore e' visibile.
Pipeline di visualizzazione
Riepilogo della sequenza di trasformazioni geometriche a cui sono sottoposti
gli oggetti di una scena dalla fase di modellazione a quella di resa
grafica.
Pipeline di visualizzazione (corsivo = sistemi di coordinate,
stampatello = trasformazioni di coordinate):
coordinate di modellazione |
locali al singolo oggetto |
|
trasformazioni di modellazione |
posizionano gli oggetti nella scena |
|
coordinate del mondo |
globali della scena |
|
trasformazioni di vista |
stabiliscono posizione ed orientamento del
punto di vista rispetto alla scena |
|
coordinate di vista |
centrate nel punto di vista |
|
trasformazioni di proiezione |
stabiliscono tipo di proiezione e volume di vista |
|
coordinate normalizzate di proiezione |
scena tagliata e deformata,
pronta per il passaggio da 3D a 2D |
|
trasformazioni di workstation |
passaggio da 3D a 2D e discretizzazione in pixel
(rasterizzazione) |
|
coordinate del dispositivo |
espresse in pixel sulla finestra di output |