Laboratorio di Grafica Interattiva A.A. 2002-3

Esercizio 3

Argomento

Zoom e pan in OpenGL, inserimento di punti in OpenGL.

Files

Nessun file nuovo. Si parte da quelli dell'esercitazione precedente.

Esercitazione guidata

Prima tappa

Pensiamo la scena disegnata nella work area come fatta da due oggetti:

Vogliamo permettere operazioni di

Le operazioni di zoom e pan si possono intendere in due modi, da implementare entrambi:

  1. Cambio dimensioni e/o posizione alla primitiva, gli assi restano invarianti
  2. Cambio dimensioni e/o posizione all'intera scena, compresi gli assi

Per adesso l'utente invoca zoom battendo la sequenza di tasti "z+" o "z-" ed invoca pan usando i tasti freccia. La pressione di un tasto (per esempio "m" o "M") cambia fra i due modi. Il nuovo modo e' mostrato nella input/output area.

MODO 1

Nella versione attuale i due oggetti sono gia' definiti nello stesso sistema di coordinate. Le coordinate di modellazione di ciascuno di essi coincidono con le coordinate del mondo. La trasformazione di modellazione che li porta nel mondo e' la trasformazione identica.

Nella nuova versione la trasformazione di modellazione che agisce sulla primitiva/esempio e' una scalatatura (zoom) e/o una traslazione (pan).
Siccome l'oggetto ha coordinate di modellazione con origine nel baricentro, prima scalo (il baricentro resta fermo), poi traslo. In OpenGL le istruzioni vanno scritte in ordine inverso.
Ricordate di usare glPushMatrix e glPopMatrix per cambiare la matrice modelview solo temporaneamente mentre si sta disegnando una primitiva.

MODO 2

Le coordinate del mondo vengono scalate e traslate.
Siccome siamo in 2D, possiamo fare questo agendo indifferentemente sulla trasformazione di vista o su quella di proiezione:

Seconda tappa

Permettete all'utente di introdurre i vertici della primitiva cliccando sulla work area.

Si consiglia di definire una classe C++ che implementi il tipo "primitiva" e contenga le coordinate dei vertici in array e il numero di vertici presenti. Implementare:

Per il momento i comandi di cambio degli attributi (spessore di linea, colore ecc.) e i comandi di zoom/pan (modo 1) agiscono su tutte le primitive presenti.

Terza tappa

Aggiungete all'area menu' un menu' per selezionare una primitiva tra quelle presenti (indicandole con numeri da 1 a 5). La primitiva selezionata viene mostrata nella input/output area.

Fate in modo che i comandi di cambio degli attributi (spessore di linea, colore ecc.) agiscano solo sulla primitiva selezionata, mentre le altre mantengono inalterati gli attributi che avevano in precedenza.

Ognuna delle 5 primitive deve avere proprie variabili che tengano memoria dei suoi valori degli attributi. Queste variabili vanno aggiunte alla classe C++ che mantiene le informazioni sulla primitiva. Il costruttore assegna agli attributi valori di default, che l'utente potra' cambiare.

Usate glPushAttrib e glPopAttrib per avere un cambio temporaneo dell'attributo mentre si sta disegnando una primitiva:

Quarta tappa

Fate in modo che i comandi di zoom/pan (modo 1) agiscano solo sulla primitiva selezionata, mentre le altre mantengono inalterate dimensioni e posizione.

Ognuna delle 5 primitive deve avere proprie variabili che tengano memoria del fattore di scala e del vettore di traslazione. Queste variabili vanno aggiunte alla classe C++ che mantiene le informazioni sulla primitiva. Il costruttore ne inizializza opportunamente i valori.

Compito

Aggiungete all'area di menu' una sotto-area con funzionamento "a bottone" (tipo quella realizzata per mostrare/nascondere gli assi) che cambi tra la modalita' "grab" e la modalita' "view".

Disegnate due icone per le modalita' "grab" e view" (es: la mano e l'occhio) e usatele alternativamente sulla sotto-area bottone realizzata, a seconda dello stato corrente.