GRAFICA TRI-DIMENSIONALE

Produzione di immagini di scene tridimensionali mediante elaboratore.

Processo di formazione di un'immagine

Due stadi fra loro indipendenti:

Modellazione

Definisce: 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. 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. 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:

Tipi di luce

Distinguiamo tre tipi di luce in base al loro comportamento:

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

Si considerano sorgenti puntiformi. In base alla collocazione distinguiamo tre tipi di sorgenti:

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:

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:

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:


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

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:

Tipi di proiezione

Volume di vista

La forma del volume di vista dipende dal tipo di proiezione:

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.

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