Laboratorio di Interfacce Grafiche
Esercizio 3 (OpenGL)
Punto di partenza
Partite dal programma esempio Simple3D.java
che visualizza una piramide e permette all'utente di
fare orbitare il punto di vista attorno alla scena in base a due angoli
(latitudine, longitudine).
La scena consiste di un solo oggetto definito gia' in coordinate del mondo
e centrato nell'origine.
La trasformazione di vista consiste in:
rotazione attorno all'asse z (di angolo longitudine), rotazione
attorno all'asse x (di angolo latitudine), traslazione per portare
il punto di vista ad una certa distanza dalla scena.
Notare che nel codice devono essere scritte in ordine inverso.
Importante: per eseguire l'esempio occorre anche compilare
BasicGL.java, in quanto Simple3D
e' sottoclasse di BasicGL.
(1) Trasformazioni di proiezione
-
Sostituire la trasformazione di proiezione di default con una
controllabile dall'utente.
Per esempio potete usare una traformazione ortografica
(istruzione glOrtho) che inquadri un volume di vista
cubico di diagonale (-k,-k,-k)-(k,k,k) dando all'utente la
possibilita' di controllare il valore di k.
Un intervallo di variabilita' ragionevole per k e',
per esempio, fra 1 (corrispondente al default) e 10.
(2) Trasformazioni di modellazione
-
Considerate le due primitive wall e wall_with_hole
(contenute in questo file)
che disegnano rispettivamente
- wall una parete quadrata giacente sul piano
z=0 con diagonale (0,0)-(1,1)
- wall_with_hole una parete quadrata con foro
quadrato al centro, sempre giacente sul piano z=0,
il quadrato grande ha diagonale (0,0)-(1,1), il quadrato
piccolo (il foro) ha diagonale (0.3,0.3)-(0.7,0.7)
-
Con queste due primitive di base, replicandole piu' volte sotto
l'azione di opportune trasformazioni di modellazione, realizzare
una scatola cubica con foro su una parete, e sostituirla alla
piramide.
Colorare le 6 pareti della scatola con colori diversi
Suggerimenti
Supponiamo di costruire la scatola usando il quadrato definito da
wall cosi' come e' per pavimento e collocando il coperchio
sul piano z=1
Le trasformazioni a cui vanno soggette le due primitive per formare
pavimento, coperchio e le 4 sponde della scatola sono:
-
wallpavimento
-
wall_with_holetraslazione di 1 lungo asse z
coperchio
-
wallrotazione di 90 attorno asse x
sponda 1
-
wallrotazione di 90 attorno asse y
sponda 2
-
wallrotazione di 90 attorno asse y
traslazione di 1 lungo asse x
sponda 3
-
wallrotazione di 90 attorno asse x
traslazione di 1 lungo asse y
sponda 4
Quello indicato dalle frecce e' l'ordine di ESECUZIONE delle trasformazioni.
Ricordare che nel codice OpenGL le trasformazioni vanno scritte in
ordine inverso a quello di esecuzione.
Il colore diverso dato alle 6 pareti della scatola aiuta a capire, nel
caso, quali pareti non sono collocate al posto giusto.
(3) Display list
- Inserire la definizione delle due pareti di base in due display list
e riscrivere la definizione della scatola mediante chiamate alle
display list.
(4) Illuminazione
-
Abilitare l'illuminazione ed introdurre una sorgente luminosa
(potete usare GL_LIGHT0 con i valori di default per
GL_AMBIENT e GL_DIFFUSE).
Colorare tutte le facce della scatola con lo stesso colore e
vedere come l'illuminazione rende l'effetto di tridimensionalita'.