Laboratorio di Grafica A.A. 1997-98
Esercizio 3
L'argomento di questa esercitazione sono le varie trasformazioni
geometriche in OpenGL.
Vedere anche le
note
che spiegano la pipeline di trasformazioni geometriche in OpenGL.
Trovate il seguente file:
-
es3.c,
programma che disegna una scena composta da 2 cubi: un cubo grande
al centro, che ruota su se stesso premendo il tasto 's', e
un cubo piu' piccolo (inizialmente posto accando al precedente),
che ruota su se stesso premendo il tasto 'd' e attorno al cubo grande
premendo il tasto 'y'.
I due cubi sono entrambi realizzati chiamando una display list
"cubo unitario" dopo aver stabilito diverse trasformazioni di
modellazione (sulla matrice MODELVIEW) (funzione drawCuboid).
I due cubi sono inoltre posizionati uno rispetto all'altro
utilizzando sempre trasformazioni di modellazione
(nella display callback).
Infine, nella reshape callback, vengono stabilite le
trasformazioni di vista (sempre sulla matrice MODELVIEW)
e di proiezione (sulla matrice PROJECTION) che agiscono su
tutta la scena globalmente.
La trasformazione di vista e' assegnata dalla funzione
gluLookAt(punto di vista,centro della scena,up vector).
gluLookAt e' un'utility che fa "in un colpo" cio' che potrei fare a
mano con traslazioni e rotazioni della scena.
La trasformazione di proiezione puo' essere ortogonale o
prospettica.
La trasformazione ortogonale e' assegnata dalla funzione
glOrtho(xmin,xmax,ymin,ymax,zmin,zmax) che stabilisce un volume
di vista uguale a un parallelepipedo con lati paralleli agli assi
delle coordinate di vista.
La trasformazione prospettica e' assegnata dalla funzione
gluPerspective(angolo di apertura,aspect ratio,zmindist,zmaxdist),
che stabilisce un volume di vista uguale a un tronco di piramide
con basi situate a distanza zmindist e zmaxdist dal punto di
vista lungo la direzione dell'asse z negativo delle coordinate
di vista, con angolo di apertura ed aspect ratio di base specificati.
Provate a compilare ed eseguire.
Guardare il codice e i commenti che danno piu' dettagli di
quanto scritto sopra.
Provare a modificare il codice, per esempio:
- [1]
Cambiare la trasformazione di proiezione da ortogonale
a prospettica (commentando glOrto e scommentando
gluPerspective nella reshape callback).
- [2]
Modificare la trasformazione di vista (agire sui parametri della
gluLookAt) per guardare la scena da un'altra angolazione:
in particolare provare a cambiare la posizione del
punto di vista (primi 3 parametri) e il verso dell'alto
(up vector, ultimi 3 parametri).
- [3]
Animare il programma facendo si' che i due cubi ruotino
continuamente (scrivere una idle callback che incrementi
i valori degli angoli di rotazione).
- [4]
Dare all'utente la possibilita' di far traslare il cubo
piccolo avanti e indietro nelle tre direzioni spaziali
rispetto al cubo grande (anziche' farlo ruotare).
Nota: incompatibile con [3].
- [5]
Dare all'utente la possibilita' di cambiare interattivamente
la trasformazione di vista (parametri della gluLookAt), consentendo
di fare una o piu' delle seguenti cose:
cambiare il punto di vista (primi 3 parametri,
=muovere la telecamera attorno alla
scena, lasciandola puntata sulla scena),
cambiare l'up vector (ultimi 3 parametri, =inclinare la telecamera),
cambiare il centro della scena inquadrata (secondi 3 parametri,
=puntare la telecamera da un'altra parte).