Laboratorio di Grafica Interattiva A.A. 2002-3

Esercizio 8

Argomento

Illuminazione in OpenGL.

Files

Nessun nuovo file, si continua da quelli dell'esercitazione precedente.

Esercitazione guidata

Prima tappa

Colorate le facce di un solido tutte dello stesso colore (non di colori diversi come fatto finora) e introducete un'illuminazione con (anche) luce diffusa che evidenzi la tridimensionalita'.

Mentre prima l'utente controllava il colore del solido impostando due colori (che si andavano a sfumare uno nell'altro per le varie facce) ora lo controllera' impostando un solo colore, che viene usato per definire il materiale del solido.

Per far funzionare correttamente l'illuminazione diffusa, dovete assegnare ad ogni faccia del solido la sua normale. Modificate in questo senso la funzione di disegno della classe C che implementa il solido. Avete visto nell'esercizio 7 come si calcola il vettore normale ad una faccia.

Si consiglia di illuminare la scena con una luce bianca, in quanto questa e' in grado di essere riflessa sempre, qualunque sia il colore del materiale di un solido. Usando una luce colorata infatti si rischia che alcuni solidi non siano illuminati (es. se il materiale di un solido riflette il rosso e la luce e' verde, il solido non risulta illuminato).

Usate la sorgente luminosa GL_LIGH0 che ha valori RGB di default per luce ambiente e luce diffusa non nulli e sensati. Se lo ritenete opportuno cambiate pure questi valori tenendo conto che:

La posizione della sorgente incide molto sull'effetto della luce diffusa. Per iniziare potete lasciare la posizione di default (luce proveniente da dietro il punto di vista e diretta verso la scena), nella prossima tappa gestiremo la posizione.

Anche le primitive 1D (gli assi cartesiani) risentono della luce diffusa e per certe angolazioni possono risultare molto bui e poco visibili.
Per evitare questo problema assegnate agli assi un materiale che emetta luce propria del colore dell'asse.
Ricordate di riassegnare la luce emessa del materiale a nera (nessuna luce) dopo aver disegnato gli assi. In caso contrario, essendo un parametro di stato, agirebbe anche sulle primitive successive.

Seconda tappa

Provate due diverse possibilita' per gestire la posizione della sorgente luminosa:

  1. la posizione della sorgente e' fissa rispetto alla scena, cioe' quando (nella vista 3D) ruoto il punto di vista intorno alla scena, la scena resta illuminata sempre nello stesso modo (le facce illuminate restano illuminate. quelle in ombra restano in ombra)
  2. la posizione della sorgente e' fissa rispetto all'osservatore, cioe' quando (nella vista 3D) ruoto il punto di vista intorno alla scena, le facce illuminate cambiano (es. la luce proviene sempre da destra rispetto a chi guarda, e dopo ruotata la scena le facce a destra sono delle altre)

La sistuazione 1 si ottiene mettendo l'istruzione glLight(GL_LIGHT0,GL_POSITION,...) DOPO la trasformazione che ruota la scena rispetto al punto di vista, in modo tale che la sorgente luminosa ruoti assieme alla scena. In questo caso posizione della sorgenete e' definita in coordinate del mondo.

La sistuazione 2 si ottiene mettendo l'istruzione glLight(GL_LIGHT0,GL_POSITION,...) PRIMA della trasformazione che ruota la scena rispetto al punto di vista, in modo tale che la sorgente luminosa resti ferma rispetto al punto di vista, mentre la scena ruota. In questo caso posizione della sorgenete e' definita in coordinate di vista.

La posizione della sorgente luminosa incide solo sugli effetti della luce DIFFUSA emessa dalla sorgente, non sugli effetti della luce ambiente. Infatti solo la luce diffusa proviene dalla posizione della sorgente. La luce ambiente, anche se associata alla sorgente, e' indipendente dalla sua posizione.

Compito

Introducete una seconda sorgente luminosa, gestite la prima sorgente come fissa rispetto al punto di vista, la seconda come fissa rispetto alla scena.

Come seconda sorgente usate GL_LIGHT1, a cui dovete assegnare opportumamente i lavori RGB della luce emessa. Infatti, a differenza che per GL_LIGHT0, per questa e le successive luci i valori RGB di default corrispondono a luce nera, cioe' nessuna luce.

Per riuscire a vedere la differenza tra le parti illuminate dalla prima e dalla seconda luce, potete assegnare un colore diverso dal bianco alla seconda luce. Tenete pero' presente che su alcuni solidi (quelli con materiale che non riflette il colore della luce), l'effetto non sara' visibile.