Laboratorio di Grafica A.A. 1997-98
Esercizio 4
L'argomento di questa esercitazione sono le luci in OpenGL.
Vedere anche le
note
che spiegano come usare le luci in OpenGL.
Trovate il seguente file:
es4.c,
programma che funziona come es3.c
della volta scorsa, ma con in piu' le luci ed alcune modifiche:
-
I due cubi sono colorati ciascuno di un colore uniforme
(il grande giallo, il piccolo azzurro), e illuminati da una luce
avente una componente diffusa.
Questo crea apparenza tridimensionale perche' ogni faccia riflette
la luce con intensita' diversa a seconda della sua inclinazione.
-
Nella display callback, sono state inserite le istruzioni
glMaterial per definire le proprieta' del materiale di cui
sono fatti i cubi rispetto alla luce.
Viene assegnato il materiale solo delle front faces perche'
tanto le back faces vengono eliminate con GL_CULL_FACE.
-
La definizione del cubo (funzione makeUnitCube) e' stata
rimpiazzata da due funzioni makeUnitCube_flat e
makeUnitCube_smooth, che sono alternative l'una all'altra e
solo una e' chiamata effettivamente.
La makeUnitCube_flat disegna il cubo assegnando a ogni faccia
una normale costante.
L'effetto e' di un cubo "sfaccettato" a facce piane.
La makeUnitCube_smooth usa normali ai vertici, dove lo stesso
vertice riceve la stessa normale anche quando e' usato in facce
diverse (la normale al vertice usata e' la media delle normali
alle tre facce incidenti).
L'effetto e' di un cubo "a spigoli smussati".
L'effetto di smussamento si vede meglio su oggetti dove le facce hanno
inclinazioni poco diverse tra loro, dove l'effetto e'
quello di una superficie curva.
Nel cubo gli angoli tra le facce sono troppo grandi.
-
Sono abilitate l'illuminazione e la prima luce
di OpenGL (luce GL_LIGHT0) nella funzione init.
-
E' definita la luce GL_LIGHT0 (funzione setLights chiamate nella display
callback) specificandone la posizione e le componenti RGB.
La luce e' bianca, il colore di ogni cubo e' determinato dalle
proprieta' di riflessione del suo materiale.
-
La funzione setLights puo' essere chiamata in vari punti
della display callback: per far rimanere la luce ferma
mentre gli oggetti si muovono, o per farla muovere
solidalmente con uno degli oggetti (ved. esercizi).
Provate a compilare ed eseguire.
Guardare nel codice le istruzioni relative alla parte nuova.
Provare a modificare il codice.
Premessa:
siccome es4.c e' solo una variante con luci di es3.c,
potreste voler riportare le modifiche relative
all'illuminazione nel codice di es3.c da voi modificato
la volta scorsa, e poi lavorare su quello
(non e' obbligatorio, sta a vostra scelta).
Le uniche cose cambiate sono la makeUnitCube (da sostituire
interamente, ricordarsi di trascrivere anche i vettori
di normali face_normals e vertex_normals),
la setLights (da aggiungere), la init e la display
dove bisogna aggiungere la roba relativa a materiali e luci.
Esempi di cose da provare:
- [1]
Usare makeUnitCube_smooth anziche' makeUnitCube_flat
e vedere che cosa succede.
- [2]
Cambiare i parametri delle luci e dei materiali
(glMaterial in display callback e glLight in setLights).
Verificare che, se la luce e' di un colore che il materiale
non e' in grado di riflettere (per es. luce solo blu e materiale
che riflette solo il verde), l'oggetto non e' illuminato.
Verificare che annullando la componente diffusa della luce,
l'oggetto appare piatto.
Che succede annullando la componente ambiente?
- [3]
Far si' che la luce si muova solidalmente con uno dei due
cubi (= che ruoti con esso).
Per ottenere questo, bisogna che la posizione della luce
subisca le stesse trasformazioni di modellazione a cui
e' soggetto il cubo, pertanto bisogna inserirla tra gli stessi
glPushMatrix e glPopMatrix dove si trova la definizione del cubo
in questione.
Questo e' gia' indicato da commenti nella display callback.
- [4]
Inserire la possibilita' di ruotare (o traslare)
tutta la scena nel suo complesso, con luce che si muove con la
scena oppure resta ferma mentre la scena si muove.
La trasformazione che agisce su tutta la scena va messa nella
display callback prima e fuori dalle glPush/glPopMatrix dei
due cubi.
La luce puo' essere definita (con setLights) prima oppure dopo
questa trasformazione, in modo da non essere oppure essere
trasformata assieme alla scena.
Nota: se state lavorando sul codice della volta scorsa e
avete gia' previsto la possibilita' di agire sulla trasformazione
di vista della scena, questa va benissimo come caso di trasformazione
che muove la scena nel suo globale (come gia' detto, si puo'
immaginare che la telecamera si muova rispetto alla scena,
o equivalentemente che la scena si muova rispetto alla telecamera).
- [5]
Inserire un'altra luce, magari colorata, o di tipo diverso
(posizionale, spot).
Far si' che una delle due luci resti ferma, e l'altra si muova
solidale con uno dei due cubi.