SECONDO PROGETTO DI INTERFACCE - A.A. 2001-2002 - VECCHIO ORDINAMENTO
SECONDO PROGETTO DI INTERFACCE - A.A. 2001-2002
VECCHIO ORDINAMENTO
OBIETTIVO
Creare un programma che legge un file di input contenente triangoli
che definiscono un oggetto solido, visualizza tali triangoli, e
consente all'utente di agire sulla scena visualizzata.
FUNZIONALITA' DEL PROGRAMMA
-
Visualizzare i triangoli, centrandoli nell'area grafica,
sotto l'influsso di una trasformazione di proiezione
ortogonale o prospettica (come preferite).
-
Illuminarli con una sorgente all'infinito che emetta luce ambiente e
luce diffusa, in modo da creare effetto 3D.
Prevedere le modalita' di visualizzazione "flat shading"
(facce piatte) e "smooth shading" (facce smussate).
L'utente passa da una modalita' all'altra premendo il tasto 'm'.
-
Permettere all'utente di cambiare il colore dell'oggetto
tra bianco, rosso, verde, blu.
L'utente imposta il colore premendo i tasti lettera "w" (white),
"r" (red), "g" (green), "b" (blue).
-
Permettere all'utente di ruotare l'oggetto muovendo il
mouse a bottone premuto:
- spostare il mouse verso l'alto o il basso fa ruotare l'oggetto
attorno ad un asse passante per il centro dell'oggetto e
parallelo alla larghezza della finestra
- spostare il mouse verso destra o sinistra fa ruotare l'oggetto
attorno ad un asse passante per il centro dell'oggetto e
parallelo all'altezza della finestra
-
Permettere all'utente di eseguire zoom per ingrandire/rimpicciolire
l'immagine della scena.
L'ingrandimento/riduzione avvengono quando l'utente preme i
tasti '+' e '-' rispettivamente.
La scena rimane centrata nella finestra.
-
Prevedere una seconda sorgente luminosa mobile
collocata in un punto al finito nei pressi
della scena (es. inizialmente in uno dei vertici dei triangoli).
Visualizzare la sorgente come un punto.
Fare emettere alla sorgente una luce colorata (in modo da distinguerla
dalla luce emessa dalla prima sorgente all'infinito).
-
Permettere all'utente di muovere la sorgente al finito
(ved. punto precedente) premendo i tasti
freccia (per le direzioni alto, basso, destra, sinistra) e i
tasti page-up, page-down (per le direzioni avanti, indietro).
MATERIALE FORNITO
(1) Il modulo di lettura
Sono forniti i file parser.h
e parser.c che leggono il file di triangoli.
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 che contiene i triangoli e le loro
normali, 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.
NON MODIFICATE questi due file.
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.
Nota bene: se il vostro programma non si chiama xxxx.c dovete editare
il Makefile e sostituire xxxx con il nome vero.
(2) File di input
CONSIGLI
La modalita' "flat shading" si ottiene dando ai tre vertici del
triangolo la stessa normale (direzione normale al piano del triangolo).
Quella "smooth shading si ottiene dando a ciascun vertice una
sua normale (media delle direzioni delle normali ai triangoli
che condividono quel vertice).
I valori delle normali si trovano nella struttura dati letta da file.
(ved. Materiale fornito).
Usare due DISPLAY LIST per i triangoli (una in flat e una in smooth
shading) e chiamarle sotto l'influsso
di diverse proprieta' di materiale e trasformazioni di modellazione
Come luce all'infinito (punto 2)
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 catturare le pressioni dei tasti ordinari in Glut usare la callback
Keyboard function, per i tasti freccia e page-up page-down
usare la Special key function.
Per catturare lo spostamento del mouse a bottone premuto usare
Motion function.
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.
MATERIALE DA CONSEGNARE
- Il sorgente C (tutti i .c e .h che ne fanno parte),
su dischetto o per email.
- Solo se lo si ritiene necessario, brevissime istruzioni per l'uso
dell'interfaccia, in testo ascii o html, su dischetto o per email.
L'indirizzo di posta elettronica a cui spedire e'
magillo@disi.unige.it.
Indicare chiaramente nel messaggio il nome dei componenti del gruppo e
l'elenco dei file inviati.
NON reinviare i file parser.h e parser.c che fanno parte del materiale
fornito.