Relazione esame informatica grafica

459 views

Published on

Esame informatica grafica

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
459
On SlideShare
0
From Embeds
0
Number of Embeds
5
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Relazione esame informatica grafica

  1. 1. Compagnone Simone - Matricola 709649 email: s.compagnone1@campus.unimib.itZapata Flores Francklin Eduardo - Matricola 711223 email: f.zapataflores@campus.unimib.it Progetto per lesame di Elementi di Informatica Grafica Appello di Giugno 2010 Realizzazione di un applicazione per la navigazione in una cittadina.Abbiamo realizzato una rudimentale applicazione, utilizzando le OpenGl in c ++, persimulare la navigazione immersiva in una mappa che viene creata passato in input alnostro programma una immagine (deve essere nel formato .tga).Per poter utilizzare il nostro programma: 1. Estrazione dellarchivio in una directory che già contiente le cartelle CGUtils (se si lavora in ambiene windows deve esserci anche la cartella freeglut). 2. Entrare,da riga di comando, nella directory del nostro programma ed eseguire i seguenti comandi: • make • ./esame.exe cittadina.tga (Cittadina.tga è una immagine che ci è stata fornita in allegato al testo del progetto.) OPPURE: • make • ./esame.exe prova.tga (immagine creata come secondo test per lesame.)Se si volesse provare lapplicazione con una nuova immagine, che deve esserepresente nella directory principale del programma, lanciare il programma: • ./esame.exe <nome nuova immagine>.tgae le caratteristiche della nuova immagine devono essere: 1. Deve essere nel formato .tga. 2. I colori che vengono gestiti nella nostra applicazione sono: • un pixel nero (0,0,0) rappresenta il terreno asfaltato. • un pixel bianco (255,255,255) rappresenta una parte di edificio. • un pixel rosso (255,0,0) rappresenta il punto di partenza della vostra visita immersiva. • un pixel verde (0,255,0) rappresenta una zona di terreno erboso. • un pixel blu (0,255,0) rappresenta una zona ricoperta da acqua (mare/lago) • un pixel rosso scuromarroncino (125,0,0) rappresenta un albero.Altri colori non vengono gestiti dal programma in quanto non richiesti nel progetto.
  2. 2. Comandi per la navigazione: • Tasto f : abilita / disabilita la navigazione nella mappa 3D. • Tasto q : esce dal programma. • Tasto s : abilita/disabilita la modalità “solid” della scena. • Tasto g : abilita/disabilita la nebbia nella scena. • Tasto f10-f11-f12 : modificano lintensità della nebbia nella scena. • Tasto 1-2: modifica lintensità della luce dellosservatore. • Tasto Key_up : permette allutente di muoversi avanti durante la navigazione nella mappa. • Tasto Key_down : permette allutente di muoversi allindietro durante la navigazione nella mappa. • Tasto Key_left : permette allutente di muoversi verso sinistra durante la navigazione nella mappa. • Tasto Key_right : permette allutente di muoversi verso destra durante la navigazione nella mappa.Descrizione struttura del progetto :Per il nostro progetto abbiamo deciso di strutturare il codice in modo tale che possaessere il più possibile “pulito” cercando di separare le funzioni utilizzate in diversifile, lasciando il main semplice e chiaro.La directory principale contiene : • Makefile: per poter compilare il codice. • Cittadina.tga/prova.tga: immagini usate per testare il programma che realizza mappe 3D. • Mappa.cpp: è il file che contiene il main dellapplicazione. • Directory Obj : contiene tutti i file Obj che vengono utilizzati nel progetto. • Directory Texture: contiene tutte le texture utilizzate nel progetto. • Directory Tools: 1. Mouse.h : contiene tutte le funzioni per permettere allutente di utlizzare il mouse. 2. Tastiera.h: contiene le funzioni che danno la possibilità allutente di interagire , tramite la tastiera , con il programma. 3. cOggetti.h : gestisce la lettura degli obj e il disegno delloggetto contenuto. 4. cTerreno.h: gestisce il caricamente delle texture, degli oggetti come insieme di file obj, infine disegna la mappa 3D e vi posizione gli oggetti.
  3. 3. Scelte implementative e descrizione dei file principali :La prima decisione che abbiamo preso sul progetto riguarda limmagine che verràutilizzata per creare la mappa 3D. Abbiamo scelto che sarà lutente a passare in inputal nostro programma limmagine che vorrà utilizzare (la nostra gestione permetteanche di utilizzare immagini RGBA oltre che RGB ma sempre nel formato .tga), inquesto modo è possibile rendere indipendente il programma dallimmagine“cittadina.tga” che ci è stata fornita con il testo del progetto.Lapplicazione come primo passo fondamentale carica la .tga passata in input e creauna matrice associata che avrà le stesse dimensioni della immagine in pixel.Ad ogni cella della matrice viene fatto corrispondere un identificativo che indica ilcolore del pixel a cui fa riferimento.Nello specifico abbiamo deciso di utilizzare i seguenti identificativi allinterno dellamatrice: • S : è lidentificativo associato al colore nero usato per la strada, alla quale verrà associata la texture “asfalto.tga”. • E : è lidentificativo associato al colore bianco usato per identificare i palazzi che poi verranno caricati con file Obj e con la texure “terreno.tga”. • R : è lidentificativo associato al colore rosso usato per decidere il punto di partenza per la navigazione . • P : è lidentificativo associato al colore verde usato per identificare il prato, al quale verrà associato la texture “grass.tga”. • B : è lidentificativo associato al colore blu usato per identificare il mare/lago, al quale verrà associato la texture “acqua.tga”. • M: è lidentificativo associato al colore marrone usato per identificare gli alberi che verranno poi caricati con file Obj e con la texure associata al prato.Successivamente vengono caricate le texture del prato, mare , punto di partenza,strada , terreno degli edifici e si costruisce il terreno della mappa andando a leggerela matrice appena creata e associando ad ogni “zolla” la texture corrispondente.Naturalmente la grandezza della mappa dipende dalle dimensioni dellimmaginepassata in input dal programma e dalla variabile che abbiamo chiamato DELTAdichiarata in mappa.cpp .Una volta creata la mappa 3D ci siamo posti il problema di come caricare più file ditipo .obj per gli alberi ( nella mappa non cè un solo albero ripetuto n volte ma glialberi sono diversi) e di come posizionarli nelle giuste posizioni.Quindi abbiamo deciso di creare due liste di oggetti una per gli alberi e una per gliedifici.Durante la lettura della matrice fatta precedentemente abbiamo salvato le posizionidegli alberi in un array, che successivamente andiamo a leggere per posizionare unodegli alberi contenuti nella lista descritta prima. ( la scelta dellalbero da posizionare
  4. 4. avviene in modo casuale, tramite una funzione random.).Una volta posizionati gli alberi ci siamo chiesti come avremmo potuto creare palazzicon altezze e grandezze differenti a seconda del numero di pixel bianchi vicini.Come prima cosa abbiamo copiato la matrice usata precedentemente in una secondamatrice che andiamo a modificare ogni volta che troviamo un palazzo.Infatti andiamo a leggere la matrice ,dallalto al basso e da sinistra verso destra, eogni volta che troviamo una cella contrassegnata con la lettera E ( identificativo usatoper gli edifici o meglio per i pixel bianchi dellimmagine in input) modifichiamo ilcontenuto della cella con la lettera X salvando prima le coordinate (x,y) di tale cella.Avendo supposto che ogni edificio sia sempre un quadrilatero, cerchiamo lecomponenti connesse bianche della cella ,modificandone il valore con la lettera X esalvando le coordinate dellultimo pixel in basso a destra bianco.Le coordinate vengono salvate allinterno di una lista, i cui elementi contengono laposizione iniziale e finale di ogni edificio(per definire un quadrilatero sono sufficientidue veritici), nella mappa 3D.Una volta conosciute tutte le coordinate , scorro la lista per andare a disegnare nellegiuste posizioni uno degli stabili precedentemente caricati ( la scelta delledificio daposizionare è identica a quella usata per gli alberi.).Gli edifici vengono disegnati e scalati secondo la dimensione del quadrilatero chedevono occupare.Il nostro programma gestisce anche le collisioni , infatti non è possibile uscire dallamappa e oltrepassare i muri degli edifici.Tutto questo è stato possibile riutilizzando la lista di coordinate precedentementecreata per gli edifici infatti ogni volta che lutente si sposta durante la navigazioneviene scandagliata la lista per capire se il movimento fatto è ammissibile oppure setenta di collidere con un palazzo.Note:Dopo aver testato il nostro progetto nei computer dei Laboratori, dove abbiamosvolto le esercitazioni, abbiamo notato che questultimi fanno una certa fatica a fargirare il programma, ciò è probabilmente dovuto alla mancanza dei driver perlaccelerazione 3D. Quindi, si consiglia, per non incombere in questo problema, diutilizzare un computer in grado di gestire almeno laccelerazione 3D.

×