Laboratorio di Grafica A.A. 1997-98
Esercizio 2
Lo scopo di questa esercitazione e' entrare piu' a fondo nei
meccanismi di Glut per gestire l'input dell'utente,
e contemporaneamente
familiarizzare con le trasformazioni di OpenGL in 2D.
Trovate i seguenti files:
-
schema.c,
scheletro di programma che associa una callback (stupida) ad
ogni tipo di evento catturato da Glut.
-
I file star.c
e hanoi.c,
che mostrano esempi di trasformazioni 2D.
-
Il makefile,
e' lo stesso dell'altra volta. Per compilare, digitare:
make PROG=nome sorgente senza .c
Le cose da fare si dividono in tre punti, di cui si consiglia di fare
(a) per primo; (b) e (c) dopo (a) in qualsiasi ordine tra loro.
(a) Guardare il codice di star.c, hanoi.c e schema.c
per capire che cosa fanno e come:
-
Hanoi realizza una pila di rettangoli di diverse dimensioni
scalando e riposizionando opportunamente un quadrato di
diagonale (0,0)-(1,1).
Le trasformazioni geometriche sono usate in due posti:
in drawHanoi per comporre la scena, e in trasfScene per
spostare tutta la scena in blocco e scalarla affinche' stia nella
parte di piano inquadrata per default da OpenGL.
Ricordare che le trasformazioni sono specificate in ordine
inverso all'ordine in cui sono applicate.
-
Star realizza una "stella" attraverso diverse istanze del quadrato
unitario, ciascuna scalata per diventare un rettangolo, e ruotata.
Anche qui le trasformazioni sono usate in due posti: prima per
comporre la scena e poi per spostarla nell'area inquadrata da OpenGL.
-
Notare l'uso di glClearColor per avere lo sfondo bianco anziche' nero.
-
Schema definisce una callback per ogni tipo di evento previsto da Glut.
Per capire come funziona ciascuna, si consigla di commentare tutti
i glutXXXXFunc nel main eccetto quello interessato (lasciare pero'
la display callback!).
(b) Provare ad integrare alcune callback (prese da schema.c)
in uno dei due files
(per esempio hanoi.c) facendo in modo che:
- [1]
premendo '+' nella finestra, la scena venga ingrandita, e premendo
'-' venga rimpicciolita (il centro della scena deve restare fermo).
- [2]
Premendo le frecce, oppure i tasti 'l','r','u' e 'd''
la scena venga traslata a sinistra, destra, in alto e in basso.
- [3]
Premendo un bottone del mouse la scena ruoti di un certo angolo in
senso antiorario, attorno al centro della scena stessa
(se avete fatto il punto [2], escludete in un primo momento
le traslazioni perche' rendono le cose piu' complicate).
- [4]
Come [3], ma la rotazione continui fino a che non si prema di nuovo
un tasto (usare la idle callback).
- [5]
Dopo aver fatto [4], implementare la sospensione della rotazione
quando la finestra non e' visibile.
(c) Realizzare un programma che legge una scena
(per es. il file di input
contiene il nome di una primitiva OpenGL in testa, e poi una
sequenza di punti come coppie di coordinate), e la visualizza
opportunamente scalata e centrata nell'area grafica.