creación interactiva de grafos de escena para aplicaciones
TRANSCRIPT
Creación Interactiva de Grafos de Escena para
Aplicaciones Gráficas 3D
Juan Camilo Ibarra López
Universidad de los Andes
Facultad de Ingeniería
Departamento de Ingeniería de Sistemas y Computación
Bogotá D.C.
Junio de 2007
Creación Interactiva de Grafos de Escena para
Aplicaciones Gráficas 3D
Juan Camilo Ibarra López
Tesis para optar al título de
Ingeniero de Sistemas y Computación
Profesor Asesor:
Fernando De la Rosa R., Ph.D.
Universidad de los Andes
Facultad de Ingeniería
Departamento de Ingeniería de Sistemas y Computación
Bogotá D.C.
Junio de 2007
Este proyecto fue desarrollado para optar por el
titulo de Ingeniero de Sistemas y Computación
en la Universidad de los Andes durante los meses
de Enero a Junio de 2007.
Agradezco a todas las personas que de una u otra
manera colaboraron durante el desarrollo de este
proyecto.
Preguntas, comentarios o sugerencias favor
contactarme a mi correo electrónico.
Dedicado a mi mamá Rufina, mi papá Jorge
Omar (Q.E.P.D), mis hermanos y a toda mi
familia.
iv
Tabla de Contenidos
Pag.
Tabla de Figuras…………………………………………………………………. vi
Introducción……………………………………………………………………… 1
Capítulo 1. Prefacio
1.1 Objetivos…………………………………………………………………. 3
1.1.1. Objetivo General………………………………………………………. 3
1.1.2. Objetivos Específicos…………………………………………………. 3
1.2 Metodología……………………………………………………………… 4
1.3 Marco Teórico: Grafos de Escena……………………………………….. 5
Capítulo 2. Problema a Resolver y Propuesta de Solución
2.1. Problema a Resolver…………………………………………………….. 9
2.2. Propuesta de Solución…………………………………………………… 9
2.2.1. Representación de los Modelos Geométricos………………………… 9
2.2.2. Vistas sobre la Representación………………………………………... 16
2.2.3. Exportación a lenguajes de descripción geométrica…………………... 20
2.2.4. Usuarios del Sistema………………………………………………….. 21
2.3. Definición del Sistema………………………………………………….. 21
2.3.1. Requerimientos Funcionales………………………………………….. 21
2.3.2. Requerimientos No Funcionales………………………………………. 23
Capítulo 3. Diseño de la Solución
3.1. Modelo UML de Casos de Uso………………………………………. 25
3.2. Diseño de la Solución…………………………………………………… 25
3.2.1. Diseño del Kernel…………………………………………………….. 27
3.2.2. Diseño de la Interfaz………………………………………………….. 28
3.2.3. Diseño de la Persistencia……………………………………………… 38
3.2.3.1. Archivo XML…………………………………………………….. 39
3.2.3.2. Archivo OBJ……………………………………………………… 41
Capítulo 4. Resultados 42
Capítulo 5. Conclusiones y Trabajos Futuros
5.1. Conclusiones…………………………………………………………….. 52
v
5.2. Trabajos Futuros………………………………………………………… 52
Bibliografía……………………………………………………………………….. 54
Anexos
Anexo 1. Requerimientos Funcionales (Plantillas)………………………….. 56
Anexo 2. Requerimientos No Funcionales (Plantillas)………………………. 65
Anexo 3. Especificación de Atributos del paquete Kernel…………………... 67
Anexo 4. Especificación de Parámetros del Archivo XML…………………. 75
vi
Tabla de Figuras
Pag.
Figura 1. Idea principal de la herramienta……………………………………. 2
Figura 2. Grafo de Escena y su representación 3D “Avatar”………………… 5
Figura 3. Estructura general de la Jerarquía propuesta………………………. 10
Figura 4. Definición de Caja…………………………………………………. 11
Figura 5. Definición de Esfera……………………………………………….. 11
Figura 6. Definición de Cilindro……………………………………………... 12
Figura 7. Definición de Disco………………………………………………... 12
Figura 8. Definición de Disco Parcial………………………………………... 12
Figura 9. Definición de Toroide……………………………………………… 12
Figura 10. Definición de Representación por la Frontera……………………... 12
Figura 11. Ejemplo de la utilización de Grupos………………………………. 13
Figura 12. Definición de Referencia…………………………………………... 14
Figura 13. Ejemplo de Referencias. “Automóvil_1”………………………….. 15
Figura 14. Ejemplo de Referencias. “Automóvil_2”………………………….. 15
Figura 15. Vista tipo Árbol……………………………………………………. 17
Figura 16. Vista tipo Grafo……………………………………......................... 18
Figura 17. Vista tipo 3D……………………………………………………….. 19
Figura 18. Diferentes visualizaciones 3D (Puntos, líneas, sombreado plano,
sombreado suavizado) ……………………………………………..
20
Figura 19. Diagrama de Casos de Uso……………………………………........ 25
Figura 20. Organización del paquete Kernel…………………………………... 26
Figura 21. Diagrama de Clases del paquete Kernel…………………………... 28
Figura 22. Diagrama de Clases del paquete Interfaz…………………………. 29
Figura 23. Frame Principal……………………………………………………. 30
Figura 24 Frame New Element……………………………………………….. 31
Figura 25. Frame Edit Element……………………………………………….. 32
Figura 26. Frame Material……………………………………………….......... 33
Figura 27. Frame New Transformation……………………………………...... 34
vii
Figura 28. Frame Edit Transformation………………………………………... 35
Figura 29. Frame GraphView…………………………………………………. 36
Figura 30. Frame Graph 3D…………………………………………………... 37
Figura 31. Componente Directorio del archivo
XML………………………………………………………………..
39
Figura 32. Componente Elemento del archivo XML………………………….. 40
Figura 33. Componente Transformación del archivo XML…………………… 40
Figura 34. Vista tipo árbol “Avatar”…………………………………………... 42
Figura 35. Vista tipo Grafo “Avatar”………………………………………….. 42
Figura 36. Vista tipo 3D “Avatar”…………………………………………….. 43
Figura 37. Objeto Exportado a VRML “Avatar”……………………………… 43
Figura 38. Vista tipo árbol “Bart”……………………………………………... 45
Figura 39. Vista tipo Grafo “Bart”…………………………………………….. 45
Figura 40. Vista tipo 3D “Bart”……………………………………………….. 45
Figura 41. Objeto Exportado a VRML “Bart”………………………………… 45
Figura 42. Vista tipo árbol “Escena”………………………………………….. 48
Figura 43. Vista tipo Grafo “Escena”…………………………………………. 48
Figura 44. Vista tipo 3D “Escena”…………………………………………….. 49
Figura 45. Objeto Exportado a VRML “Escena”……………………………… 49
1
Introducción___________________________________________
Actualmente, dentro de la Ingeniería de Sistemas y Computación existe un área la cual por
su naturaleza llama mucho la atención entre el público en general: la Computación Gráfica.
Esta área estudia la forma de representar y procesar modelos geométricos propios de
espacios bidimensionales y tridimensionales reales o virtuales para visualizarlos en una
pantalla de computador. Durante los últimos años, la utilización de técnicas de animación
3D en el cine, el entretenimiento, la publicidad y la industria en general junto con el avance
de las tecnologías de software y de hardware, ha creado un renacido interés por el estudio
de esta área tanto en el ámbito nacional como internacional.
Uno de los temas de estudio en Computación Gráfica es los Grafos de Escena, los cuales
definen una estructura de datos en la representación de modelos geométricos compuestos
2D y 3D. Los grafos de escena permiten la definición de jerarquías y de relaciones entre los
elementos que componen un elemento de mayor complejidad (inclusive una escena 3D) y
facilita la manipulación de dichos elementos ya sea por agrupaciones o individualmente. La
utilización de un paradigma como el de Grafos de Escena es un tema indispensable en el
aprendizaje de la Computación Gráfica ya que ayuda a la eficiencia de la representación de
los objetos por parte tanto del lenguaje de programación como por el hardware que lo hace
posible. Dicha eficiencia se debe a la manera en que los Grafos de Escena organizan la
información de los objetos que hacen parte de la escena, de tal forma que su búsqueda,
actualización y procesamiento se lleve a cabo utilizando el mínimo de recursos de
procesador y tarjeta de video para poder utilizarlos en tareas más importantes como la
rasterización y el renderizado.
Dentro de un pipeline genérico de construcción de modelos geométricos complejos
(inclusive escenas completas), el paso de un modelo teórico a su representación en un
lenguaje de programación hace indispensable la comprensión de los Grafos de Escena y la
forma de representarlos en dicho lenguaje. Es entonces donde entra a jugar la posibilidad de
crear una aplicación interactiva con el propósito de facilitar tanto al desarrollador como al
estudiante la construcción de Grafos de Escena teóricos y de generar dos resultados
2
principales (Figura 1): Un Objeto geométrico 3D resultante y la exportación de dicho
modelo a un lenguaje de Descripción Geométrica especifico.
Este trabajo pretende mostrar y proponer una aplicación de software para la ayuda en el
curso de Computación Gráfica de la Universidad de los Andes en el proceso de
construcción de modelos geométricos compuestos representados en Grafos de Escena. La
aplicación ofrece diferentes herramientas visuales y una Interfaz Gráfica de usuario de
fácil comprensión. Los modelos geométricos definidos podrán ser exportados a lenguajes
de descripción de geometrías usados en el desarrollo de aplicaciones computacionales
gráficas 3D. (Figura 1)
Figura 1. Idea principal de la Herramienta
El documento esta dividido en 5 capítulos. En el primer capítulo se presentan los Objetivos
del proyecto, la metodología utilizada y un marco teórico para situar contextualmente al
lector. En el segundo capítulo se enuncia el problema a resolver y la solución propuesta por
medio de la descripción del sistema y la utilización de modelos y definiciones. En el tercer
capítulo se detalla el diseño de la solución y de cómo fue implementada. En el cuarto
capítulo se muestran los resultados de la implementación. En el quinto capítulo se dan las
conclusiones del trabajo realizado y se proponen posibles trabajos futuros que
complementan el proyecto.
Objeto Compuesto 3D
GUI Grafo de Escena
Objeto 3D
Descripciones Geométricas
3
Capítulo 1. Prefacio____________________________________
1.1.Objetivos
1.1.1. General
Analizar, diseñar e implementar una herramienta de Software de apoyo al curso de
Computación Gráfica de la Universidad de Los Andes con el fin de apoyar la enseñanza del
tema de grafos de escena por medio de la interacción con diferentes visualizaciones de la
misma instancia de un grafo de escena y tener la posibilidad de exportarlo a diferentes
lenguajes de descripción geométrica 3D.
1.1.2. Específicos
• Construir una aplicación computacional con componentes gráficos 2D y 3D utilizando
procesos de desarrollo de Ingeniería de Software.
• Apoyar el proceso de diseño y construcción de modelos geométricos compuestos
utilizando vistas gráficas 2D y 3D interactivas sobre un mismo Grafo de Escena de
representación.
• Investigar, aplicar y evaluar el uso de diferentes tecnologías de representación 2D y 3D
para su utilización dentro de la aplicación.
• Investigar, aplicar y evaluar diferentes lenguajes de representación geométrica para
generar los modelos geométricos definidos por los usuarios de la aplicación.
• Diseñar una herramienta flexible y fácilmente extensible para su utilización en pipelines
de diseño y modelado 3D.
4
• Ofrecer al usuario una aplicación confiable, estable y de fácil uso para la creación de
una estructura jerárquica que represente objetos geométricos compuestos (inclusive una
escena) donde existan objetos con relaciones de transformación entre ellos.
• Apoyar el aprendizaje del tema de Grafos de Escena por medio de un modelo de
learning by doing y la ayuda de una interfaz gráfica (GUI) de fácil uso.
• Generar entusiasmo entre los estudiantes de Ingeniería de Sistemas para la construcción
de herramientas de apoyo a las cátedras universitarias.
1.2. Metodología
Para el desarrollo de este proyecto, se plantea la utilización de una metodología por ciclos,
donde al final de cada ciclo se obtiene un prototipo funcional de la aplicación. Cada ciclo se
divide en cuatro fases principales. La primera, es la fase de análisis en donde se toma en
cuenta los resultados anteriores (excepto en el primer ciclo) se plantean soluciones a los
problemas encontrados y se proponen nuevas extensiones si cabe lugar a ellas. En la
segunda fase, se diseñan las soluciones y extensiones para el prototipo existente. En la
tercera fase, se implementan dichos diseños y se hacen pruebas de las extensiones y
soluciones acopladas. En la cuarta y última fase, se hacen pruebas generales de la
aplicación, y se plantean nuevas mejoras si hacen falta.
En la primera parte del proyecto, antes de comenzar con el ciclo de desarrollo, se hizo una
investigación de la importancia de los Grafos de Escena en la construcción de modelos 3D
así como las librerías y usos que se le dan en diferentes ambientes de software. A
continuación se hizo una propuesta preliminar de la herramienta tomando en cuenta las
tecnologías disponibles y sus alcances, la problemática a resolver, los posibles métodos de
solución, el alcance y delimitación del proyecto, y los resultados esperados al final del
mismo. Tomando en cuenta esta propuesta preliminar, se comenzó con el ciclo de
desarrollo a partir de la segunda fase en donde se hace el primer diseño de la aplicación.
5
A partir de este punto, se continúa con la metodología por ciclos hasta finalizar con la
herramienta de software totalmente funcional.
1.3. Marco Teórico: Grafos de Escena
Un Grafo de Escena es una estructura de datos utilizada en la construcción de
representaciones gráficas de objetos geométricos compuestos (inclusive escenas 3D
completas) que ordena lógicamente una serie de nodos que contienen información acerca de
cada uno de los elementos que componen dicho objeto geométrico. Esta estructura
organizada como un árbol n-ario permite que un nodo tenga una cantidad indefinida de
hijos pero que únicamente tenga un padre y en donde una operación sobre un nodo se
propaga automáticamente sobre todos sus hijos (Figura 2). La utilización de este tipo de
estructura se debe principalmente a la necesidad de organizar dicha información de forma
jerárquica con la finalidad de obtener una mayor eficiencia en la construcción de
escenarios interactivos. Otro punto importante de este tipo de diseño es el que, además de
tener información geométrica y de visualización, también se pueden tener nodos con
información adicional, como sonidos, detección de colisiones y fuentes de datos que
ayudan a enriquecer el objeto geométrico representado.
Figura 2. Grafo de Escena y su representación 3D. “Avatar”
6
La utilización de este tipo de estructura conlleva un proceso de construcción cíclica de un
objeto geométrico compuesto en 4 etapas: Generación, Recorrido, Transformación,
Rasterización y Visualización.[13]
1. Generación: En esta etapa se genera el Grafo de Escena con datos obtenidos a
partir de los objetos y sus relaciones que componen un objeto geométrico
compuesto en caso de ser el primer ciclo, o datos actualizados en caso de ser un
ciclo posterior. Esta actualización puede significar cambios de datos dentro de
algún(os) nodo(s) del grafo, adición de nuevos nodos y/o eliminación de nodos
existentes. Esta etapa termina cuando el Grafo de Escena refleja el estado actual
total del objeto geométrico compuesto.
2. Recorrido: En esta etapa se recorre el Grafo de Escena actualizado para generar los
datos de entrada para etapas posteriores e información para crear los comandos
adecuados de la tecnología utilizada (v.gr. instrucciones OpenGL, JOGL o VRML)
3. Transformación: En esta etapa se aplican las transformaciones necesarias como
matrices de transformación, generación de coordenadas de textura, clipping o
iluminación, a las primitivas o al conjunto de datos que las definen. La utilización
de una estructura como el Grafo de Escena permite que estas transformaciones sean
aplicadas únicamente a los objetos que pertenezcan a la misma línea jerárquica
(padre, hijo, nieto, etc.) sin afectar a los demás.
4. Rasterización y Visualización: Esta etapa es ejecutada por el API gráfico y
consiste en la transformación de representaciones geométricas de alto nivel en
píxeles. Dichos píxeles según sus características, son finalmente enviados y
dibujados por el dispositivo de salida, generalmente una pantalla de computador.
La comprensión de la lógica detrás de la construcción de un grafo de escena es un tema
crítico en el aprendizaje de la computación gráfica ya que esta representación permite tener
un control adecuado sobre la dinámica de objetos geométricos compuestos (inclusive
7
escenas) brindando una organización jerárquica de objetos y teniendo la posibilidad de
controlar localmente cambios relativos a un nodo sin afectar otros nodos que no hacen parte
de su descendencia, es decir, los cambios locales tienen como eje de referencia una
posición específica sobre la cual se realizan. Este tipo de jerarquía facilita notablemente el
efecto de los cambios.
Además de los nodos que definen elementos geométricos del grafo, también se definen
nodos que agrupan elementos geométricos que tienen alguna característica en común,
normalmente de pertenencia. Estos nodos se definen normalmente como grupos y en
algunos casos como layers, los cuales generan un nuevo nivel de control sobre la escena.
Actualmente, todas las aplicaciones para la construcción de gráficas utilizan algún tipo de
grafo de escena para el control de los cambios de los objetos, tanto en 2D como en 3D.
Ejemplos de ello son los programas CAD como AutoCad, Solid Edge, 3DStudio Max y
programas de 2D como Adobe Illustrator y Corel Draw. Además de programas de
modelado, los motores gráficos también utilizan los grafos de escena para la representación
de objetos, como por ejemplo VRML [15], OpenGL [11], DirectX y Java3D. También
existen librerías especializadas en la construcción de grafos de escena las cuales funcionan
sobre algún motor gráfico para mostrar las escenas. Un ejemplo es OpenSG [12] el cual es
un sistema de Grafos de Escena portable para la construcción de aplicaciones gráficas en
tiempo real desarrollado bajo licencia GPL. Otro ejemplo es Open Scene Graph [10] el cual
es una ToolKit para el desarrollo de aplicaciones 3D de alto desempeño desarrollado en
C++ y OpenGL.
El tema de los Grafos de Escena es un tema destacado por algunos profesores universitarios
del curso de Computación Gráfica. Bouvier [3] propone 4 posibles ejercicios que facilitan
la comprensión incremental del concepto de grafo de escena: (a) creación de un Grafo de
Escena, (b) representación e interpretación de un Grafo de Escena, (c) utilización de
lenguajes de Grafos de Escena e (d) implementación de un sistema de Grafos de Escena.
Cada uno de estos ejercicios debe entonces tener su propia preparación así como su sistema
de evaluación para lograr los objetivos educativos.
8
Otra aproximación al tema de los Grafos de Escena, es el llevado a cabo por la Universidad
de Brown en Estados Unidos con su programa Exploratories [5] en el que el objetivo es
tener una serie de applets de Java disponibles para el estudiante en donde se explica de una
forma interactiva diferentes temas de computación, como por ejemplo los Grafos de
Escena, Teoría de Color, Procesamiento de Señales y otros.
9
Capítulo 2. Problema a Resolver y Propuesta de Solución_______
2.1.Problema a Resolver
La construcción de aplicaciones computacionales que desarrollan o refuerzan conceptos y
conocimientos se convierten en una herramienta de apoyo a la docencia. En este trabajo se
propone una herramienta de apoyo que permita la comprensión del concepto del grafo de
escena para representar objetos geométricos compuestos y su conversión a diferentes
lenguajes de descripción geométrica.
2.2.Propuesta de Solución
La comprensión del funcionamiento y la finalidad de los Grafos de Escena es un punto
clave para obtener los resultados deseados en la construcción de objetos geométricos
compuestos. Una primera aproximación para dicha construcción es entonces el diseño del
Grafo de Escena, en donde a través de diferentes tipos de nodos se representa un objeto
geométrico compuesto. Este diseño debe ser interactivo de tal forma que a medida que se
edite el grafo de escena, sea posible la visualización del objeto resultante. Después de este
diseño, el siguiente paso es el de traducir este lenguaje gráfico al API del lenguaje en el que
queremos hacer la representación y así poder integrar/utilizar el objeto geométrico
construido.
La herramienta computacional desarrollada incluye una solución a los siguientes sub-
problemas:
• Representación de los modelos geométricos
• Vistas sobre la representación
• Exportación a lenguajes de descripción geométrica.
2.2.1. Representación de los Modelos Geométricos
10
Se define una jerarquía de nodos que contiene la información del objeto geométrico
compuesto que se desea construir. En esta jerarquía se tienen 6 tipos de nodos principales:
Directorio, Mundo, Elemento, Transformación, Material y Referencia a Material. Cada uno
de estos nodos tiene sus características especiales así como reglas sobre la posición que
deben ocupar dentro de la jerarquía y la cantidad y tipo de nodos que pueden tener por
debajo y por encima de ellos (ancestros y descendientes) (Figura 3)
Figura 3. Estructura general de la Jerarquía propuesta
• Directorio (directory): Nodo raíz de la jerarquía que contiene únicamente un conjunto
de mundos (objetos de interés) del usuario. Este conjunto de mundos se puede
interpretar como la organización de varios Grafos de Escena o como repositorios de
objetos los cuales se pueden referenciar más adelante para usarlos en Mundos
concretos. El nombre del directorio se utiliza como identificador único.
• Mundo (World): Nodo que contiene la información de un Grafo de Escena que
representa un objeto geométrico complejo de interés para el usuario el cual va a ser
mostrado dentro de un viewport. Cada mundo tiene un conjunto de materiales a
disposición de sus elementos geométricos, una secuencia de transformaciones que
afectan a todos sus elementos y una secuencia de elementos que componen el mundo.
La secuencia de transformaciones representa el conjunto de matrices de transformación
que son aplicadas a todo el conjunto de elementos geométricos dentro del Grafo de
11
Escena. Como son matrices, el orden en que son aplicadas influye en el resultado
obtenido. La secuencia de elementos representa la jerarquía de objetos dentro del Grafo
de Escena. El nombre del mundo se utiliza como identificador único en el directorio,
por eso, no pueden existir dos mundos con un mismo nombre.
• Elemento (Element): Nodo que representa un elemento dentro de un Grafo de Escena.
Cada elemento tiene un identificador único auto-generado por la aplicación que sirve
como llave primaria para las funciones de búsqueda. Existen dos tipos: elementos de
representación y elementos de referencia.
o Elementos de Representación:
Elementos que contienen información geométrica de objetos que hacen parte del
Grafo de Escena. Cada uno tiene una referencia a un material (si el elemento tiene
un material definido), una secuencia de transformaciones que lo afectan tanto a él
como a su descendencia (puede o no existir) y una secuencia de elementos hijos que
definen una jerarquía local al elemento (puede no existir). Existen siete tipos de
elementos de representación que se ofrecen al usuario: Caja, Esfera, Cilindro, Disco,
Disco Parcial, Toroide y BRep.
Figura 4. Definición de Caja
Caja (Box): Elemento que define un paralelepípedo a
partir de su altura en el eje Y, su ancho en el eje X y su
profundidad en el eje Z y se encuentra centrado en el
origen
Figura 5. Definición de Esfera
Esfera (Sphere): Elemento que define una esfera a partir
de su radio y se encuentra centrada en el origen. La
discretización en paralelos y meridianos está predefinida.
12
Figura 6. Definición de Cilindro
Cilindro (Cylinder): Elemento que define un cilindro
hueco a partir del radio de su base inferior (plano XY=0),
el radio de su base superior (plano XY=altura) y su altura,
esta altura es positiva sobre el eje Z positivo y su tapa
inferior se encuentra centrada en el origen. La
discretización radial y en altura está predefinida.
Figura 7. Definición de Disco
Disco (Disk): Elemento que define un Anillo Circular
plano a partir de su radio interno y su radio externo. Se
encuentra sobre el plano XY y centrado en el origen. La
discretización radial y angular está predefinida.
Figura 8. Definición de Disco
Parcial
Disco Parcial (Partial Disk): Elemento que define un
Arco de Anillo Circular a partir de un radio interno, un
radio externo, un ángulo de inicio y un ángulo de barrido.
Se encuentra sobre el plano XY y centrado en el origen.
La discretización radial y angular está predefinida.
Figura 9. Definición de Toroide
Toroide (Torus): Elemento que define un toro a partir de
un radio externo y un radio interno. El radio externo es el
radio de la ruta circular que recorre la circunferencia de
radio interno. La ruta circular con radio externo se define
sobre el plano XY centrada en el origen. La discretización
radial tanto en la ruta circular como en la circunferencia
de recorrido está predefinida.
Figura 10. Definición de
Representación por la
Frontera.
Representación por la Frontera (Brep): Elemento de
representación geométrica en donde se define la
superficie de un objeto a partir de un conjunto de vértices
y un conjunto de caras triangulares que utilizan dichos
vértices. Este tipo de representación se lee desde un
archivo con formato Wavefront OBJ. El centro del objeto
y su orientación, se encuentra definida en el archivo por
13
la disposición de sus puntos.
o Elementos de Referencia:
Un elemento de referencia, como su nombre lo indica, permite hacer referencia a
elementos existentes ya sea de forma individual o grupal. La definición de un
elemento de referencia no requiere ni material ni información geométrica
complementaria. Existen dos tipos de Elementos de Referencia: Grupo y Referencia.
• Grupo (Group): Elemento de referencia que agrupa un conjunto de elementos
que forman una jerarquía local donde la raíz es el elemento Grupo. Esta forma de
agrupación ayuda a tener un control centralizado de operaciones, principalmente de
transformación, sobre un subconjunto de elementos que pertenecen al Grafo de
Escena. Puede o no tener una secuencia de transformaciones que afectaran a los
nodos que pertenezcan al grupo. Este tipo de nodo se utiliza principalmente por
orden dentro del Grafo de Escena así como para definir transformaciones que
afectan por igual a un grupo de elementos de representación. Un ejemplo de ello es
dentro del ejemplo “Avatar” (Figura 2) en donde se definen varios grupos por orden
dentro del grafo (Tronco, Brazos y Piernas) y además se puede ver que por ejemplo
en el grupo “piernas”, que tiene dos elementos de representación, se comparte una
misma traslación, pero cada uno sus transformaciones locales.
Figura 11. Ejemplo de la utilización de Grupos
14
• Referencia (Reference): Elemento que hace referencia a un elemento de
representación o a un grupo. Las referencias, como elementos independientes, no
tienen elementos hijos. Este tipo de elementos se utiliza para tener una extensión en
la forma de construir un Grafo de escena, de tal forma que se define una geometría
en un elemento de representación y se hace referencia a ella para utilizarla en otro
lugar del grafo sin necesidad de volver a definirla. Dicha referencia simula tener
toda la jerarquía del elemento referenciado en el lugar en el que se encuentra. Como
es un elemento independiente, una referencia tiene sus propias transformaciones.
(Figura 12)
Figura 12. Definición de Referencia
Las Referencias pueden ser utilizadas en dos casos principalmente. El primero es
cuando se define un elemento de representación base y se hace referencia a él en
otro lugar con diferentes transformaciones. Un ejemplo de ello es en un automóvil
en donde se define un elemento “Llanta” con sus características y se hace referencia
a dicho elemento para dibujar las tres llantas restantes. Como estas referencias son
independientes, cada una de ellas tiene sus propias transformaciones. (Figura 13)
15
Figura 13. Ejemplo de Referencias. “Automóvil_1”.
El segundo caso es cuando se utilizan mundos (Grafos de Escena) como repositorios
de objetos geométricos complejos, y se hace referencia a un elemento dentro de él
para ser utilizado en un nuevo mundo que los integra. Utilizando el mismo ejemplo
del automóvil, tenemos un mundo “Automóvil” que se desea construir y un mundo
repositorio “Partes” en donde se encuentran las partes del automóvil, en este caso
solo una llanta. Dentro del mundo “Automóvil” se construye entonces la jerarquía
teniendo un elemento de Representación “Carrocería” quien es padre de cuatro
referencias al grupo “Llanta” que se encuentra en el repositorio, las cuales son
independientes y por ello tienen sus propias transformaciones asociadas. (Figura 14)
Figura 14. Ejemplo de Referencias. “Automóvil_2”
16
• Transformación (Transformation): Nodo que representa una transformación
geométrica sobre un nodo, ya sea un elemento o un mundo. Existen tres tipos de
transformación básica: Traslación, Rotación y Escalado. Hay que tener en cuenta que la
aplicación de transformaciones no es conmutativa, así que el orden en el que éstas se
aplican es importante para el efecto que se quiere dar. Cada transformación tiene un
identificador único auto-generado por la aplicación que sirve como llave primaria para las
funciones de búsqueda.
• Material (Material): Nodo que contiene las características del material que se aplica a
un elemento de representación las cuales son: color especular (bajo modelo RGBA), color
difuso (bajo modelo RGBA), color ambiente (bajo modelo RGBA), color de emisión (bajo
modelo RGBA), y factor de brillo. [2]Estos nodos se definen únicamente al interior de un
nodo Mundo. El nombre del material sirve de identificador único en el mundo.
• Referencia a Material (Ref. Material): Este es un tipo de nodo especial el cual aparece
únicamente en la definición de un nodo de elemento de representación y define una
referencia a uno de los materiales que se encuentran disponibles en el mundo donde se
encuentra dicho elemento. Cabe anotar que un elemento de representación únicamente
puede tener un solo material asociado.
2.2.2. Vistas sobre la Representación
Para la revisión/validación de las jerarquías construidas por el usuario, se definen tres tipos
de vistas: Tipo árbol, Tipo Grafo y Tipo 3D. La definición de estas vistas se debe a la
necesidad de presentar al usuario varios puntos de vista sobre un mismo conjunto de datos,
y así, lograr una mejor comprensión de la representación de los grafos de escena.
• Vista Tipo Árbol: Este es el tipo de vista que se encuentra por defecto y con el que
primero se enfrenta el usuario. Esta construido utilizando la clase JTree del paquete
javax.swing de Java J2SE [6] y su propósito es el de tener un lenguaje visual sencillo
sobre la jerarquía del modelo de datos. La estructura define el orden en el que el usuario
17
construye el objeto de interés. En particular, una secuencia de transformaciones a
aplicar sobre un elemento aparecen como hijos del elemento y se aplican de arriba hacia
abajo. En este tipo de vista, los niveles jerárquicos aparecen horizontalmente. Cada tipo
de nodo tiene su propio icono que lo identifica, así como un nombre y un tipo de nodo.
Dentro de esta visualización, también es posible saber el identificador de un nodo al
pasar el Mouse sobre el icono del nodo. Esta es la vista que se utiliza para la
construcción de los modelos jerárquicos. (Figura 15)
Figura 15. Vista tipo Árbol sobre el grafo de escena del Avatar
• Vista Tipo Grafo: El segundo tipo de visualización es el de Grafo de Escena clásico
que se encuentra en la literatura. Esta construido utilizando la clase JGraph del paquete
org.jgraph.[7] En este tipo de visualización se muestra únicamente un único mundo
(Grafo de Escena) escogido por el usuario. No se muestran los materiales ni las
referencias hechas por los elementos a ellos. La estructura define el orden a aplicar los
nodos en un lenguaje de descripción geométrico. En particular, una secuencia de
transformaciones a aplicar sobre un elemento aparecen antes del elemento y se aplican
de abajo hacia arriba. Los colores identifican el tipo de nodo y se muestra información
18
básica como nombre y tipo de nodo. En esta visualización no se muestra el
identificador. Los niveles jerárquicos aparecen verticalmente. (Figura 16)
Figura 16. Vista Tipo Grafo sobre el grafo de escena del Avatar
• Vista Tipo 3D: El Tercer y último tipo de visualización es la interpretación de un Grafo
de Escena en un lenguaje de modelado, en este caso, JOGL.[8] Se utiliza la clase
GLCanvas del paquete javax.media.opengl como lienzo de dibujo 3D y el API de JOGL
[8] para controlar los eventos de visualización. Únicamente se muestra uno de los
mundos (Grafo de Escena) dentro de toda la jerarquía. Cada elemento de representación
tiene su eje de referencia local representado por tres líneas perpendiculares (roja=eje X,
verde=eje Y, azul=eje Z). Se cuenta con tres planos de referencia globales, uno por cada
eje de coordenadas, dividido en celdas por unidades. Se cuenta con métodos de
navegación (Trackball, Zoom, Panning) a través del Mouse. Este tipo de visualización
sirve al usuario para observar los resultados de la construcción de los modelos
jerárquicos hechos en la vista tipo árbol. (Figura 17)
19
Figura 17. Vista Tipo 3D resultado de la interpretación del grafo de escena del Avatar
Este tipo de visualización tiene varios parámetros que se pueden ajustar para mejorar la
vista. Un modelo se puede ver con su representación en solo puntos, líneas o relleno, y
con un sombreado plano (Constante) o suavizado (Gouraud) siempre y cuando la
iluminación se encuentre habilitada. También se puede activar o desactivar la grilla de
referencia. Cada uno de los elementos se muestra con su eje de referencia local.
20
Figura 18. Diferentes vistas 3D (modo Puntos, modo líneas, modo sombreado plano, modo sombreado Gouraud)
de un mismo grafo de escena.
2.2.3. Exportación a lenguajes de descripción geométrica
Cada uno de los lenguajes de visualización tiene su propia forma de especificar los grafos
de escena, por lo que se hace necesario el estudio del API de cada lenguaje para poder hacer
una representación de objetos geométricos compuestos (i.e. una escena). La aplicación
ayuda al usuario en este aspecto brindándole la posibilidad de exportar los modelos creados
a diferentes lenguajes. Actualmente se exporta a VRML [1] (Lenguaje Interpretado) y a
OpenGL [11]en su versión para C [9] y para Java. En el caso de C se exporta código plano
y en el caso de Java se exporta una clase encargada de dibujar el modelo. Los modelos
exportados tienen un formato predefinido que tienen un tipo de sombreado suavizado, por
ello, para ser visualizados se debe asegurar que la aplicación tenga los parámetros de
iluminación configurados adecuadamente.
21
2.2.4. Usuarios del Sistema
El sistema plantea dos tipos de usuarios principales: Estudiantes y Modeladores 3D.
• Estudiantes: Son las personas que asistan a la cátedra de Computación Gráfica quienes
utilizaran la aplicación para crear modelos 3D y entender la forma y el porque de la
utilización de los Grafos de Escena tanto para la construcción como para la
visualización.
• Modeladores 3D: Son las personas que utilizaran la aplicación como base para la
construcción de modelos geométricos complejos para su posterior exportación a
lenguajes concretos de descripción geométrica.
2.3.Definición del Sistema
En esta sección se busca especificar el sistema por medio de sus requerimientos funcionales
y no funcionales. Los requerimientos funcionales se refieren a los servicios ofrecidos al
usuario que definen el comportamiento interno de la aplicación como los cálculos,
manipulación de datos y funcionalidades especificas. Los requerimientos no funcionales se
refieren a aquellos que juzgan la operación de un sistema como por ejemplo eficiencia,
extensibilidad, estabilidad, portabilidad y costo.
2.3.1. Requerimientos Funcionales
R.1 Agregar Mundo
El Usuario agrega un nodo de tipo mundo que define un objeto de interés del usuario
dentro del directorio. El nuevo mundo se convierte en el grafo de escena actual.
R.2 Agregar Elemento
22
El usuario agrega un nodo de tipo elemento a un mundo (Grafo de Escena). Este
elemento puede ser una geometría, un grupo, una copia de un elemento o una
referencia a un elemento.
R.3 Agregar Transformación
El usuario agrega una transformación geométrica a un elemento. Esta puede ser una
rotación, una traslación o un escalamiento.
R.4 Agregar Material
El usuario agrega un material a un elemento dentro de un mundo (Grafo de Escena).
R.5 Cargar Modelo BRep
El Usuario carga un archivo que representa un modelo geométrico de tipo
representación por la frontera (BRep).
R.6 Editar Nodo
El Usuario edita la información de un nodo existente. La operación de edición
depende del tipo de nodo: Escena, Mundo, Material, Elemento o transformación.
R.7 Generar Archivo de Exportación
El Usuario pide como salida el mundo actual bajo un lenguaje de descripción
geométrica. Los lenguajes soportados actualmente son VRML (lenguaje interpretado)
y OpenGL (versión C y versión Java).
R.8 Ver Grafo de Escena Teórico
El Usuario pide como salida una representación gráfica del grafo de escena teórico.
R.9 Ver Interpretación de Estructura Teórica
El Usuario pide como salida una representación gráfica del grafo de escena en un
modelo 3D.
23
El detalle de los requerimientos funcionales se encuentra en el Anexo 1. Requerimientos
Funcionales (Plantillas)
2.3.2. Requerimientos No Funcionales
N.1 Cargar Archivo XML
El Usuario debe poder cargar un archivo XML que describe uno o varios Grafos de
Escena u objetos geométricos complejos en el sistema para su posterior uso.
N.2 Generar Archivo XML
El Usuario debe poder generar un archivo XML como persistencia de los Grafos de
Escena u objetos geométricos complejos construidos dentro de la aplicación.
N.3 Facilidad de uso
Debido al público objetivo de la aplicación y su finalidad principal, el diseño de la
interfaz debe ser especialmente de fácil uso y utilización intuitiva. La utilización de
varias vistas sobre un mismo modelo de datos es indispensable
N.4 Claridad del Modelo Teórico
La representación gráfica del modelo teórico debe ser especialmente fácil de entender
e intuitiva para su uso. Este es un punto clave debido a que la comprensión del
concepto del grafo de escena y la jerarquización de una escena, depende mucho de su
representación gráfica.
N.5 Dinamicidad de las Representaciones
Las representaciones gráficas tanto teórica como práctica deben actualizarse de
manera dinámica e inmediata a medida que el usuario interactúe con la aplicación.
N.6 Mantenibilidad y Extensión del Software
24
La forma de codificación y documentación debe permitir un fácil mantenimiento y
extender las definiciones de primitivas, archivos a exportar, cambios en el software y
la adición de nuevos servicios de una manera sencilla.
El detalle de los requerimientos no funcionales se encuentra en el Anexo 2: Requerimientos
No Funcionales (Plantillas)
25
Capítulo 3. Diseño de la Solución__________________________
Este capítulo contiene la información de diseño de la aplicación computacional propuesta.
3.1. Modelo UML de Casos de Uso (Figura 19)
Figura 19. Diagrama de Casos de Uso
3.2. Diseño de la solución
Siguiendo el diseño de buena práctica que se promueve en la construcción de software de la
Universidad de los Andes, se definen dos módulos (paquetes) principales dentro de la
aplicación, el Kernel y la Interfaz. En el Kernel, se implementan todas las clases que tienen
que ver con los requerimientos funcionales de la aplicación y en la Interfaz todas las clases
que tienen que ver con la visualización de la información. Esta práctica de diseño permite
26
que la forma de ver la información e interacción con el usuario, este completamente
separada de los datos, esto posibilita cambiar la forma de visualización sin necesidad de
cambiar la forma de administración. Otra ventaja es la facilidad de extender y de modificar
la aplicación sin tener que modificar la lógica.
En este caso, se utiliza un patrón Interface en el cual una sola clase del paquete kernel es
visible para el paquete interfaz, y el cual le provee los diferentes servicios sobre los datos.
Este tipo de diseño permite centralizar los servicios y así poder bajar el nivel de
acoplamiento entre la interfaz y el Kernel.
El Kernel tiene tres partes principales. El Directorio, El Parser de XML y el Constructor de
Salidas. (Figura 20)
Figura 20. Organización del paquete Kernel
• El Directorio (Directory): Representa un conjunto de mundos (Grafos de Escena) con
sus elementos, materiales y transformaciones que el usuario se encuentra utilizando.
Dentro del modelo de datos que define una escena, se utiliza un patrón Observer en
donde cada objeto es observado por su objeto padre, lo que facilita la actualización en
caso de cambios dentro de ellos.
Paquete Kernel
Kernel
Directory (El Directorio)
XMLParser (Parser de XML)
OutputsBuilder (Constructor de Salidas)
Paquete Interfaz
27
• El Parser de XML (XMLParser): Es el encargado de interpretar el archivo XML que
se carga desde memoria secundaria. Se utiliza un Parser tipo SAX para acceso
secuencial al archivo y una programación guiada por eventos.
• El Constructor de Salidas (OutputsBuilder): Es el encargado de construir cada una de
las salidas de la aplicación como son el archivo XML, las representaciones del XML en
la interfaz y los archivos a exportar. Esta parte se encuentra construida siguiendo el
patrón Builder el cual permite para un mismo modelo de datos, tener diferentes clases
que construyen diferentes salidas implementando una clase genérica de construcción.
3.2.1. Diseño del Kernel
El paquete Kernel esta diseñado siguiendo el patrón Interface en donde el paquete Interfaz
puede ver la clase Kernel. La modularidad de las partes del kernel permite un
mantenimiento y posibilidad de extensión sencilla. En el caso de la construcción de la vista
Tipo 3D (Figura 17) la clase Model3DBuilder es la encargada de manejar toda la creación y
eventos de interacción. Es aquí en donde se usan las clases del paquete javax.media.opengl.
Otro punto importante es el uso de la clase PrimitivesBuilder la cual es la encargada de
extender las primitivas ofrecidas por JOGL y en donde un programador puede crear sus
propias primitivas. (Figura 21)
28
Figura 21. Diagrama de Clases UML del Paquete Kernel
La especificación de los atributos de las clases del paquete Kernel se encuentran en el
Anexo 3: Especificación de Atributos del Paquete Kernel.
3.2.2. Diseño de la Interfaz.
Por el lado de la Interfaz, se decide utilizar como base las clases del paquete javax.swing de
Java, principalmente la clase JFrame. Estas clases utilizan el patrón Observer para
comunicarse con la clase principal la cual es la única que tiene relación con la clase Kernel.
Este tipo de diseño permite disminuir el acoplamiento entre los dos paquetes que forman la
aplicación. La clase principal va construyendo frames autónomos a medida que los
necesita. Las únicas dos clases que tienen una instancia permanentemente son
CustomRenderer y JtreeHandler las cuales son necesarias para el control de la vista tipo
árbol (Figura 15).
La única clase que no es completamente autónoma es la clase JoglView ya que el lienzo de
Dibujo 3D es generado y controlado en el kernel. Esta clase recibe como parámetros de
29
construcción dicho lienzo que le entrega el kernel por medio de la clase principal de la
interfaz. En cuanto a visualización, se decide utilizar frames con poca información de texto
y pocos botones, para evitar la confusión del usuario.
El diseño de las clases sigue el patrón Interface como en el paquete Kernel, y en este caso
la clase visible es MainClass. (Figura 22)
Figura 22. Diagrama de Clases UML del Paquete Interfaz
Existen tres tipos de frames diseñados: Frame Principal, Frames Secundarios y Frames de
Visualización
3.2.2.1. Frame Principal (Figura 23)
30
Figura 23. Frame Principal
Frame Principal
Menús: Barra de menús con las opciones de trabajo del programa
Clipboard: Cuadro de texto que muestra la información de la copia o
referencia que se encuentra actualmente en el clipboard
Cuadro de
Información:
Cuadro de texto en donde aparece la información del nodo
seleccionado.
Área de Trabajo: Lugar de trabajo en donde se muestra la representación por
defecto del grafo de escena, JTree.
Consola de Control: Área de texto con la información relevante a los cambios en
el sistema y posibles errores dentro de la aplicación.
31
3.2.2.2.Frames Secundarios
Estos son los frames que apoyan la visualización y la funcionalidad de la aplicación. Los
primeros dos son los que tienen que ver con los elementos, y son los de “agregar elemento”
(Figura 24) y “editar elemento” (Figura 25).
Figura 24. Frame New Element
Frame New Element
Element ID Campo de Texto que contiene el identificador auto-generado
del elemento a agregar.
Element Type ComboBox que muestra las posibilidades de tipo de elemento
a agregar.
Element Name: Campo de texto para ingresar el nombre del nuevo elemento
Zona de
Parámetros:
En esta zona aparecen campos de Texto correspondientes a
los parámetros del nuevo elemento. Estos únicamente
aparecen cuando se ha escogido un tipo de elemento, y sus
etiquetas cambian dependiendo del tipo escogido.
Add: Botón que agrega el elemento. Únicamente aparece cuando se
ha escogido un tipo de elemento. Si alguno de los campos de
parámetros está vacío, la aplicación lanza una excepción y se
la muestra al usuario
Cancel: Botón que cancela la operación de agregar.
32
Figura 25. Frame Edit Element
Frame Edit Element
En el Titulo del Frame, se encuentra la información del mundo al que pertenece el
elemento, su identificador y su tipo actual.
Zona de Parámetros
antes de la Edición
En esta zona se encuentran los valores de los parámetros del
elemento antes de la edición.
Zona de Parámetros
después de la
Edición
En esta zona se encuentran los valores de los parámetros
después de la edición. Las etiquetas cambian a medida que se
cambia el tipo del elemento.
New Type: ComboBox que tiene la información del nuevo tipo que se le
va a asignar al elemento.
Name Campo de Texto editable que contiene el nombre del
elemento.
Edit: Botón que edita el elemento. Únicamente aparece cuando se
ha escogido un tipo de elemento. Si alguno de los campos de
parámetros está vacío, la aplicación lanza una excepción y se
la muestra al usuario
33
Cancel: Botón que cancela la operación de editar.
Load OBJ Botón que lanza un frame de búsqueda de archivos OBJ para
cargar una BRep. Únicamente aparece cuando el tipo de
elemento nuevo es BRep.
Vertex and Faces Área de Texto que contiene la información de vértices y caras
del elemento, en caso que este sea una BRep.
A continuación, tenemos el frame de Material, el cual es igual tanto para agregar como para
editar material. (Figura 26)
Figura 26. Frame Material
Frame Material
Cada color tiene una etiqueta que lo muestra al usuario, al igual que un botón que
lanza una paleta de colores para escoger.
Ambient Color Es el color ambiente del material.
Diffuse Color Es el color difuso del material.
Specular Color Es el color especular del material.
Emisión Color Es el color de emisión del material.
Shininess Es el nivel de brillo del material. Este se escoge a partir de un
slider.
34
Name Campo de Texto editable que contiene el nombre del
material.
Prueba de Material En esta zona aparece una esfera con el material especificado
por los parámetros.
Add/Edit: Botón que agrega o edita el material.
Cancel: Botón que cancela la operación de material.
Después tenemos los frames de transformación geométrica. Agregar (Figura 27) y editar
(Figura 28).
Figura 27. Frame New Transformation
Frame New Transformation
Type ComboBox que muestra las posibilidades de tipo de
transformación a agregar.
Zona de
Parámetros:
En esta zona aparecen campos de Texto correspondientes a
los parámetros de la nueva transformación. Estos únicamente
aparecen cuando se ha escogido un tipo de transformación, y
sus etiquetas cambian dependiendo del tipo escogido.
Add: Botón que agrega la transformación. Únicamente aparece
cuando se ha escogido un tipo de transformación. Si alguno
de los campos de parámetros está vacío, la aplicación lanza
una excepción y se la muestra al usuario
Cancel: Botón que cancela la operación de agregar.
35
Figura 28. Frame Edit Transformation
Frame Edit Transformación
Zona de Parámetros
antes de la Edición
En esta zona se encuentran los valores de los parámetros de la
transformación antes de la edición.
Zona de Parámetros
después de la
Edición
En esta zona se encuentran los valores de los parámetros
después de la edición. Las etiquetas cambian a medida que se
cambia el tipo de transformación.
Edit: Botón que edita la transformación. Únicamente aparece
cuando se ha escogido un tipo de transformación. Si alguno
de los campos de parámetros está vacío, la aplicación lanza
una excepción y se la muestra al usuario
Cancel: Botón que cancela la operación de editar.
3.2.2.3.Frames de Visualización
Estos son los frames que muestran los otros dos tipos de visualización que existen para ver
el conjunto de datos que representa el grafo de escena enriquecido.
El primero de ellos es el de Visualización tipo Grafo. (Figura 29)
36
Figura 29. Frame GraphView
Frame Graph View
Zona del Grafo En esta zona se muestra el grafo de la escena.
Close: Botón que cierra el frame.
El segundo es el de visualización 3D. (Figura 30)
37
Figura 30. Frame Graph 3D
Frame 3D View
Zona 3D En esta zona se muestra la escena 3D. Se puede interactuar
con la escena por medio del Mouse para navegación
Zona JTree En esta zona hay una representación de la escena visualizada
en forma de JTree
General Tab que contiene la información general de las características
de la escena visualizada.
Elements Tab que contiene la información de un elemento de la escena.
(No implementado)
Lights Tab que contiene la información de las fuentes de luz de la
38
escena. (No implementado)
Background Color Botón que determina el color de fondo de la escena. Lanza
una paleta de colores para escoger. Viene acompañado de una
etiqueta que tiene una muestra del color escogido
Grid ComboBox que activa/desactiva la grilla de referencia
Mode ComboBox que contiene las posibilidades de modo de los
elementos en la escena (POINT, LINE, FILL)
Lighting ComboBox que activa/desactiva la iluminación en la escena
Shading Model ComboBox que contiene la información del tipo de
sombreado a utilizar en caso que la iluminación este activa.
(FLAT, SMOOTH)
Close: Botón que cierra el frame.
3.2.3. Diseño de la Persistencia
Para la persistencia de la aplicación se utilizan dos tipos de archivos principales. El
primero, es un archivo en lenguaje XML que describe un grafo de escena con sus
componentes. La escogencia de este tipo de archivo es debido a que el lenguaje XML es un
lenguaje ya de por si jerarquizado, en donde se pueden definir nodos y relaciones de
pertenencia con nodos subsiguientes. Otra de las facilidades de utilizar este tipo de archivos
es la lectura de los mismos, ya que están disponibles diferentes algoritmos que los
interpretan y facilitan su utilización.
El otro tipo de archivos que se utilizan son en formato Wavefront OBJ que se utilizan para
describir geometrías de representación por la frontera. Este tipo de archivos es sencillo de
leer y tienen la información suficiente para describir una geometría de este tipo, una lista de
vértices y una lista de caras que hacen referencia a dichos vértices. Este tipo de archivos
únicamente se utilizan en la carga de geometrías ajenas a la aplicación, ya sea en creación
de un nuevo elemento o en su edición.
39
En el caso de las salidas de la aplicación, actualmente se utilizan tres tipos de lenguajes de
descripción geométrica: VRML, OpenGL bajo C y OpenGL bajo Java. (Ver Sección 2.2.3)
3.2.3.1. Archivo XML
Este archivo es el soporte de los grafos de escena utilizados en la aplicación. Tiene 3
componentes principales. En el primer componente se define el Directorio.
Figura 31. Componente Directorio del archivo XML
El segundo componente es el Elemento.
40
Figura 32. Componente Elemento del archivo XML
Y por último la transformación.
Figura 33. Componente Transformación del archivo XML
41
La especificación de los parámetros dentro del archivo XML se encuentra en el Anexo 4:
Especificación de Parámetros del Archivo XML
3.2.3.2. Archivo Wavefront OBJ
Este tipo de archivo se utiliza para importar geometrías que se encuentran definidas por
representación por la frontera. Cada línea del archivo tiene como primer carácter una letra.
La letra v define que la información a continuación es un vértice. Los vértices se definen
como tres números flotantes separados por un espacio. La letra f define que la información
a continuación es una cara. La cara se define como tres números enteros que son los índices
de los vértices que componen la cara triangular. Por ejemplo para definir un cubo de lado 1
el archivo OBJ se vería así:
#Ejemplo de Cubo en Archivo OBJ
v 0.0 0.0 0.0
v 1.0 0.0 0.0
v 1.0 1.0 0.0
v 0.0 1.0 0.0
v 0.0 0.0 1.0
v 1.0 0.0 1.0
v 1.0 1.0 1.0
v 0.0 1.0 1.0
f 0 1 2
f 0 2 3
f 1 5 6
f 1 6 2
f 5 4 7
f 5 7 6
f 0 7 4
f 0 3 7
f 3 2 7
f 7 2 6
f 4 0 1
f 4 1 5
42
Capítulo 4. Resultados___________________________________
En este capítulo se muestran los resultados obtenidos de la implementación de la aplicación
con ejemplos de Objetos Geométricos compuestos. Se muestran las diferentes vistas del
modelo de datos, y extractos de los archivos exportados. Para la visualización del archivo
VRML se utilizó el visor Cortona VRML Viewer Client 5.1. [4]
En la primera prueba, se construye un modelo geométrico “Avatar” utilizando únicamente
primitivas.
Figura 34. Vista Tipo Árbol del
modelo “Avatar”
Figura 35. Vista Tipo Grafo del modelo “Avatar”
43
Figura 36. Vista tipo 3D del modelo “Avatar”
Figura 37. Objeto Exportado a VRML del
modelo “Avatar”
Extracto de Código Java /**
* This class was automatically generated from SGBuilder Uniandes
* CopyRight (c) Universidad de los Andes
*/
import javax.media.opengl.GL;
import javax.media.opengl.glu.GLU;
import javax.media.opengl.glu.GLUquadric;
public class Avatar{
private GL gl;
private GLU glu=new GLU();
public Avatar(){
}
public void drawScene(){
gl.glTranslatef(10.0f, 0.0f, 0.0f);
gl.glRotatef(45.0f, 0.0f, 1.0f, 0.0f);
gl.glPushMatrix();
/*Element: Tronco [Group]*/
gl.glPushMatrix();
gl.glTranslatef(0.0f, 1.5f, 0.0f);
/*Element: Estomago [Box]*/
/*Material: Rojo*/
gl.glMaterialfv(GL.GL_FRONT,GL.GL_AMBIENT, new float[]{1.0f, 1.0f, 1.0f,
1.0f},0);
gl.glMaterialfv(GL.GL_FRONT,GL.GL_DIFFUSE, new float[]{1.0f, 0.2f, 0.2f,
1.0f},0);
gl.glMaterialfv(GL.GL_FRONT,GL.GL_SPECULAR, new float[]{1.0f, 0.2f, 0.2f,
1.0f},0);
44
gl.glMaterialfv(GL.GL_FRONT,GL.GL_EMISSION, new float[]{0.0f, 0.0f, 0.0f,
1.0f},0);
gl.glMaterialfv(GL.GL_FRONT,GL.GL_SHININESS, new float[]{30.0f},0);
gl.glPolygonMode(GL.GL_FRONT_AND_BACK, GL.GL_FILL);
gl.glBegin(GL.GL_POLYGON);
gl.glNormal3f(-0.57735026f, -0.57735026f, 0.57735026f);
…………
Extracto de Código C /**
* This class was automatically generated from SGBuilder Uniandes
* CopyRight (c) Universidad de los Andes
*/
/*
* Recomendations
* The objects are drawed filled and with smooth shading
*
* Remember!!!
* 1- Clear the ModelView Matrix with "glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);"
* before calling the method drawScene()
* 2- Set up the lighting in your init() method
*
* */
void drawScene(){
glTranslatef(10.0, 0.0, 0.0);
glRotatef(45.0, 0.0, 1.0, 0.0);
glPushMatrix();
/*Element: Tronco [Group]*/
glPushMatrix();
glTranslatef(0.0, 1.5, 0.0);
/*Element: Estomago [Box]*/
/*Material: Rojo*/
glMaterialfv(GL_FRONT,GL_AMBIENT, GLfloat[]{1.0, 1.0, 1.0, 1.0f},0);
glMaterialfv(GL_FRONT,GL_DIFFUSE, GLfloat[]{1.0, 0.2, 0.2, 1.0f},0);
glMaterialfv(GL_FRONT,GL_SPECULAR, GLfloat[]{1.0, 0.2, 0.2, 1.0f},0);
glMaterialfv(GL_FRONT,GL_EMISSION, GLfloat[]{0.0, 0.0, 0.0, 1.0f},0);
glMaterialfv(GL_FRONT,GL_SHININESS, GLfloat[]{30.0f},0);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glBegin(GL_POLYGON);
glNormal3f(-0.57735026, -0.57735026, 0.57735026);
glVertex3f(-2.0, -1.5, 1.5);
glNormal3f(0.57735026, -0.57735026, 0.57735026);
glVertex3f(2.0, -1.5, 1.5);
glNormal3f(0.57735026, 0.57735026, 0.57735026);
45
glVertex3f(2.0, 1.5, 1.5);
glNormal3f(-0.57735026, 0.57735026, 0.57735026);
…………
La siguiente prueba se construye un modelo geométrico “Bart” utilizando únicamente
geometrías de BRep.
Figura 38. Vista Tipo árbol del modelo “Bart”
Figura 39. Vista Tipo Grafo del modelo “Bart”
Figura 40. Vista Tipo 3D del modelo “Bart”
Figura 41. Objeto Exportado a VRML del modelo
“Bart”
Extracto de Código Java /**
46
* This class was automatically generated from SGBuilder Uniandes
* CopyRight (c) Universidad de los Andes
*/
/*
* Recomendations
* To use this class, give the constructor the GL object that you are using.
* The objects are drawn filled and with smooth shading
*
* Remember!!!
* 1- Clear the ModelView Matrix with "gl.glClear(GL.GL_COLOR_BUFFER_BIT |
GL.GL_DEPTH_BUFFER_BIT);"
* before calling the method ClassName.drawScene()
* 2- Set up the lighting in your init() method
*
* */
import javax.media.opengl.GL;
import javax.media.opengl.glu.GLU;
import javax.media.opengl.glu.GLUquadric;
public class Bart{
private GL gl;
private GLU glu=new GLU();
public Bart(GL glIn){
this.gl=glIn;
}
public void drawScene(){
gl.glPushMatrix();
/*Element: Cara [Group]*/
gl.glPushMatrix();
/*Element: Cara [BRep]*/
/*Material: Yellow*/
gl.glMaterialfv(GL.GL_FRONT,GL.GL_AMBIENT, new float[]{1.0f, 1.0f, 1.0f,
1.0f},0);
gl.glMaterialfv(GL.GL_FRONT,GL.GL_DIFFUSE, new float[]{1.0f, 1.0f, 0.0f,
1.0f},0);
gl.glMaterialfv(GL.GL_FRONT,GL.GL_SPECULAR, new float[]{1.0f, 0.8f, 0.2f,
1.0f},0);
gl.glMaterialfv(GL.GL_FRONT,GL.GL_EMISSION, new float[]{0.0f, 0.0f, 0.0f,
1.0f},0);
gl.glMaterialfv(GL.GL_FRONT,GL.GL_SHININESS, new float[]{30.0f},0);
gl.glPolygonMode(GL.GL_FRONT_AND_BACK, GL.GL_FILL);
gl.glBegin(GL.GL_POLYGON);
gl.glNormal3f(0.012375063f, 0.7887036f, 0.61464906f);
gl.glVertex3f(0.501859f, 3.80882f, 2.391408f);
gl.glNormal3f(-0.52299184f, 0.8473167f, 0.09237937f);
gl.glVertex3f(-0.024313f, 4.499133f, 2.395463f);
gl.glNormal3f(-0.10231151f, -0.10828481f, 0.9888411f);
gl.glVertex3f(-0.024313f, 3.176383f, 2.304332f);
47
gl.glEnd();
gl.glBegin(GL.GL_POLYGON);
gl.glNormal3f(-0.10231151f, -0.10828481f, 0.9888411f);
gl.glVertex3f(-0.024313f, 3.176383f, 2.304332f);
gl.glNormal3f(0.2842369f, -0.11833002f, 0.9514239f);
gl.glVertex3f(0.576398f, 3.112859f, 2.212397f);
gl.glNormal3f(0.012375063f, 0.7887036f, 0.61464906f);
gl.glVertex3f(0.501859f, 3.80882f, 2.391408f);
gl.glEnd();
…………
Extracto de Código C
/**
* This class was automatically generated from SGBuilder Uniandes
* CopyRight (c) Universidad de los Andes
*/
/*
* Recomendations
* The objects are drawn filled and with smooth shading
*
* Remember!!!
* 1- Clear the ModelView Matrix with "glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);"
* before calling the method drawScene()
* 2- Set up the lighting in your init() method
*
* */
void drawScene(){
glPushMatrix();
/*Element: Cara [Group]*/
glPushMatrix();
/*Element: Cara [BRep]*/
/*Material: Yellow*/
glMaterialfv(GL_FRONT,GL_AMBIENT, GLfloat[]{1.0, 1.0, 1.0, 1.0f},0);
glMaterialfv(GL_FRONT,GL_DIFFUSE, GLfloat[]{1.0, 1.0, 0.0, 1.0f},0);
glMaterialfv(GL_FRONT,GL_SPECULAR, GLfloat[]{1.0, 0.8, 0.2, 1.0f},0);
glMaterialfv(GL_FRONT,GL_EMISSION, GLfloat[]{0.0, 0.0, 0.0, 1.0f},0);
glMaterialfv(GL_FRONT,GL_SHININESS, GLfloat[]{30.0f},0);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glBegin(GL_POLYGON);
glNormal3f(0.012375063, 0.7887036, 0.61464906);
glVertex3f(0.501859, 3.80882, 2.391408);
glNormal3f(-0.52299184, 0.8473167, 0.09237937);
glVertex3f(-0.024313, 4.499133, 2.395463);
glNormal3f(-0.10231151, -0.10828481, 0.9888411);
glVertex3f(-0.024313, 3.176383, 2.304332);
48
glEnd();
glBegin(GL_POLYGON);
glNormal3f(-0.10231151, -0.10828481, 0.9888411);
glVertex3f(-0.024313, 3.176383, 2.304332);
glNormal3f(0.2842369, -0.11833002, 0.9514239);
glVertex3f(0.576398, 3.112859, 2.212397);
…………
La última prueba construye un modelo geométrico “Escena” utilizando una combinación de
primitivas y BReps y mundos como repositorios.
Figura 42. Vista Tipo Árbol del modelo
“Escena”
Figura 43. Vista Tipo Grafo del modelo “Escena”
49
Figura 44. Vista Tipo 3D del modelo “Escena”
Figura 45. Objeto exportado a VRML del modelo “Escena”
Extracto de Código Java
/**
* This class was automatically generated from SGBuilder Uniandes
* CopyRight (c) Universidad de los Andes
*/
/*
* Recomendations
* To use this class, give the constructor the GL object that you are using.
* The objects are drawn filled and with smooth shading
*
* Remember!!!
* 1- Clear the ModelView Matrix with "gl.glClear(GL.GL_COLOR_BUFFER_BIT |
GL.GL_DEPTH_BUFFER_BIT);"
* before calling the method ClassName.drawScene()
* 2- Set up the lighting in your init() method
*
* */
import javax.media.opengl.GL;
import javax.media.opengl.glu.GLU;
import javax.media.opengl.glu.GLUquadric;
public class Escena{
private GL gl;
private GLU glu=new GLU();
public Escena(GL glIn){
this.gl=glIn;
}
public void drawScene(){
gl.glPushMatrix();
/*Element: Mesa /*Element: Mesa [Group]*/
gl.glPushMatrix();
/*Element: Tablero [Box]*/
/*Material: CafeMesa*/
50
gl.glMaterialfv(GL.GL_FRONT,GL.GL_AMBIENT, new float[]{1.0f, 1.0f, 1.0f,
1.0f},0);
gl.glMaterialfv(GL.GL_FRONT,GL.GL_DIFFUSE, new float[]{1.0f, 0.8f, 0.2f,
1.0f},0);
gl.glMaterialfv(GL.GL_FRONT,GL.GL_SPECULAR, new float[]{1.0f, 0.8f, 0.0f,
1.0f},0);
gl.glMaterialfv(GL.GL_FRONT,GL.GL_EMISSION, new float[]{0.0f, 0.0f, 0.0f,
1.0f},0);
gl.glMaterialfv(GL.GL_FRONT,GL.GL_SHININESS, new float[]{30.0f},0);
gl.glPolygonMode(GL.GL_FRONT_AND_BACK, GL.GL_FILL);
gl.glBegin(GL.GL_POLYGON);
gl.glNormal3f(-0.57735026f, -0.57735026f, 0.57735026f);
gl.glVertex3f(-15.0f, -0.5f, 20.0f);
gl.glNormal3f(0.57735026f, -0.57735026f, 0.57735026f);
gl.glVertex3f(15.0f, -0.5f, 20.0f);
gl.glNormal3f(0.57735026f, 0.57735026f, 0.57735026f);
gl.glVertex3f(15.0f, 0.5f, 20.0f);
gl.glNormal3f(-0.57735026f, 0.57735026f, 0.57735026f);
gl.glVertex3f(-15.0f, 0.5f, 20.0f);
gl.glEnd();
gl.glBegin(GL.GL_POLYGON);
gl.glNormal3f(0.57735026f, -0.57735026f, 0.57735026f);
gl.glVertex3f(15.0f, -0.5f, 20.0f);
gl.glNormal3f(0.57735026f, -0.57735026f, -0.57735026f);
gl.glVertex3f(15.0f, -0.5f, -20.0f);
gl.glNormal3f(0.57735026f, 0.57735026f, -0.57735026f);
gl.glVertex3f(15.0f, 0.5f, -20.0f);
gl.glNormal3f(0.57735026f, 0.57735026f, 0.57735026f);
gl.glVertex3f(15.0f, 0.5f, 20.0f);
gl.glEnd();
gl.glBegin(GL.GL_POLYGON);
gl.glNormal3f(0.57735026f, -0.57735026f, -0.57735026f);
gl.glVertex3f(15.0f, -0.5f, -20.0f);
gl.glNormal3f(-0.57735026f, -0.57735026f, -0.57735026f);
gl.glVertex3f(-15.0f, -0.5f, -20.0f);
gl.glNormal3f(-0.57735026f, 0.57735026f, -0.57735026f);
gl.glVertex3f(-15.0f, 0.5f, -20.0f);
gl.glNormal3f(0.57735026f, 0.57735026f, -0.57735026f);
gl.glVertex3f(15.0f, 0.5f, -20.0f);
gl.glEnd();
gl.glBegin(GL.GL_POLYGON);
gl.glNormal3f(-0.57735026f, -0.57735026f, -0.57735026f);
gl.glVertex3f(-15.0f, -0.5f, -20.0f);
gl.glNormal3f(-0.57735026f, -0.57735026f, 0.57735026f);
..........
Extracto de Código C
51
/**
* This class was automatically generated from SGBuilder Uniandes
* CopyRight (c) Universidad de los Andes
*/
/*
* Recomendations
* The objects are drawn filled and with smooth shading
*
* Remember!!!
* 1- Clear the ModelView Matrix with "glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);"
* before calling the method drawScene()
* 2- Set up the lighting in your init() method
*
* */
void drawScene(){
glPushMatrix();
/*Element: Mesa /*Element: Mesa [Group]*/
glPushMatrix();
/*Element: Tablero [Box]*/
/*Material: CafeMesa*/
glMaterialfv(GL_FRONT,GL_AMBIENT, GLfloat[]{1.0, 1.0, 1.0, 1.0f},0);
glMaterialfv(GL_FRONT,GL_DIFFUSE, GLfloat[]{1.0, 0.8, 0.2, 1.0f},0);
glMaterialfv(GL_FRONT,GL_SPECULAR, GLfloat[]{1.0, 0.8, 0.0, 1.0f},0);
glMaterialfv(GL_FRONT,GL_EMISSION, GLfloat[]{0.0, 0.0, 0.0, 1.0f},0);
glMaterialfv(GL_FRONT,GL_SHININESS, GLfloat[]{30.0f},0);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glBegin(GL_POLYGON);
glNormal3f(-0.57735026, -0.57735026, 0.57735026);
glVertex3f(-15.0, -0.5, 20.0);
glNormal3f(0.57735026, -0.57735026, 0.57735026);
glVertex3f(15.0, -0.5, 20.0);
glNormal3f(0.57735026, 0.57735026, 0.57735026);
glVertex3f(15.0, 0.5, 20.0);
glNormal3f(-0.57735026, 0.57735026, 0.57735026);
glVertex3f(-15.0, 0.5, 20.0);
glEnd();
glBegin(GL_POLYGON);
glNormal3f(0.57735026, -0.57735026, 0.57735026);
glVertex3f(15.0, -0.5, 20.0);
glNormal3f(0.57735026, -0.57735026, -0.57735026);
glVertex3f(15.0, -0.5, -20.0);
glNormal3f(0.57735026, 0.57735026, -0.57735026);
glVertex3f(15.0, 0.5, -20.0);
glNormal3f(0.57735026, 0.57735026, 0.57735026);
glVertex3f(15.0, 0.5, 20.0);
52
Capítulo 5. Conclusiones y Trabajos Futuros
5.1. Conclusiones
• La utilización de ayudas computacionales en el ámbito educativo es un campo que debe
ser mas explotado, ya que brinda un gran apoyo a los estudiantes y puede llegar a
disminuir considerablemente la curva de aprendizaje de ciertos temas.
• La utilización de herramientas de este tipo promueve el sistema de aprendizaje por
experiencia propia (“learning by doing”) en donde los estudiantes se ven estimulados al
observar los resultados de sus experiencias instantáneamente.
• La aplicación de ayudas computacionales puede servir para la generación de modelos
virtuales de aprendizaje soportados sobre plataformas en Internet para su expansión y
uso global.
5.2. Trabajos Futuros
El trabajo puede continuarse en varios aspectos que complementan los resultados obtenidos
y que ilustran la aplicación de otros temas de interés en computación gráfica. En particular
se planea trabajar en las siguientes extensiones:
� Poder modificar el nivel de detalle de las primitivas geométricas utilizadas.
� Enriquecer el grafo de escena con: nodos que definan nuevas primitivas geométricas;
nodos tipo cámara que definen las características del viewport y del observador
(dimensiones viewport, posición, orientación y tipo de proyección del observador);
nodos relacionados con el modelo de iluminación que afectan la calidad visual (fuentes
de luz); nodos de materiales a partir de texturas.
53
� Agregar la característica de movimiento (animación) en elementos que sean dinámicos.
� Implementar un modelo de iluminación global tipo raytracing para comparar contra el
modelo local simplificado utilizado por eficiencia.
� Extender la interacción del usuario en los modelos construidos.
54
Bibliografía
[1] AMES, Andrea. NADEAU, David. VRML 2.0 Sourcebook. 2nd Edition. John Wiley &
Sons, Inc. 1997.
[2] ANGEL, Edward. Interactive Computer Graphics - A top-down approach using
openGL.4th
Edition. Addison Wesley. 2006
[3] BOUVIER, Dennis. Assignment: Scene Graphs in Computer Graphics Courses.
International Conference on Computer Graphics and Interactive Techniques
ACM SIGGRAPH 2002, Educators Program.
[4] CORTONA VRML Viewer Client 5.1. <http://www.parallelgraphics.com/products/cortona/>
(Ultimo acceso 10-07-2007)
[5] Exploratories. Brown University
http://www.cs.brown.edu/exploratories/freeSoftware/catalogs/scenegraphs.html (Ultimo acceso 10-03-
2007)
[6] Java API. Especificación y API. < http://java.sun.com/j2se/1.5.0/docs/api/> (Ultimo acceso 20-
07-2007)
[7] Jgraph API. Especificación y API.< http://www.jgraph.com> (Ultimo acceso 15-07-2007)
[8] JOGL. Especificación y API. https://jogl.dev.java.net/ (Ultimo acceso 15-07-2007)
[9] McREYNOLDS, Tom. BLYTHE, David. Advanced Graphics Programming Using
OpenGL. 1st Edition. Morgan Kaufmann Publishers. 2005
[10] Open Scene Graph. Especificación y API. <http://www.openscenegraph.com/index.php>
(Ultimo acceso 15-05-2007)
55
[11] OpenGL. Especificación y API. http://www.opengl.org/ (Ultimo acceso 25-06-2007)
[12] OpenSG. Especificación y API. <http://opensg.vrsource.org/trac> (Ultimo acceso 15-05-
2007)
[13] SHREINER, Dave. An Interactive Introduction to OpenGL Programming.
SIGGRAPH 2004.
[14] SHREINER Dave, WOO Mason, NEIDER Jackie and DAVIS Tom.
OpenGL(R) Programming Guide: The Official Guide to Learning OpenGL. 5th Edition.
Addison-Wesley. August 1 2005.
[15] VRML API. Especificación y API.< http://www.w3.org/MarkUp/VRML/> (Ultimo acceso
01-07-2007)
56
Anexos________________________________________________
Anexo 1. Requerimientos Funcionales (Plantillas)
Identificador: R.1 Indispensable/Deseable: Indispensable Prioridad: Alta
Nombre de Caso de Uso:
Agregar Mundo
Autor: Juan Camilo Ibarra
Fecha: Febrero de 2007
Categoría
(Visible/No Visible):
Visible Actores
Involucrados:
Usuario Final
Resumen: El Usuario agrega un mundo al grafo de escena.
Curso Básico de Eventos: Usuario Sistema
1. El Usuario ingresa la opción
de agregar un mundo
2. El Sistema solicita al usuario
a través de una GUI el
nombre del mundo
3. El Usuario ingresa los
parámetros solicitados por el
sistema
4. El Sistema valida los datos y
actualiza el grafo de escena
Caminos Alternativos:
Caminos de Excepción: • Si en 4 los datos ingresados por el usuario no son validos, el
sistema lanza una excepción y muestra un cuadro de error
Puntos de Extensión:
Pre-Condiciones: Debe estar cargada una escena
Pos-Condiciones: El grafo de escena tiene un nuevo mundo
Criterios de Aceptación:
Borrador de GUI:
57
Identificador: R.2 Indispensable/Deseable: Indispensable Prioridad: Alta
Nombre de Caso de Uso:
Agregar Elemento
Autor: Juan Camilo Ibarra
Fecha: Febrero de 2007
Categoría
(Visible/No Visible):
Visible Actores
Involucrados:
Usuario Final
Resumen: El Usuario agrega un elemento al grafo de escena.
Curso Básico de Eventos: Usuario Sistema
1. El Usuario ingresa la opción
de agregar un elemento
2. El Sistema solicita al usuario
a través de una GUI los
parámetros del nuevo
elemento
3. El Usuario ingresa los
parámetros solicitados por
el sistema
4. El Sistema valida los datos y
actualiza el grafo de escena
Caminos Alternativos:
Caminos de Excepción: • Si en 4 los datos ingresados por el usuario no son validos, el
sistema lanza una excepción y muestra un cuadro de error
Puntos de Extensión:
Pre-Condiciones: Debe agregarse un elemento a un mundo o a un elemento
Pos-Condiciones: El grafo de escena tiene un nuevo elemento
Criterios de Aceptación:
Borrador de GUI:
58
Identificador: R.3 Indispensable/Deseable: Indispensable Prioridad: Alta
Nombre de Caso de Uso:
Agregar Transformación
Autor: Juan Camilo Ibarra
Fecha: Febrero de 2007
Categoría
(Visible/No Visible):
Visible Actores
Involucrados:
Usuario Final
Resumen: El Usuario agrega una transformación al grafo de escena.
Curso Básico de Eventos: Usuario Sistema
1. El Usuario ingresa la opción
de agregar una
transformación
2. El Sistema solicita al
usuario a través de una
GUI los parámetros de la
transformación
3. El Usuario ingresa los
parámetros solicitados por
el sistema
4. El Sistema valida los datos
y actualiza el grafo de
escena
Caminos Alternativos:
Caminos de Excepción: • Si en 4 los datos ingresados por el usuario no son validos, el
sistema lanza una excepción y muestra un cuadro de error
Puntos de Extensión:
Pre-Condiciones: Se debe agregar a un mundo a un elemento
Pos-Condiciones: El grafo de escena tiene un nuevo mundo
Criterios de Aceptación:
Borrador de GUI:
59
Identificador: R.4 Indispensable/Deseable: Indispensable Prioridad: Alta
Nombre de Caso de Uso:
Agregar Material
Autor: Juan Camilo Ibarra
Fecha: Febrero de 2007
Categoría
(Visible/No Visible):
Visible Actores
Involucrados:
Usuario Final
Resumen: El Usuario agrega un Material a un elemento.
Curso Básico de Eventos: Usuario Sistema
1. El Usuario ingresa la opción
de agregar un material
2. El Sistema solicita al
usuario a través de una
GUI los parámetros del
material
3. El Usuario ingresa los
parámetros solicitados por
el sistema
4. El Sistema valida los datos
y actualiza el grafo de
escena
Caminos Alternativos:
Caminos de Excepción: • Si en 4 los datos ingresados por el usuario no son validos, el
sistema lanza una excepción y muestra un cuadro de error
Puntos de Extensión:
Pre-Condiciones: Se debe agregar a un elemento que no sea ni grupo ni referencia.
Pos-Condiciones: El grafo de escena tiene un nuevo material
Criterios de Aceptación:
Borrador de GUI:
60
Identificador: R.5 Indispensable/Deseable: Deseable Prioridad: Baja
Nombre de Caso de Uso:
Cargar Modelo BRep
Autor: Juan Camilo Ibarra
Fecha: Febrero de 2007
Categoría
(Visible/No Visible):
No visible Actores
Involucrados:
Usuario Final
Resumen: El Usuario carga un archivo que representa un modelo geométrico
Curso Básico de Eventos: Usuario Sistema
1. El usuario pide al sistema
ingresar un modelo desde un
archivo
2. El sistema solicita al usuario
a través de una GUI la
localización del archivo
3. El usuario ingresa la
localización del archivo
4. El sistema valida y carga el
modelo
Caminos Alternativos:
Caminos de Excepción: • Si en 4 la localización del archivo no es valida, el sistema lanza
una excepción y muestra un cuadro de error
• Si en 4 el formato del archivo no es valido, el sistema lanza una
excepción y muestra un cuadro de error
Puntos de Extensión:
Pre-Condiciones: El Archivo a cargar existe y no está corrupto
Pos-Condiciones: El sistema carga el modelo en memoria primaria
Criterios de Aceptación:
Borrador de GUI:
61
Identificador: R.6 Indispensable/Deseable: Deseable Prioridad: Baja
Nombre de Caso de Uso:
Editar Nodo
Autor: Juan Camilo Ibarra
Fecha: Febrero de 2007
Categoría
(Visible/No Visible):
Actores
Involucrados:
Usuario Final
Resumen: El Usuario edita un nodo existente, ya sea sus parámetros internos o el nodo en
si
Curso Básico de Eventos: Usuario Sistema
1. El usuario ingresa a la
opción de edición
2. El sistema a través de una
GUI le solicita al usuario los
nuevos parámetros del
nodo
3. El usuario ingresa los
nuevos parámetros del
nodo
4. El sistema actualiza el grafo
de escena
Caminos Alternativos:
Caminos de Excepción:
Puntos de Extensión:
Pre-Condiciones: El usuario se encuentra en un nodo valido
Pos-Condiciones: El grafo de Escena está actualizado
Criterios de Aceptación:
Borrador de GUI:
62
Identificador: R.7 Indispensable/Deseable: Deseable Prioridad: Baja
Nombre de Caso de Uso:
Generar Archivo de Exportación
Autor: Juan Camilo Ibarra
Fecha: Febrero de 2007
Categoría
(Visible/No Visible):
Actores
Involucrados:
Usuario Final
Resumen: El Usuario pide como salida, una archivo con formato predeterminado
Curso Básico de Eventos: Usuario Sistema
1. El usuario pide al sistema
que exporte el archivo
2. El sistema por medio de
una GUI le solicita al
usuario la ubicación y el
nombre del archivo a
guardar
3. El usuario suministra los
parámetros del archivo
4. El sistema guarda el
archivo
Caminos Alternativos:
Caminos de Excepción:
Puntos de Extensión:
Pre-Condiciones: Debe existir una escena cargada en memoria
Pos-Condiciones: El archivo es exportado
Criterios de Aceptación:
Borrador de GUI:
63
Identificador: R.8 Indispensable/Deseable: Deseable Prioridad: Baja
Nombre de Caso de Uso:
Ver Grafo de Escena Teórico
Autor: Juan Camilo Ibarra
Fecha: Febrero de 2007
Categoría
(Visible/No Visible):
Actores
Involucrados:
Usuario Final
Resumen: El Usuario pide al sistema como salida una representación gráfica del grafo de
escena teórico
Curso Básico de Eventos: Usuario Sistema
1. El usuario pide al sistema
mostrar el grafo de escena
teórico
2. El sistema le pide al usuario
el mundo a generar como
grafo de escena teórico
3. El usuario entrega el nombre
del mundo que desea ver
4. El sistema lanza el frame de
grafo de escena teórico
Caminos Alternativos:
Caminos de Excepción:
Puntos de Extensión:
Pre-Condiciones: Debe haber una escena cargada en memoria
Pos-Condiciones: El grafo de escena teórico es mostrado
Criterios de Aceptación:
Borrador de GUI:
64
Identificador: R.9 Indispensable/Deseable: Deseable Prioridad: Baja
Nombre de Caso de Uso:
Ver Interpretación de Estructura Teórica
Autor: Juan Camilo Ibarra
Fecha: Febrero de 2007
Categoría
(Visible/No Visible):
Actores
Involucrados:
Usuario Final
Resumen: El Usuario pide al sistema como salida una representación gráfica del grafo de
escena en un modelo practico 3D
Curso Básico de Eventos: Usuario Sistema
1. El usuario pide al sistema
mostrar la representación 3D
del grafo de escena
2. El sistema le pide al usuario
el mundo a generar como
representación 3D
3. El usuario entrega el nombre
del mundo que desea ver
4. El sistema lanza el frame de
representación 3D
Caminos Alternativos:
Caminos de Excepción:
Puntos de Extensión:
Pre-Condiciones: Debe existir una escena cargada en memoria principal
Pos-Condiciones: El grafo de escena es mostrado
Criterios de Aceptación:
Borrador de GUI:
65
Anexo 2. Requerimientos No Funcionales (Plantillas)
Nombre: Cargar Archivo XML
Tipo: Crítico (si/no) Si
Descripción:
El Usuario debe poder cargar un archivo XML que describe uno o varios Grafos de Escena u
objetos geométricos complejos en el sistema para su posterior uso
Criterios de
Aceptación:
El sistema debe identificar que el formato del archivo XML es válido y debe cargar
la información de forma adecuada.
Nombre: Generar Archivo XML
Tipo: Crítico (si/no) Si
Descripción:
El Usuario debe poder generar un archivo XML como persistencia de los Grafos de Escena u
objetos geométricos complejos construidos dentro de la aplicación
Criterios de
Aceptación:
El sistema debe generar el archivo XML con el formato valido.
Nombre: Facilidad de Uso
Tipo: Crítico (si/no) Si
Descripción:
Debido al público objetivo de la aplicación y su finalidad principal, el diseño de la interfaz debe
ser especialmente de fácil uso y utilización intuitiva. La utilización de varias vistas sobre un
mismo modelo de datos es indispensable
Criterios de
Aceptación:
Se deben tener al menos 3 tipos de vistas diferentes sobre el modelo de datos. La
curva de aprendizaje de la aplicación debe ser pequeña.
Nombre: Claridad del Modelo Teórico
Tipo: Crítico (si/no) Si
Descripción:
La representación gráfica del modelo teórico debe ser especialmente fácil de entender e
intuitiva para su uso. Este es un punto clave debido a que la comprensión del concepto del
grafo de escena y la jerarquización de una escena, depende mucho de su representación
gráfica.
Criterios de
Aceptación:
La visualización debe ofrecer una clara representación jerárquica al igual que una
diferenciación de tipos de nodos.
66
Nombre: Dinamicidad de las Representaciones
Tipo: Crítico (si/no) Si
Descripción:
Las representaciones gráficas tanto teórica como práctica deben actualizarse de manera
dinámica e inmediata a medida que el usuario interactúe con la aplicación.
Criterios de
Aceptación:
Las vistas no necesariamente deben ser simultáneas. Las visualizaciones deben
representar el estado actual del modelo de datos.
Nombre: Mantenibilidad y Extensión del Software
Tipo: Crítico (si/no) Si
Descripción:
La forma de codificación y documentación debe permitir un fácil mantenimiento y extender las
definiciones de primitivas y archivos a exportar, cambios en el software y la adición de nuevos
servicios de una manera sencilla.
Criterios de
Aceptación:
Debe existir una buena documentación tanto dentro del código como por fuera.
Todas las clases y métodos deben estar documentados. Se deben seguir patrones
de diseño.
67
Anexo 3. Especificación de Atributos del paquete Kernel
Kernel
Extiende Observable
implementa Observer
Atributo Tipo Descripción
E_BOX Static final
int
Constante que representa un elemento Caja
E_BREP Static final
int
Constante que representa un elemento Brep (Representación
por la frontera)
E_CYLINDER Static final
int
Constante que representa un elemento Cilindro
E_DISK Static final
int
Constante que representa un elemento Disco
E_GROUP Static final
int
Constante que representa un elemento Grupo
E_PARTIAL_DISK Static final
int
Constante que representa un elemento Disco Parcial
E_REFERENCE Static final
int
Constante que representa un elemento Referencia
E_SPHERE Static final
int
Constante que representa un elemento Esfera
E_TORUS Static final
int
Constante que representa un elemento Toroide
T_ROTATION Static final
int
Constante que representa una transformación de Rotación
T_SCALE Static final
int
Constante que representa una transformación de Escalado
T_TRANSLATION Static final
int
Constante que representa una transformación de Traslación
elementInClipboard Element Elemento que se encuentra actualmente en el clipboard, es una
68
copia de otro elemento
message ArrayList Arreglo para enviar mensajes a los observadores de la clase
parser XMLParser Parser necesario para leer el archivo xml
xmlFile File Archivo xml que contiene la información del grafo de escena
Directory
Extiende Observable
Implementa Observer
Atributo. Tipo Descripción
directoryName String Nombre del Directorio
World
Extiende Observable
Implementa Observer
Atributo. Tipo Descripción
worldName String Nombre del Mundo
Material
Extiende Observable
Implementa
Atributo. Tipo Descripción
materialName String Nombre del Material
worldId String Nombre del Mundo que tiene el material
ambientColor float[4] Color RGBA ambiente del material
diffuseColor float[4] Color RGBA difuso del material
specularColor float[4] Color RGBA especular del material
emissionColor float[4] Color RGBA de emisión del material
shininess float[1] Valor de brillo del material
elementsWithMaterial ArrayList<Element> Lista de elementos que tienen este material
69
Transformation
Extiende Observable
Implementa
Atributo. Tipo Descripción
transformationId String Identificador de la transformación
transformationType Integer Tipo de la transformación
worldId String Nombre del mundo que contiene la transformación
myPos Integer Posición de la transformación dentro del arreglo
parameters float[4] Arreglo de parámetros de la transformación según su tipo
Element
Extiende Observable
Implementa Observer
Atributo. Tipo Descripción
elementId String Identificador del elemento
elementName String Nombre del Elemento
elementType Integer Tipo del Elemento
worldName String Nombre del mundo que contiene el Elemento
myPos Integer Posición del elemento dentro del arreglo
parameters float[4] Arreglo de parámetros del Elemento según su tipo
reference Element Referencia a un elemento (si el elemento es de tipo
referencia)
referenceElements ArrayList<Element> Lista de elementos que referencian al Elemento
vertex ArrayList<float[3]> Lista de vértices del Elemento
faces ArrayList<int[3]> Lista de caras del Elemento (Triángulos)
normals ArrayList<float[3]> Lista de normales del Elemento
XMLParser
Extiende DefaultHandler
implementa
70
Atributo. Tipo Descripción
builder OutputsBuilder Constructor del modelo de datos
saxParser SAXParser Clase encargada de interpretar el archivo XML
xmlFile File Archivo XML a interpretar
references ArrayList<String[]> Lista de Referencias encontradas en el archivo XML
WorldHandler
Extiende DefaultHandler
implementa
Atributo. Tipo Descripción
parent DefaultHandler El Handler que le delegó el control
saxParser SAXParser Parser que se encuentra trabajando sobre el archivo xml
builder OutputsBuilder Constructor que se encuentra construyendo el modelo de datos
mundo World Parámetro que contiene los datos del mundo
references ArrayList<String[]> Lista de referencias enviada por el parent
ElementHandler
Extiende DefaultHandler
implementa
Atributo. Tipo Descripción
parent DefaultHandler El Handler que le delegó el control
saxParser SAXParser Parser que se encuentra trabajando sobre el archivo XML
builder OutputsBuilder Constructor que se encuentra construyendo el modelo de
datos
mundo_Parent World Mundo padre del elemento
elementNode Element Objeto de tipo Elemento a agregar al mundo padre
references ArrayList<String[]> Lista de referencias enviada por el parent
MaterialHandler
Extiende DefaultHandler
71
implementa
Atributo. Tipo Descripción
parent DefaultHandler El Handler que le delegó el control
saxParser SAXParser Parser que se encuentra trabajando sobre el archivo xml
mundo_parent World Parámetro que contiene los datos del mundo que se está
construyendo
material Material Objeto de tipo material a agregar al mundo
TransformationHandler
Extiende DefaultHandler
implementa
Atributo. Tipo Descripción
parent DefaultHandler El Handler que le delegó el control
saxParser SAXParser Parser que se encuentra trabajando sobre el archivo XML
builder OutputsBuilder Constructor que se encuentra construyendo el modelo de datos
mundo_parent World Parámetro que contiene los datos del mundo que se está
construyendo
transNode Transformation Objeto de tipo transformación a agregar al mundo
parentNode Element Elemento padre de la transformación
FaceHandler
Extiende DefaultHandler
implementa
Atributo. Tipo Descripción
parent DefaultHandler El Handler que le delegó el control
saxParser SAXParser Parser que se encuentra trabajando sobre el archivo XML
facesArray ArrayList<int[3]> Arreglo de caras del elemento encontrado en el XML
VertexHandler
Extiende DefaultHandler
72
implementa
Atributo. Tipo Descripción
parent DefaultHandler El Handler que le delegó el control
saxParser SAXParser Parser que se encuentra trabajando sobre el archivo XML
vertexArray ArrayList<float[3]> Arreglo de vértices del elemento encontrado en el XML
RefHandler
Extiende DefaultHandler
implementa
Atributo. Tipo Descripción
parent DefaultHandler El Handler que le delegó el control
saxParser SAXParser Parser que se encuentra trabajando sobre el archivo XML
refs ArrayList<String[2]> Arreglo de referencias del elemento encontrado en el XML
OutputsBuilder (Interface)
Extiende Observable
implementa
Atributo. Tipo Descripción
theScene Scene La Escena que se esta construyendo
JTreeBuilder
Extiende OutputsBuilder
implementa
Atributo. Tipo Descripción
jtree JTree El Jtree del grafo de escena a representar.
VRMLBuilder
Extiende OutputsBuilder
implementa
Atributo. Tipo Descripción
73
vrmlFile File Archivo que contiene código VRML que representa el grafo de
escena
mundo World Objeto de tipo World que va a exportarse a VRML
materials ArrayList<Material> Lista de Materiales que se utilizaran en el VRML
fileWriter FileWriter Clase que escribe archivos
JoglBuilder
Extiende OutputsBuilder
implementa
Atributo. Tipo Descripción
jogllFile File Archivo que contiene codigo java que representa el grafo de escena
mundo World Objeto de tipo World que va a exportarse a VRML
fileWriter FileWriter Clase que escribe archivos
OpenGLBuilder
Extiende OutputsBuilder
implementa
Atributo. Tipo Descripción
openGLFile File Archivo que contiene codigo C que representa el grafo de escena
mundo World Objeto de tipo World que va a exportarse a VRML
fileWriter FileWriter Clase que escribe archivos
XMLBuilder
Extiende OutputsBuilder
Implementa
Atributo. Tipo Descripción
xmlSavedFile File Archivo que contiene codigo xml que representa el grafo de escena
acorde a los parámetros definidos
fileWriter FileWriter Clase que escribe archivos
74
GraphBuilder
Extiende OutputsBuilder
implementa
Atributo. Tipo Descripción
graph JGraph Objeto de tipo JGraph que es el grafo de escena
model GraphModel Modelo del JGraph que contiene los datos del grafo
mundo World Mundo a representar
count Integer Parámetro que ayuda a organizar los nodos del grafo
Model3DBuilder
Extiende OutputsBuilder
Implementa Observer, GLEventListener, MouseMotionListener, MouseListener,
MouseWheelListener
Atributo. Tipo Descripción
background float[4] Color RGBA del fondo de la escena
canvas3D GLCanvas Lienzo de Dibujo 3D
gridStatus boolean Estado de la grilla de referencia dentro de la escena
lightingEnabled boolean Estado de la iluminación dentro de la escena
mode String Modo de la escena (LINE, POINT, FILL)
mundo World Mundo renderizado
shade String Tipo de sombreado de la Escena (FLAT, SMOOTH)
zoom float Valor de acercamiento de la cámara
TrackBall
Esta Clase fue implementada en 1994 por Silicon Graphics Inc. Su uso esta permitido siempre y
cuando se manifieste el derecho de copia dentro de la documentación
PrimitivesBuilder
Esta clase únicamente tiene métodos estáticos que construyen geometrías utilizando la
especificación de JOGL.
75
Anexo 4. Especificación de Parámetros del Archivo XML
Nodo DIRECTORIO
Descripción Es el nodo que contiene la información del directorio que
contiene los distintos mundos que se pueden visualizar
Atributos
Name Nombre de la Escena
Nodo MUNDO
Descripción Es el nodo que contiene la información de un mundo
Atributos
Name Nombre del mundo.
Nodo MATERIAL
Descripción Es el nodo que contiene la información de un material que
contiene un mundo
Atributos
Id Nombre del material.
Ambient Color ambiente del material. Son 4 valores flotantes
separados por una coma.
Diffuse Color difuso del material. Son 4 valores flotantes separados
por una coma.
Specular Color especular del material. Son 4 valores flotantes
separados por una coma.
Emission Color de emisión del material. Son 4 valores flotantes
separados por una coma.
Shininess Porcentaje de brillo del material. Es un valor flotante.
Nodo ELEMENTO
Descripción Es el nodo que contiene la información de un elemento.
76
Atributos
Type Tipo del elemento.
Id Identificador del elemento.
Name Nombre del elemento.
Material Nombre del material que tiene el elemento.
WorldRef Nombre del mundo al que hace referencia. (Cuando el tipo
del elemento es Referencia)
ElementRef Identificador del elemento al que hace referencia. (Cuando el
tipo del elemento es Referencia)
Los Atributos de “Param”, tienen un significado diferente según el tipo de elemento
Parámetros Nodo Elemento
Type Param1 Param2 Param3 Param4
Box Ancho Alto Profundo -
Sphere Radio - - -
Cylinder Radio de la
Base
Radio de la
Tapa
Alto -
Torus Radio1 Radio2 - -
BRep* Vértices Caras - -
Disk Radio Interno Radio Externo
Partial_Disk Radio Interno Radio Externo Angulo de
inicio
Angulo de
Barrido
Reference - - - -
Group - - - -
Nodo VERTEX
Descripción Es el nodo que contiene la información de los vértices de un
elemento, en el caso que sea una BRep
Atributos
Number Índice del vértice
77
X Posición en el eje X
Y Posición en el eje Y
Z Posición en el eje Z
Nodo FACE
Descripción Es el nodo que contiene la información de las caras de un
elemento, en el caso que sea una BRep
Atributos
Number Índice de la cara
Vert1 Índice del primer vértice de la cara.
Vert2 Índice del segundo vértice de la cara.
Vert3 Índice del tercer vértice de la cara.
Nodo TRANSFORMACION
Descripción Es el nodo que contiene la información de una
transformación de un elemento o de un mundo
Atributos
Type Tipo de la transformación
Id Identificador de la transformación
Los Atributos de “Param”, tienen un significado diferente según el tipo de transformación.
Parámetros Nodo Transformación
Type Param1 Param2 Param3 Param4
Rotation Angulo Valor Eje X Valor Eje Y Valor Eje Z
Translation Valor Eje X Valor Eje Y Valor Eje Z -
Scale Valor Eje X Valor Eje Y Valor Eje Z -