Proyecto 3


Implementación de un walkthrough sobre un museo virtual


Un museo virtual se construye mediante un piso de gran dimension, sobre el que se levantan paredes y techo. Las paredes sor paralepípedos texturados de igual altura y grosor, pero de longitud y orientación distinta

El proyecto tiene varias áreas que deberá programar y dotar de una interfaz de usuario adecuada usando GLUI. Modularice su proyecto de manera que al menos la creaci—n del museo, la carga de objetos y el despliegue se hagan en sendos c—digos fuentes.

1.- Carga del museo vacío con sus paredes. Se aconseja leer un archivo la configuración inicial de las paredes (centro, longitud, orientación [en ángulos de 90 grados] y archivo de textura [xxx.png, yyy.tga]

2.- Navegación en el plano horizontal (xz) con el ratón (ver el ejemplo del grid dado en prácticas y el uso de la función glutPassiveMouseFunc()

3.- Carga de figuras en el museo a partir de otro archivo de configuración y colocarlas en puntos libres del museo:
Debe indicar nombre del archivo y coordenadas (x,z) del piso. La figura debe colocarse de tal manera de que luego esté flotando completamente encima del piso.

4.- Las figuras a cargar (o descargar) deben estar en formato .obj o .ply, les queda como tarea de investigación buscar estos formatos y usar una implementación o librería que permita leer estos archivos y convertirlos al formato descrito de objeto.


Se proveeran ejemplos.



Estructuras de datos

La estructura de datos deben basarse en una lista de coordenadas de puntos de tamaño 3N, siendo N el número de puntos, y M el de caras. Se debe calcular un “bounding box” (minX, minY, minZ, maxX, maxY, maxZ). Por ejemplo

typedef GLdouble[6] BoundingBox;

typedef GLdouble* VertexList;
VertexList vL = new GLdouble(3*N) ;
vL[3*k ] : coordenada X del punto k
vL[3*k + 1] : coordenada Y del punto k
vL[3*k + 2] : coordenada Z del punto k


Usted puede crear una clase apropiada con más atributos, pero respetando el formato de la lista de vértices descrita. Lo mismo vale para las normales de los vértices, si estas existen en el archivo (lo más común). Si no existen, deben de crearse luego de la lectura.

typedef GLdouble* NormalList;
NormalList nL = new GLdouble(3*N) ;
nL[3*k ] : coordenada X de la normal al punto k
nL[3*k + 1] : coordenada Y de la normal al punto k
nL[3*k + 2] : coordenada Z de la normal al punto k

La lista de caras (triángulos) permite muestrear los puntos de vertexList en tríos, y dibujarlos como un triángulo.

typedef GLdouble* FaceIndexes;
FaceIndexes fI = new GLint(3*M) ; // tres puntos por tri‡ngulo, ojo
fI[3*k ] : índice del punto P0 de la cara k
fI[3*k + 1] : índice del punto P1 de la cara k
fI[3*k + 2] : índice del punto P2 de la cara k

La normal hacia el exterior de una cara con ’ndices [i, j, k] es el producto de los vectores PiPj X PiPk , as’ que tengan cuidado cuando especifiquen el orden de los vŽrtices si crean sus propios objetos.


La estructura de datos GraphicObject (puede ser también una clase) es entonces de la siguiente forma:

GraphicObject = {
int numVert;
int numFaces;
boundingBox bbox;
vertexList vertex;
normalList normal;
faceIndexes face;
... // otros valores que sean necesarios
}

La rutinas de lectura se llamarán
void LoadModel(string theFileName, GraphicObject& myObj).

Los objetos se deben almacenar en un arreglo, GraphicObject myObjGroup[]


Mejoras

1- Que cuando el observador esté frente a un objeto del museo (una cierta distancia lineal) pulsando la teclas [X, Y, Z] como switch on/off, áquel se destaque por un cambio de textura o color o iluminación (prender una lámpara justo encima del objeto) y rote lentamente sobre su centro en el eje de rotación respectivo.

2- En un recuadro aparte presentar una visión por encima del museo, que muestre donde anda el observador con respecto al a escena, incluyendo paredes y objetos esquematizados.

3- Navegación con detección de colisiones. Impedir que el observador atraviese paredes u objetos. Manteniendo almacenada la ultima posición y orientación del observador (= cámara), si este se encuentra dentro de una pared u objeto, regresarlo (= trasladarlo) a un posición anterior fuera del objeto o pared, en dirección contraria.

4.- Que una linterna siga al observador y alumbre en su dirección de desplazamiento, para poder ver el camino.