Laboratorio di Grafica Interattiva A.A. 2002-3

Esercizio 5

Argomento

Trasformazioni di vista e proiezione in 3D, display list in OpenGL.

Files

Nessun nuovo file, si continua da quelli dell'esercitazione precedente.

Esercitazione guidata

Prima tappa

Dividete l'area di lavoro in quattro parti, tutte visualizzano lo stesso solido sotto l'influsso di diverse trasformazioni di proiezione:

  1. proiezione ortografica vista dall'asse z (piano xy)
  2. proiezione ortografica vista dall'asse y (piano xz)
  3. proiezione ortografica vista dall'asse x (piano yz)
  4. proiezione prospettica
Per esempio la finestra puo' essere organizzata cosi':

Per adesso lasciate perdere la parte con proiezione prospettica e concentratevi sulle altre.

Mostrate un titoletto su ciascuna delle quattro parti che dica di che vista si tratta.

Mettete il disegno del solido in una display list che sara' chiamata per disegnare tutte le viste usando in ciascuna vista le trasformazioni opportune.
La funzione di disegno nella classe Solid ora non disegna piu' il solido ma genera la display list per quel solido, e va chiamata una sola volta all'inizio.
Le funzioni di disegno delle quattro viste (per ora tre) chiameranno la display list gia' creata.

Seconda tappa

Aggiungete l'interazione con l'utente nelle tre viste ortografiche.

L'utente puo' traslare il solido nelle due direzioni parallele al piano di proiezione, muovendo il mouse verso alto/basso sinistra/destra con il bottone premuto.
Le traslazioni effettuate in una vista si devono ripercuotere sulle altre viste.

Terza tappa

Realizzate ora la vista prospettica. In questa vista l'utente puo' ruotare il punto di vista attorno alla scena e il solido su se stesso.

La rotazione del solido su se stesso, effettuata nella vista prospettica, si deve ripercuotere sulle tre viste ortogonali. Viceversa le traslazioni effettuate nelle tre viste ortogonali devono ripercuotersi sulla vista prospettica.

Quarta tappa

Permettete all'utente di specificare a run-time il nome del file da cui caricare il solido. Rimpiazzate il vecchio menu' "primitiva" (che avevamo nel caso 2D), con un menu' "file" a due voci:

Caricare un nuovo solido automaticamente scarica quello presente.

Quando l'utente seleziona il caricamento di un solido, sulla input/output area si attiva una keyboard callback che accetta un carattere alla volta, formando man mano il nome del file (che viene mostrato all'utente), fino alla pressione del ritorno a capo.
Quando l'utente preme il ritorno a capo, il programma prova a caricare un solido dal file. In caso di successo, mostra il solido. In ogni caso, mostra nella input/output area un messaggio con l'esito dell'operazione (successo o fallimento).

Compito

Permettete il caricamento e la presenza contemporanea di piu' solidi che l'utente puo' ruotare/traslare e a cui puo' cambiare gli attributi indipendentemente.
Per ora il solido corrente e' selezionato da menu' in base a sua etichetta numerica, come si faceva in 2D per le primitive.

La voce di "scaricamento" del menu' "file" ora elimina il solido corrente. Il caricamento di un nuovo solido non provoca piu' lo scaricamento dei solidi gia' presenti.

Assumete un numero massimo di solidi (es. 20) che possono essere presenti contemporaneamente. Potete usare:

Quando l'utente sceglie "scaricamento" dal menu' "file", cancella il solido corrente, che puo' occupare una posizione qualsiasi nell'array di solidi. La posizione corrispondente viene marcata vuota nell'array di 0/1.
Quando l'utente sceglie "caricamento" dal menu' file, si cerca nell'array di 0/1 la prima posizione marcata vuota, e si mette il nuovo solido nella posizione corrispondente dell'array di solidi.