Corso di
Interazione Uomo-Macchina: Interfacce Grafiche
Esercitazione di laboratorio
Data di consegna: 31 maggio 1999
Lavoro da svolgere
Realizzare un'interfaccia grafica per un'applicazione che visualizza
un oggetto solido con "lente magica": la parte di solido che cade
dentro la lente e' visualizzata ad alta risoluzione, la parte
rimanente a bassa risoluzione.
La lente di ingrandimento puo' avere due forme diverse:
cubica e sferica, e puo' essere spostata nello spazio traslandola
nelle tre direzioni degli assi coordinati, ingrandita o rimpicciolita
dall'utente.
L'oggetto da visualizzare e' realizzato tramite un insieme di triangoli.
L'applicazione e' data sotto forma di libreria che il programma
interfaccia dovra' utilizzare.
La libreria dell'applicazione contiene le seguenti funzioni:
- int loadSolid(char * filename, float * xmin, float * ymin,
float * zmin, float * xmax, float * ymax, float * zmax):
fa si' che l'applicazione carichi un oggetto dal file
specificato, l'oggetto viene posto in una struttura dati locale
all'applicazione e non rilevante ai fini dell'interfaccia.
In xmin, ymin, ..., zmax vengono restituite le
coordinate estreme dell'oggetto.
Ritorna 1 se il caricamento e' stato effettuato con successo, 0
altrimenti.
- int unloadSolid(void): fa si' che l'applicazione
scarichi il solido eventualmente presente.
Ritorna 1 in caso di successo, 0 altrimenti.
- int getTriangles(int tipo_lente, float center_x, float center_y,
float center_z, float width, int * num_tri_in, int * num_tri_out,
int ** tri_in, int ** tri_out):
comunica all'applicazione il tipo, la posizione e le dimensioni
della lente, ottiene dall'applicazione i triangoli da visualizzare.
Ritorna 1 in caso di successo, 0 altrimenti.
Segue spiegazione dettagliata dei parametri:
- tipo_lente: tipo di lente (cubica o sferica),
sono ammessi i valori delle due costanti
simboliche CUBIC_LENS e SPHERIC_LENS
- center_x, center_y, center_z:
coordinate (x,y,z) del baricentro della lente
- width: ampiezza della lente, uguale a meta' del lato nel caso
di lente cubica, e al raggio nel caso di lente sferica
- num_tri_in: ritorna il numero di triangoli che
rappresentano la parte di solido dentro la lente
- num_tri_out: ritorna il numero di triangoli che
rappresentano la parte di solido fuori dalla lente
- tri_in: ritorna un array di identificatori interi dei
triangoli che rappresentano la parte di solido dentro la lente
- tri_out: ritorna un array di identificatori interi dei
triangoli che rappresentano la parte di solido fuori dalla lente
Gli array tri_in e tri_out
vengono allocati e deallocati
dall'applicazione, l'interfaccia non si deve preoccupare di questo.
- int getVertices(int tri_id, float *p1, float *p2, float *p3,
float *norm):
ritorna in p1, p2, p3 i tre punti vertici del triangolo
di identificatore tri_id, e in norm
la normale al triangolo.
I parametri p1, p2, p3, norm
devono essere ciascuno un array di
tre float gia' allocato dal programma interfaccia.
Associato all'interfaccia e' inoltre previsto un file di configurazione
contenente:
- la configurazione iniziale della lente: tipo, posizione, dimensioni
- la colorazione iniziale del solido (parte interna e parte esterna
alla lente) e della lente
- la modalita' di visualizzazione iniziale per il solido
(parte interna e parte esterna alla lente): wireframe o solid
- la posizione ed orientamento iniziale del punto di vista da
cui si inquadra la scena
La sintassi di questo file e' lasciata libera.
L'applicazione permette di:
-
caricare un file di configurazione (eventualmente rimpiazzandone
un altro precedentemente caricato)
-
caricare un oggetto contenuto in un file (eventualmente rimpiazzandone
un altro precedentemente caricato)
-
visualizzare la lente e l'oggetto in base alle informazioni del file
di configurazione
-
variare la configurazione corrente (lente, colori, modalita' di
visualizzazione, punto di vista), ved. dopo
-
salvare su file la configurazione corrente
Operazioni sulla configurazione corrente:
- cambiare il tipo di lente (da cubica a sferica e viceversa)
- muovere la lente traslandone il baricentro nelle direzioni
dei tre assi coordinati
- ingrandire o rimpicciolire la lente (agendo sulla sua ampiezza)
- cambiare il colore della lente
- cambiare il colore dell'oggetto: deve essere possibile agire
separatamente sul colore della parte di oggetto dentro la lente
e della parte fuori dalla lente
- cambiare la modalita' di visualizzazione dell'oggetto (da wireframe
a solid e viceversa): deve essere possibile agire separatamente
sulla modalita' di visualizzazione della parte di oggetto dentro
la lente fuori dalla lente
- cambiare la posizione del punto di vista da cui si osserva la scena,
dando la possibilita' di farlo ruotare attorno alla scena stessa,
avvicinarlo o allontanarlo dal centro della scena
Note:
Puo' essere opportuno prevedere una configurazione di default da
adottare all'apertura del programma in assenza dell'indicazione da
parte dell'utente di un file di configurazione particolare
Ad ogni cambiamento operato sulla geometria della lente (tipo, posizione,
dimensioni), l'interfaccia dovra' richiedere all'applicazione una nuova
rappresentazione del solido invocando la funzione getTriangles.
Nel caso di cambiamento dei parametri di visualizzazione (colori,
modalita', punto di vista), questo non e' necessario
Per le operazioni relative al movimento della lente, e'
importante che l'utente abbia un feedback che gli mostri
che cosa sta per fare (es: in che direzione sta per muoverla...)
La scena deve essere inizialmente visualizzata in 3D con
trasformazioni di vista e proiezione tali che la scena
sia completamente visibile e non troppo "lontana"
rispetto all'osservatore.
Poiche' e' prevista la possibilita' di visualizzare l'oggetto
in modalita' solid, dovranno anche usate una o piu'
luci per l'illuminazione.
Materiale fornito
Vengono forniti:
- la libreria che implementa l'applicazione
- alcuni file di input contenenti oggetti che possono
essere caricati dall'applicazione
- uno "scheletro" di programma, che implementa gia' le parti
relative a:
-
caricamento di un oggetto e sua visualizzazione in base ad
una configurazione prefissata
-
una rudimentale illuminazione della scena
-
rotazione del punto di vista attorno alla scena visualizzata
I file per 1 e 2, essendo piuttosto voluminosi, sono localizzati
in una directory di accesso comune, si raccomanda di non copiarli
nella propria home.
Per comodita', si puo' creare nella propria home
un link simbolico a tali file mediante il comando:
ln -s NOME_FILE_ESISTENTE NOME_FILE_LINK
Il sorgente per 3 e' ig99.c,
con il suo makefile makeig99.
Trovate qui
spiegazioni su come e' organizzato il codice, come compilare, come
eseguire, e sui file di input.
Raccomandazioni
Questo e' un progetto di interfacce grafiche.
Pertanto, sara' tenuto conto non solo del fatto che tutte le
funzioni richieste siano presenti nell'interfaccia
sviluppata, ma anche e di quanto facile e gradevole
risulta l'uso dell'interfaccia stessa per l'utente.
Materiale da consegnare
-
Un dischetto contenente l'eseguibile, i sorgenti e il makefile.
-
Se lo si ritiene necessario, brevissime
istruzioni per l'uso dell'interfaccia
(su carta o sul dischetto stesso in formato ASCII).