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

Il sorgente e' diviso nelle seguenti sezioni:

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.