UNIVERSITAT JAUME I
E80
PROYECTOS INFORMÁTICOS
INGENIERÍA INFORMÁTICA
Curso 2005-2006
1
2
E80-Proyectos informáticos 22/07/2006
RESUMEN
PALABRAS CLAVE
3
4
E80-Proyectos informáticos 22/07/2006
ÍNDICE
1. Introducción general. 7
1.1. Objetivos del proyecto. 7
1.2. Descripción del entorno general del proyecto. 7
2. Descripción del proyecto. 11
2.1. Introducción. 11
2.2. Descripción técnica del proceso del proyecto. 12
2.2.1. Información inicial. 12
2.2.2. Estimación de recursos. 13
2.2.3. Planificación de tareas y temporal. 15
2.2.4. Procesos y actividades intermedios. 19
2.2.5. Resultado final. 20
2.2.6. Aplicación práctica. 21
3. Conclusiones. 23
4. Posibles extensiones del proyecto. 25
5. Referencias. 27
5
6
E80-Proyectos informáticos 22/07/2006
1. INTRODUCCIÓN GENERAL.
En este primer apartado aportaremos una visión global acerca de la propuesta de este
proyecto. ¿Por qué una visita virtual (otra más) a la UJI? ¿Por qué con Blender [dBW]? ¿Por
qué con su motor de juegos [dGN]?
El principal objetivo de este proyecto es servir como proyecto base para futuros
programas independientes o incrustados en navegadores que permitan visitar virtualmente
la Universidad Jaume I de forma interactiva y para cualquier plataforma informática, y
obtener información vía web acerca de los edificios, los laboratorios, el profesorado, etc.,
así como almacenar información web propia.
Como comentaremos más adelante, las ventajas de este proyecto con respecto a
otros son su capacidad multiplataforma (Blender y Python tienen versiones para las más
diversas plataformas) y su facilidad de extensión por personas sin conocimientos de
programación. En otras palabras, su mayor accesibilidad.
Hoy en día existe un amplio abanico de herramientas con las que construir recorridos
virtuales interactivos: podemos recurrir al lenguaje VRML, a Java, o utilizar motores de
juegos como Crystal Space, OGRE o similares.
Los dos primeros nos ofrecen la ventaja de su posible integración en un navegador
mediante plugins. Los últimos, sus potentes características gráficas.
¿Por qué, entonces, elegir el motor de juegos de Blender?
Para comenzar, habría que hacer una breve introducción a la historia de uno de los
programas insignia del Software Libre. Después de que la Free Software Foundation
comprara sus derechos a la quebrada compañía de videojuegos Not A Number para liberar
7
sus fuentes, Ton Roosendall, su programador original, continuó liderando su desarrollo en
una comunidad de cada vez más usuarios que lo elegían por sus amplias prestaciones y
bajos requisitos (la versión liberada, la 2.25, condensaba herramientas de modelado,
animación, texturizado, renderizado y composición básicas, además del motor de juegos,
todo esto multiplataforma, en apenas 2MB).
Su evolución se disparó, comenzando a ofrecer una cada vez más seria alternativa a
costosos programas estándar de la industria infográfica de la talla de 3DStudio Max o Maya.
A día de hoy, se están llevando a cabo varias producciones cinematográficas que lo
utilizan en parte o la totalidad de su producción, a raíz de las mejoras aportadas por el
proyecto “Orange”. Y su historia apenas acaba de comenzar.
El motor de juegos de Blender (llamado Ketsji), pese a llevar con el programa desde
sus inicios, no ha tenido tanta atención, desafortunadamente. A diferencia del resto de
motores de juegos del mercado (a excepción del VirTools [dVW]), no requiere
necesariamente de una sola línea de programación para poder utilizarlo. Su sistema de
“ladrillos lógicos” permite conectar como en un “une con flechas” tres columnas de
sensores, controladores y actuadores, respectivamente, para cada objeto de la escena.
Cuando se “juega”, cada objeto evaluará los eventos que recibe (los detallaremos con
mayor profundidad más adelante) y llevará a cabo un determinado acto. Pero como añadido
a este uso minimalista, se pueden ampliar infinitamente sus prestaciones con su integración
[dGLD] con el lenguaje de Python [dPW], que permite controlar cualquier aspecto del juego.
Por si fuera poco, existe un plugin [dCP] (descontinuado durante un tiempo) que permite
“jugar” desde un navegador.
Considerado durante mucho tiempo como una característica más que ya cumplía con
su función y cuyo desarrollo no era prioritario (ni debía incidir negativamente en el peso del
programa, para mantener su livianez), ha estado estancado (e incluso en ocasiones dejado
de lado) a lo largo de su historia reciente.
Pero como se aprecia en la Figura 1, una de las transparencias de la presentación de
las novedades del programa en el Siggraph 2005, las cosas iban a empezar a cambiar. Las
últimas implementaciones dejan al motor de juegos con las siguientes características [dBN]:
8
E80-Proyectos informáticos 22/07/2006
9
Acerca de la elección de una visita virtual, son bastantes los proyectos que se han
centrado en ella. Las ventajas de utilizar el motor de gráficos de Blender es que, para
modificar tanto los escenarios como la lógica, no se necesita un programa de modelado
distinto del que exportar objetos (ni, como decíamos antes, se necesita saber programación
para realizar cambios simples). Todo lo necesario está en la misma herramienta, con lo que
el flujo de trabajo se vuelve más ágil y asequible a casi cualquiera con mínimos
conocimientos de grafismo.
Dado que la Universidad forma parte de un entorno cambiante, el proyecto también es
en cierta forma abierto, inconcluso, permitiendo la aportación de cualquiera que quiera
expandir los escenarios (o adaptarlos para utilizarlos en juegos, por ejemplo).
10
E80-Proyectos informáticos 22/07/2006
2.1. INTRODUCCIÓN.
11
Figura 2. Vista de la entrada de la ESTCE.
El desarrollo del proyecto ha tenido diversos contratiempos desde sus inicios hasta su
finalización (aunque, como ya quedó dicho, no hay finalización como tal). En los siguientes
apartados se desglosa la evolución del proyecto.
La idea del proyecto surgió en septiembre de 2004. Tras utilizar durante casi un año
Blender como suite 3D, en el ya extinto foro de Blender en castellano “Nicodigital” me
sugirieron utilizar el motor de juegos (parte que no había investigado antes) para realizar
una visita virtual.
Como aliciente, pretendía poder distribuir por el escenario puntos en los que se
pudiera obtener información adicional. Al no tener apenas contacto con Python, ni siquiera
era consciente de si la integración del lenguaje con el motor me permitiría la apertura de
navegadores, ni de cómo funcionaban, en general, los elementos del motor para trabajar
con ellos.
12
E80-Proyectos informáticos 22/07/2006
Para estimar el tiempo, hice dos supuestos en función de la densidad de materias del
curso 2004-2005:
1. Preparar el sistema de navegación del proyecto a comienzos del curso 2004-
2005, preparar el modelo a lo largo de dicho curso, y dar por finalizado el modelo
para pasar a los ajustes finales en agosto de ese mismo curso.
2. Preparar el sistema de navegación del proyecto a comienzos del curso 2004-
2005, preparar el modelo a lo largo de dicho curso y del siguiente, y dar por
finalizado el modelo para pasar a los ajustes finales en agosto de 2006.
En cuanto al equipo necesario, la mayor parte del peso del proyecto corre a cuenta de
la tarjeta gráfica. Mi equipo personal (AMD 1'2GHz, 500MB RAM, NVIDIA GFORCE4
13
MX440 64MB corriendo sobre GNU/Linux) sería suficiente, dadas las bajas exigencias de
Blender.
14
E80-Proyectos informáticos 22/07/2006
15
bastantes cambios (la biblioteca nueva, el nuevo centro de la FUE, las reformas del Ágora,
etc.), así que no es muy cabal preocuparse por ser totalmente fiel a la realidad en este
proyecto: basta con dar una idea de las posibilidades.
Dispuesto en forma de grafo, la distribución temporal de las tareas e hitos sería la
siguiente:
2004 2005/2006
SEP OCT NOV JUL AGO SEP
1 2 3 4 1 2 3 41 2 3 4 1 2 3 41 2 3 4 1 2 3 4
16
E80-Proyectos informáticos 22/07/2006
17
información donde deberían estar (por posibles cambios en la elevación del terreno),
las puertas, las animaciones que determinan las posiciones de salida de dichas
puertas...
7. La revisión del escenario principal es otra tanda de recogida de material gráfico
que sirva de referencia para un modelado más adecuado de algunas partes (rampas
de acceso, Ágora, escaleras...) que no estén suficientemente detalladas en las
referencias usadas para el modelo básico.
8. Como comentamos, a partir del punto de “cuenta atrás”, dedicaremos todo el
tiempo posible a mejorar el modelado para pulirlo visualmente, a partir de las
referencias que encontremos en la tarea 7.
9. Finalmente, tras la entrega de la memoria del proyecto, sólo quedará la
preparación de la presentación y los ajustes finales del modelado.
Los fantasmas hacen referencia a la alta posibilidad de encontrarme con algún tipo de
problema al hacer esa tarea:
● El fantasma cyan (Inky) representa las posibles complicaciones a la hora de
obtener, o bien el modelo de la universidad, o las referencias necesarias para
modelarlas.
● El fantasma rojo (Blinky) supone el retraso que la carga de todo quinto de
carrera y Procesadores puede acarrear en la realización del proyecto.
● El fantasma rosa (Pinky) representa los problemas que pueden aparecer al
buscar referencias para convertir el modelo básico en uno más apurado.
● Y el fantasma naranja (Clyde), que son las dificultades (principalmente por
tiempo, pero también por dificultades técnicas) que pueden surgir durante la
implementación de dicho modelado.
18
E80-Proyectos informáticos 22/07/2006
La primera tarea fue entender el funcionamiento de los ladrillos lógicos del motor de
juegos. Como ya comentamos, este sistema permite conectar como en un “une con flechas”
tres columnas de sensores, controladores y actuadores, respectivamente, para cada objeto
de la escena. Cuando se “juega”, cada objeto evaluará los eventos que recibe (los
detallaremos con mayor profundidad más adelante) y llevará a cabo un determinado acto.
El resumen del funcionamiento es el siguiente:
● La columna de sensores consta, por mencionar algunos de los más
importantes, de sensores de teclado, ratón, colisiones, intersección con un rayo
lanzado y mensajes recibidos.
● La columna de controladores permite efectuar operaciones booleanas simples
(AND, OR) con las entradas de los sensores, expresiones complejas con dichas
entradas combinadas con propiedades del objeto, o lanzar scripts de Python que
manejen a más bajo nivel los parámetros de los sensores y permitan acciones
avanzadas.
● La columna de actuadores son los que ejecutarán la acción asociada a los
eventos: mover un objeto, crearlo, modificarlo, reproducir una animación, un sonido,
cambiar de cámara, de escena, modificar propiedades del objeto, enviar mensajes a
otros objetos...
De forma paralela, el aprendizaje de Python fue compartido con la asignatura de
Procesadores, que resultó más que suficiente para manejarme con desenvoltura por el
sistema de clases, métodos, instancias y propiedades de los objetos del motor, amén del
parseado de ficheros con los datos necesarios.
19
En cuanto a la búsqueda del material gráfico, desde el departamento de gráficos se
me propuso establecer contacto con un alumno que tenía un modelo en CAD de la UJI.
Aunque Blender es capaz de importar dicho formato de forma nativa, la estructura
resultante suele estar bastante “sucia”, y para un motor poco potente sería deseable contar
con el mínimo número de polígonos posible.
Durante la Jornada de Puertas Abiertas de 2004, pude hacerme con un recortable de
la UJI que el Servei de Comunicacions había publicado. Parecía factible escanear las
páginas y “reconstruir” el recortable directamente en 3D, utilizando las ilustraciones como
textura, de forma que me decidí por esta vía. A buen seguro necesitaría material adicional si
intentara conseguir una representación más fidedigna (la maqueta no recogía, por ejemplo,
los desniveles del terreno), pero relegaría esta fase a un punto más avanzado del proyecto,
si tenía el tiempo suficiente.
También necesitaría el plano con información de la distribución de la segunda planta
del edificio de despachos. Fue bastante complicado obtenerlo, por alguna extraña reticencia
de la secretaria que lo custodiaba clavado en su corcho, pero tras varias llamadas
conseguiría hacerme con él.
Llegado al punto en el que necesitaría más información de la que me ofrecía el
recortable y mi propia memoria, utilizaría una cámara de vídeo propia y haría algo de
trabajo de campo para recoger referencias de toda la Universidad (y en particular de la
segunda planta del edificio de despachos, de la que no tenía ninguna textura para usar).
No sólo aparecieron todos los fantasmas que se esperaban, sino que hubo uno extra.
Como ya he comentado, fue complicado obtener las primeras referencias, el proyecto se
demoró a causa de las otras asignaturas (y Procesadores), fue complicado obtener las
referencias para mejorar el modelado, no tuve tiempo de incorporar todas las mejoras, y
durante tres semanas de agosto de 2006, Telefónica no me permitió el acceso a internet.
Aún así, las pruebas con el modelo básico han acabado siendo perfectamente
20
E80-Proyectos informáticos 22/07/2006
funcionales. Podemos navegar con fluidez (si se dispone de aceleración OpenGL por
hardware) por el escenario principal (la parte externa de la Universidad), y entrar por las
puertas laterales del edificio de despachos para acceder a su interior. En ambos escenarios,
al pinchar sobre los elementos de información, se abrirá una página web que apunta al
enlace deseado.
Al tener por separado los archivos con la información de la posición y enlaces web, se
puede gestionar de forma simple la información, para tenerla actualizada.
Como extra, se incorpora una vista de pájaro, y se ha dejado habilitada la posibilidad
de incorporar puntos de control donde el usuario quiera, ejecutándolo desde consola y
pulsando “i” (la consola pedirá la dirección web a la que se quiere hacer referencia).
Se ha detectado que, en ocasiones, los eventos disparadores se activan por error más
de una vez (por ejemplo, al pulsar la “m” para activar el mapa), sin conseguir una solución
“limpia” para evitarlo.
21
puede entregar a comienzo de curso a los alumnos, para que conozcan los distintos
departamentos y edificios, laboratorios y profesorado. O, una vez que avance el plugin para
web, exponerlo directamente en la web de la universidad, como servicio multimedia extra.
22
E80-Proyectos informáticos 22/07/2006
3. CONCLUSIONES.
23
24
E80-Proyectos informáticos 22/07/2006
25
También se pueden crear muy fácilmente recorridos de cámara que guíen al
espectador a los lugares que deseemos, manteniendo la interacción pero limitando el
movimiento. Esto puede servir para presentaciones de todo tipo, para indicar el típico “cómo
llegar” a un lugar durante un evento y similares.
26
E80-Proyectos informáticos 22/07/2006
5. REFERENCIAS.
[dBB] Blender Raytrace Baker. Web de descarga del plugin. http://alienhelpdesk.com/index.php?id=22. Website.
[dBN] Blender News. Web de actualizaciones de Blender. http://www.blender3d.org/cms/Blender_2_41.731.0.html. Website.
[dBT] Blender Bugtracker. Web de reporte de errores de Blender.
http://projects.blender.org/tracker/?func=detail&atid=306&aid=4522&group_id=9. Website.
[dBW] Blender Website. Página principal de la Blender Foundation. http://www.blender3d.org. Website.
[dCP] ContinousPhysics. Web del plugin ActiveX. http://continuousphysics.com/Blender2.42Webplugin.html. Website.
[dGL] GL Shader Reference. Web de documentación para la programación de shaders de OpenGL para el motor.
http://download.blender.org/documentation/242GE_Docs/glsl.html. Website.
[dGLD] Game Logic Documentation. Documentación de los módulos del motor de juegos de Blender.
http://www.blender.org/documentation/pydoc_gameengine/PyDoc-Gameengine-2.34/index.html. Website.
[dGN] Game Blender News. Web oficial de noticias del motor. http://www.gameblender.org/modules/news/. Website.
Documentación oficial del motor de juegos de Blender.
http://www.blender3d.org/documentation/intranet/docs/develop/gameengine_high_level/index.html. Website.
[dMH] Module Hierarchy. Vista de la jerarquía de módulos del motor de juegos de Blender, y su interfaz con Python.
http://www.blender.org/documentation/pydoc_gameengine/PyDoc-Gameengine-2.34/trees.html. Website.
[dPW] Python Website. Página oficial del lenguaje de programación de Python. http://www.python.org/. Website.
[dVW] VirTools Website. Página de la empresa VirTools. http://www.virtools.com/. Website.
27
28
E80-Proyectos informáticos 22/07/2006
29
○ uno de tipo “Scene”, que hará un “Set Scene” del escenario al que
queramos ir (en nuestro caso, EdificioX si estamos en Ujiland, o Ujiland si
estamos en EdificioX).
○ uno de tipo “Message”, para enviar a todos los receptores la información de
por qué puerta entramos (al cargar la escena nueva, se colocará la cámara en la
posición oportuna).
○ En sus propiedades tendrá que estar marcado “Actor” (ya que será un
objeto móvil al que queremos que afecten las físicas) y Dynamic (para habilitar
físicas avanzadas, como gravedad o fricción). Los parámetros de masa, gravedad
y fricción han sido estimados por ensayo y error.
○ Una propiedad booleana llamada “mapa” e inicializada a False, que indicará
internamente si el mapa está activado o no.
○ Una propiedad de tipo Int llamada “pos” inicializada a cero, que indicará a la
30
E80-Proyectos informáticos 22/07/2006
31
○ Sensores de teclado para otras acciones como salir de la visita, ver el mapa
o insertar un nuevo ítem de información. El sensor para insertar ítems sólo
necesitará conectarse a un controlador de tipo Python, que llamará al script “Pos”
(véase el Anexo B5). El actuador para el mapa modificará la propiedad llamada
“mapa”, de forma que necesitaremos sensores adicionales para gestionar esta
propiedad de forma adecuada:
32
E80-Proyectos informáticos 22/07/2006
● Por último, cada escena necesitará una cámara para una vista de mapa con el
nombre que le hayamos asignado en el actuador correspondiente del usuario (el
nombre de la cámara de usuario también deberá corresponder con el nombre
asignado en el otro actuador).
33
ANEXO B. Scripting.
B1. VerRaton
Este simple script importa el módulo de rasterizado del Game Engine y activa la
opción de mostrar el ratón:
import Rasterizer
Rasterizer.showMouse(1)
34
E80-Proyectos informáticos 22/07/2006
B2. leearchivo
Este script se encarga de leer un archivo de una o más líneas con el formato:
import GameLogic as GL
GL.informacion=[]
try:
f=open(GL.getCurrentScene().getName(),"r")
a=f.readline()
while (a!=""):
a=a[:-1].replace("'","").split(",")
GL.informacion.append( [ [ float(a[0]), float(a[1]), float(a[2]) ] , a[3][1:] ])
a=f.readline()
f.close()
except:
pass
#Si no existe el archivo, no hacemos nada
35
B3. PonSensor
Al iniciarse la escena, un objeto (en nuestro caso, un “empty”) activará durante los
primeros ciclos un script para que todos los objetos de información se distribuyan por la
escena. El script se desactivará (desactivará el sensor que lo activa, para ser exactos)
cuando todos los objetos estén distribuidos. A continuación se amplía la explicación.
import GameLogic as GL
Cont = GL.getCurrentController()
Own = Cont.getOwner()
Sens = Cont.getSensors()[0] #primer sensor devuelto por la lista de sensores del objeto
Act = Cont.getActuators()[0] #ídem con los actuadores
pos=Own.pos
try:
max=len(GL.informacion)
LastObj = Act.getLastCreatedObject()
if LastObj:
LastObj.direccion=GL.informacion[pos-1][1]
LastObj.num=pos
Own.pos+=1
except:
pass
#Si no existe GL.informacion, no hacemos nada
Este script recuperará la información del diccionario de GL, que “leearchivo” (véase
Anexo B2) había creado, y activa el actuador para que se cree una copia del objeto
36
E80-Proyectos informáticos 22/07/2006
37
B4. Navega
Este script se encarga de abrir un navegador con la dirección web que el objeto de
información tuviera en su atributo “direccion” al pulsar sobre dicho objeto (es decir, cuando
sus sensores de ratón “Mouseover” y “Mouseclick” estén activos a la vez)
import webbrowser
import GameLogic
cont=GameLogic.getCurrentController()
owner=cont.getOwner()
mouseover=cont.getSensor("Mouseover")
click=cont.getSensor("Mouseclick")
38
E80-Proyectos informáticos 22/07/2006
B5. Pos
Este script se invocará cuando el usuario desee añadir sus propios ítems de
información.
En concreto, añadirá con el formato adecuado la información de la posición actual
(más un valor constante en el eje Z para que el objeto aparezca en el aire) y la dirección
web a un archivo que tenga el mismo nombre que la escena actual de Blender (o lo creará,
si no existe).
import sys
import GameLogic as GL
controller=GL.getCurrentController()
owner=controller.getOwner()
i=owner.getPosition()
i[2]=i[2]+1.5
sys.stdin.flush()
print "posicion: ",i
print "web: ",
sys.stdin.flush()
web=sys.stdin.readline()
if web[:-1]!="":
f=open(GL.getCurrentScene().getName(),"a")
i=str((str(i)[1:-1], web[:-1]))
f.write(i[1:-1])
f.write('\n')
print i
f.close()
39
ANEXO C. Requerimientos y bugs conocidos.
40