Creación Interactiva de Grafos de Escena para Aplicaciones ...

84
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

Transcript of Creación Interactiva de Grafos de Escena para Aplicaciones ...

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.

[email protected]

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 -