Laboratorio di Grafica A.A. 1997-98
Esercizio 1
Lo scopo di questa prima esercitazione e' familiarizzare
con le primitive di OpenGL e relativi attributi.
Trovate i seguenti files:
-
es1.c,
programma che apre una finestra grafica (mediante glut)
e visualizza un cubo all'interno di essa (mediante Mesa
- versione public domain di OpenGL),
con facce riempite ciascuna di un colore diverso.
Il programma non svolge interazione con l'utente.
Per terminare, distruggere la finestra usando il pulsante
di controllo nell'angolo in alto a sinistra.
-
makefile,
che compila es1.c utilizzando tutte le librerie necessarie
(Mesa, glut, e varie librerie X). Per compilare, digitare:
make PROG=es1
Provate a compilare ed eseguire.
Guardare il codice.
Le funzioni presenti sono:
-
polygon: definisce in OpenGL una faccia quadrangolare,
in un colore specificato.
-
colorcube: definisce il cubo mediante le 6 facce,
stabilendo il colore faccia per faccia, e la modalita'
di disegno "piena" per tutte le facce.
-
display: e' la funzione incaricata di disegnare
il cubo definito in colorcube:
azzera il contenuto del framebuffer (glClear),
abilita le capacita' di OpenGL rilevanti (glEnable),
posiziona il cubo nella scena
(manipolando la matrice di trasformazione
di modellazione), richiama la definizione del cubo
(colorcube), invoca l'aggiornamento del framebuffer
(glFlush) ed infine scambia front e back buffer
per visualizzare l'immagine.
-
main: inizializza glut,
stabilisce le caratteristiche che si desiderano per la
finestra, apre la finestra;
comunica al sistema che display e' la
funzione da chiamare automaticamente
quando la finestra deve essere ritracciata
(mediante display il programma ritraccia il contenuto dell'area
grafica; il window manager ritraccia autonomamente solo il
contorno della finestra e non il suo contenuto);
infine invoca il "main loop" di glut.
Provare a modificare il codice, per esempio:
- [1]
disabilitare il depth test e verificare
che, poiche' il cubo e' un oggetto convesso,
il face culling e' sufficiente
a garantire una visualizzazione corretta;
vedere invece che cosa succede
disabilitando anche il face culling.
- [2]
definire tutte le facce dello stesso colore e verificare
come viene reso il cubo (ricordo che siamo in assenza
di luci).
- [3]
cambiare il polygon mode (GL_POINT o GL_LINE
invece di GL_FILL); usare glPointSize e glLineWidth per
variare la dimensione di punti e linee.
- [4]
assegnare un colore diverso ad ogni vertice, e vedere
come il colore interno delle facce viene interpolato;
verificarlo anche sui lati di contorno in modalita' GL_LINE).
- [5]
disegnare una terna di assi cartesiani centrati nel
baricentro del cubo;
e' necessario che il depth test sia abilitato per una
corretta visualizzazione? (cfr. [1]).
- [6]
definire il cubo, o altra figura a piacere, usando
GL_TRIANGLES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN,
GL_QUADS, o GL_QUAD_STRIP.
- [7]
variare i parametri con cui viene costruita la matrice
di modellazione nella funzione display, e vedere che cosa succede;
- [8]
provare a disegnare due cubi in posizioni leggermente
diverse;
nota: agire su matrice MODELVIEW con
glTranslatef(float dx, float dy, float dz),
usare glPushMatrix e glPopMatrix - analogo di glPushAttrib e
glPopAttrib visti a lezione - per modificare la
matrice localmente a ciascuno dei due cubi;
nota: le trasformazioni vengono eseguite in ordine
opposto a quello in cui sono definite.
- [9]
trovare una posizione per cui i due cubi (cfr. [8] )
si intersecano, e verificare la necessita'
di depth test abilitato per avere una visualizzazione corretta
(il cull face da solo non basta piu', cfr. [1]).