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: Si compila con il solito makefile.

Il sorgente e' diviso nelle seguenti sezioni:

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.