Laboratorio di Grafica Interattiva A.A. 2003-4

Esercizio 6

Argomento

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

Files

Si continua dai file dell'esercitazione precedente.
Inoltre (per la terza tappa) i file datafun.h e datafun.c definiscono la classe DataFunction che implementa una funzione graficabile costruita per interpolazione da un insieme di dati di rilevamento. I dati di rilevamento devono essere letti da file usando un metodo apposito della classe DataFunction.

Esercitazione guidata

Prima tappa

Dividete l'area di lavoro in due parti, entrambe visualizzano il grafico della stessa funzione sotto l'influsso di diverse trasformazioni di proiezione:

  1. proiezione ortografica vista dall'asse z (piano xy)
  2. proiezione prospettica

Inizialmente cercate di produrre due viste dello stesso grafico sotto le stesse trasformazioni, quelle usate nell'esercizio 5.
Successivamente (ved. tappa 2) imposterete le trasformazioni come richiesto.

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

Mettete il disegno del grafico 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 "disegnatrice" ora non disegna piu' il grafico ma genera la display list, e va chiamata una sola volta all'inizio.
Le funzioni di disegno delle due viste (per ora una) chiameranno la display list gia' creata.

Seconda tappa

Realizzate ora la vista ortogonale e quella prospettica.

Nella vista ortogonale visualizzate in sovraimpressione la semiretta radiale diretta dal centro della scena verso la posizione del punto di vista. Questo aiuta a capire da che parte stiamo guardando il grafico.
Perche' si veda sempre, anche quando il punto di vista e' sotto al grafico, potete disegnarla con z = il massimo.

Terza tappa

Permettete all'utente di cambiare a run-time la funzione di cui si visualizza il grafico. Questa puo' essere una funzione analitica (per es. le due suggerite nell'esercizio precedente) oppure una funzione da dati campionati (nuova classe DataFunction) letta da file.

Per le funzioni campionate l'utente deve specificare il nome del file da cui caricare i dati. Inizialmente potete prevedere una scelta obbligata fra un insieme prefissato di nomi. Potete mettere un menu' con una voce "scegli funzione" e un sotto-menu' contenente le varie opzioni (equazioni o nomi di file).

Sono dati due file di esempio: data10.txt (contiene 10x10 punti di fantasia) e marcy100.txt (contiene 100x100 punti campionati da Mount Marcy, USA).
Notate che il numero di righe e colonne della griglia usata per la visualizzazione puo' essere scelto indipendentemente dal numero di punti contenuti nel file. Pero' e' meglio che la griglia NON sia piu' fitta dei dati, altrimenti avremo un effetto a scalini dovuto al fatto che vertici adiacenti ricevono per interpolazione lo stesso valore. Il numero di punti campionati lungo la x e la y si puo' ottenere con apposite funzioni della classe DataFunction.

Quarta tappa

Permettete la presenza contemporanea di piu' grafici. Potete prevedere un massimo per es. di 5 grafici e tenerli in un array (come facevate con le primitive nel caso 2D). L'utente puo' selezionare un grafico alla volta e mostrarlo / nasconderlo, cambiare la funzione, cambiare gli attributi.
Inizialmente selezionate il grafico corrente da menu' in base a sua etichetta numerica, successivamente permettete di selezionarlo anche mediante click del mouse.

Inserite nella finestra un'area messaggi che mostra informazioni di stato:

Compito

(1)

Permettete all'utente di digitare il nome del file da cui caricare una funzione campionata. Quando l'utente seleziona questa opzione, si attiva una keyboard callback che accetta un carattere alla volta, formando man mano il nome del file (che viene mostrato all'utente nell'area messaggi), fino alla pressione del ritorno a capo.
Quando l'utente preme il ritorno a capo, il programma prova a caricare la funzione dal file. In caso di successo, mostra il grafico. In ogni caso, mostra nell'area messaggi un messaggio con l'esito dell'operazione (successo o fallimento).

(2)

Permettete all'utente di sottoporre a trasformazioni un grafico:

Da menu' potete selezionare la modalita' corrente (che verra' mostrata in area messaggi) e invocare le trasformazioni usando i tasti "+" e "-" (fattore maggiore o minore di 1 nella scalatura, angolo positivo o negatico di rotazione, traslazione positiva o negativa lundo l'asse selezionato).

Le trasformazioni sono di modellazione, agiscono sul grafico selezionato e non sugli altri. Le trasformazioni impostate permangono dopo che il solido e' stato disselezionato.
A tale scopo la classe "disegnatrice" dovra' memorizzare i parametri di queste trasformazioni.
Ricordate che l'ordine in cui applicate le trasformazioni e' rilevante!