Laboratorio di Grafica A.A. 1997-98
Esercizio "buono per l'esame" N. 1
Scopo:
Creare un programma che legge un file di input contenente triangoli,
visualizza tali triangoli, e
consente di compiere trasformazioni geometriche della scena visualizzata.
Consegna:
Il sorgente, da copiare sul mio dischetto
(che faro' passare), chiamandolo xxxx.c dove
xxxx e' il nome di uno dei componenti del gruppo.
Nota bene: perche' la prova sia valida, TUTTI i componenti
del gruppo devono essere presenti. Ci sara' un esercizio di recupero
per i gruppi che dovessero "saltare" una delle quattro prove.
Segue:
- che cosa vi diamo
- che cosa dovete fare
- note utili (LEGGETELE!)
Che cosa vi diamo:
-
Il modulo di lettura del file di input,
costituito dai files
parser.h
e parser.c.
Il file parser.c potete considerarlo come scatola
nera (NON GUARDATELO NEMMENO!), che contiene l'implementazione
di quanto dichiarato in parser.h.
Il file parser.h dichiara:
-
la funzione read_triangles(FILE * fd),
che legge il file di input e carica i triangoli in una struttura dati.
-
la struttura dati, vedere i COMMENTI NEL FILE che
spiegano come e' fatta.
-
alcune variabili globali utili (come
gli estremi della bounding box della scena, vedere
i COMMENTI NEL FILE), che sono anch'esse
inizializzate dalla funzione read_triangles mentre legge i triangoli.
-
Il vostro programma andra' a costituire un altro modulo,
chiamiamolo xxxx.c, che conterra' in testa la linea
#include "parser.h", e
dovra' essere compilato linkandolo con parser.c.
Vi forniamo il
Makefile
adatto a questo.
Si compilera' con: make xxxx, creando l'eseguibile xxxx.
-
Alcuni file di input:
cubo.tri
(cubo = 12 triang),
pira.tri
(piramide = 6 triang),
stella.tri
(stella 3D = 24 triangoli),
terreno.tri
(85 triangoli),
shape.tri
(346 triangoli).
Che cosa dovete fare:
- [1]
Visualizzare i triangoli in 3D, centrandoli nell'area grafica,
in modalita' flat o smooth shading
(la proiezione puo' essere parallela o prospettica,
come preferite).
Il passaggio tra l'una e l'altra modalita' avviene quando l'utente
preme la lettera 'm'.
Consiglio: usare due display list, che vengono chiamate
alternativamente. Le normali necessarie per entrambi i casi le
trovate nella struttura dati riempita dalla read_triangles.
- [2]
Permettere all'utente di eseguire zoom per ingrandire/rimpicciolire
l'immagine della scena (fare ALMENO UNA delle due).
Il punto fermo della scalatura deve essere in centro della scena.
L'ingrandimento/riduzione avvengono quando l'utente preme i
tasti '+' e '-' rispettivamente.
- [3]
Permettere all'utente di ruotare la scena attorno a un asse
passante per il centro della scena e parallelo all'asse x, y, o z
(fare ALMENO UNA delle tre).
L'angolo di rotazione e' pari a 5 gradi, il verso di rotazione e'
come preferite.
La rotazione avviene quando l'utente preme le
lettere 'x', 'y' e 'z', rispettivamente.
Consiglio:
nei punti [2,3] fare prima UNA delle trasformazioni richieste,
POI andare avanti con gli altri punti,
e ALLA FINE, se vi resta tempo, fare anche le altre.
Note utili:
La proiezione puo' essere ortogonale o prospettica,
come preferite.
Avete bisogno di almeno una luce;
potete usare la GL_LIGHT0 coi parametri di default, ma METTETELA
ALL'INFINITO DIETRO L'OSSERVATORE (es. in 0,0,-1 se guardate da
z=-infinito) altrimenti potrebbe cadere dietro o dentro l'oggetto).
Per semplicita' fate in modo che il vostro programma
legga i triangoli da standard input, chiamando
read_triangles(stdin) e poi redirezionare lo standard
input da command-line.