Corso di
Interazione Uomo-Macchina: Interfacce Grafiche
Commenti al file startbis.c
Il programma startbis.c
e' uno "scheletro" da cui si puo' partire per lo sviluppo
dell'esercitazione.
Esso implementa gia' le parti relative a:
-
lettura di un file nel formato indicato, creazione delle primitive OpenGL
corrispondenti ad ogni prisma, e loro visualizzazione
-
una rudimentale illuminazione della scena
-
rotazione del punto di vista attorno alla scena visualizzata.
Si compila con il solito makefile.
Il sorgente e' diviso nelle seguenti sezioni:
- macro e variabili globali
- caricamento dei prismi dal file di input
- visualizzazione della scena
- event handlers e callbacks
- main program
Caricamento dei dati e Visualizzazione della scena:
Ogni prisma viene posto in una display list. La display list
viene solo memorizzata e non visualizzata [ved. funzione read_prism].
Le componenti RGB dei colori dei prismi sono memorizzati in tre array
in previsione di poter essere poi cambiati tramite le operazioni previste
per spostare gli oggetti [ved. variabili globali red, green, blue].
Analogamente, un altro array contiene la modalita' di visualizzazione
corrente di ciascun prisma [ved. variabile globale vis_mode].
Al momento di visualizzare un prisma, chiamo la display list corrispondente
dopo averne definito il colore e la modalita' di visualizzazione
[ved. funzione show_prism].
Nella versione finale del programma dovranno anche essere
applicate al prisma trasformazioni di scalatura.
Tali trasformazioni andranno poste tra glPushMatrix e glPopMatrix
affinche' agiscano solo sul prisma in questione.
La funzione che legge l'intero file e' read_scene. Questa si occupa anche
di allocare gli array relativi ai prismi una volta letto il numero
di prismi, e di inizializzarli coi valori di default.
Le trasformazioni di vista e proiezione per la scena sono definite nella
funzione view_scene.
La trasformazione di proiezione e' ortogonale, il volume di vista
e' centrato in (0,0,0) e le sue tre dimensioni sono il doppio della diagonale
del bounding box della scena.
la trasformazione di vista e' specificata con gluLookAt, l'occhio
si trova a distanza 1 dal centro della scena nella direzione
indicata tramite due angoli [memorizzati nel vettore globale view_ang],
il suo "alto" e' la direzione dell'asse y.
Nella sua versione attuale il programma consente di controllare la
posizione dell'occhio [vettore globale view_ang] ma non il suo alto:
si potrebbe provare a variare anche quello.
La visualizzazione della scena avviene sotto l'effetto di due luci
(con componente diffusa), entrambe bianche, collocate all'infinito
in direzioni opposte [definite in funzione set_lights].
Sicuramente questa NON e' l'illuminazione ottimale, ma e' una base di
partenza su cui lavorare.
La funzione che visualizza tutta la scena e' show_scene.
Event handlers, callback e main program:
Il programma crea due form: una contenente solo la canvas, l'altra
contenente controlli per muovere il punto di vista intorno alla scena
(due slider), per cambiare il modo di rendering wireframe/solid e per
uscire (due bottoni).
NON e' l'organizzazione ottimale dell'interfaccia, ne' quella suggerita o
consigliata! In questo programma-esempio e' stata fatta questa scelta
perche' manteneva ben separate le parti OpenGL/Interazione e quindi era
DIDATTICAMENTE piu' facile da spiegare. Ogni gruppo faccia la sua scelta
autonoma a questo proposito.
La canvas ha event handler per gestire gli eventi Expose (= l'evento che
la finestra sia resa visibile: ridisegna la scena) e ConfigureNotify (=
l'evento che la finestra cambi dimensione: aggiorna le dimensioni della
viewport).
La form di controllo ha due slider per controllare gli angoli
di rotazione del punto di vista attorno alla scena [vettore globale
view_ang], e un bottone per cambiare il modo di visualizzazione. Nota:
questo ultimo lo cambia a tutti i prismi, voi dovrete permettere di
cambiarlo prisma per prisma.