Corso di
Interazione Uomo-Macchina: Interfacce Grafiche
Commenti al file start.c
Il programma start.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 oggetto, 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 degli oggetti dal file di input
- visualizzazione della scena
- event handlers e callbacks
- main program
Caricamento dei dati e Visualizzazione della scena:
Ogni oggetto viene posto in una display list definita nelle
coordinate locali dell'oggetto. Dapprima la display list viene solo
memorizzata e non visualizzata [ved. funzione read_object].
Al momento di visualizzare l'oggetto, chiamo la display list corrispondente
dopo aver definito una trasformazione di modellazione che trasla l'origine
del sistema di riverimento locale nel punto di aggancio dell'oggetto
("colloca" l'oggetto al posto giusto nella scena).
Questa trasformazione e' posta tra glPushMatrix e glPopMatrix affinche'
agisca solo sull'oggetto in questione [ved. funzione show_object].
I punti di aggancio degli oggetti sono memorizzati in un array in
previsione di poter essere poi cambiati tramite le operazioni previste
per spostare gli oggetti [ved. variabili globali anchor_x, anchor_Y e
anchor_z].
Analogamente, altri due array tengono il colore corrente e la modalita'
di visualizzazione corrente di ciascun oggetto [ved. variabili globali
color e vis_mode].
La funzione che legge l'intero file e' read_scene. Questa si occupa anche
di allocare gli array relativi agli oggetti una volta letto il numero
di oggetti, 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' la seguente: l'occhio
si trova a distanza 1 dal centro della scena nella direzione
indicata tramite due angoli [memorizzati nel vettore globale view_ang],
di cui il primo specifica rotazione attorno a asse z, e il secondo
specifica rotazione attorno a un asse orizzontale parallelo al
piano della finestra.
La visualizzazione della scena avviene sotto l'effetto di due luci
(con componente diffusa): una bianca e una gialla, 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 gli oggetti, voi dovrete permettere di
cambiarlo oggetto per oggetto.