-
SEP SEIT DGIT
CENTRO NACIONAL DE INVESTIGACIÓN Y DESARROLLO TECNOLÓGICO
Cenidet
ENTORNO DE GRAFICACIÓN Y GENERACIÓN DE MODELOS 2D Y 3D PARA
APLICACIONES DE VISIÓN ARTIFICIAL
(GrafO3D)
PRESENTA: ARIADNA JUDITH DÍAZ BARRITA
DIRECTORES DE TESIS: DR. RAÚL PINTO ELÍAS
DRA. AZUCENA MONTES RENDÓN
CUERNAVACA, MORELOS AGOSTO DE 2004
T E S I S PARA OBTENER EL GRADO DEMAESTRO EN CIENCIAS ENCIENCIAS
COMPUTACIONALES
-
i
CONTENIDO Lista de figuras …………………………………………………………………………………… iii
Lista de tablas …………………………………………………………………………………… v CAPÍTULO I.
INTRODUCCIÓN 1.1 Introducción …………………………..……………………………………………….. 2
1.2 Organización de la tesis ……………….……….………………………………………. 4 1.3
Antecedentes ……………………………………………………………………………. 4 1.4 Descripción del
problema ……………………………………………………………… 5 1.5 Marco conceptual
………………………..……………………………………………… 7
1.5.1 Estado del arte ……………………..……………………………………………… 7 1.5.1.1
Graficación 3D ……………………..…………………………………………. 7 1.5.1.2 Herramientas
CAD/CAM (Computer Aided Design/ Computer Aided
Manufacturing) …………………………………………………………………… 9 1.5.1.3 VRML
(Virtual Reality Modeling Language) …………………...…………. 11 1.5.1.4
OpenGL ………………..……………...………………………………………… 12
1.5.2 Estado de la práctica …..……………….………………………………………… 16
1.5.2.1 Anim8or ……………..……………...………………………………………… 16 1.5.2.2 3D
Studio Max ………………………………………………………………… 18 1.5.2.3 AC3D
……………………………..…………………………………………….. 19
1.6 Propuesta de solución ……………………..……………………………………………. 21 1.6.1
Objetivo de la tesis …………………..……………………………………………. 21 1.6.2
Beneficios ……………………………………………………………………………. 21
1.6.2.1 Beneficios generales ………………….……………………………………….. 21
1.6.2.2 Beneficios específicos para el grupo de Visión Artificial
del cenidet ………. 21
1.6.3 Alcances y limitaciones ……………...…..……………………………………….. 22
1.6.4 Disciplinas involucradas ……………….....……………………………………….. 23
1.7 Aplicaciones ………………………………………………………………………………. 23 1.8
Conclusiones ……………………………………………………………………………. 23 CAPÍTULO II.
ANÁLISIS Y DISEÑO 2 Cap2 2.1 Introducción
…………………..………………………………………………...……... 25 2.2 Requerimientos
funcionales del sistema …………………..………………………… 25 2.3 Otros
requerimientos …………………………………..….…………………………… 27 2.4 Modelo
conceptual de GrafO3D ..………………...…...……………………………... 27 2.5
Definición y especificación de objetos ………………….……………………………. 28
2.5.1 Mundo virtual tridimensional ………………………….…………...…………… 29
2.5.2 Especificación de objetos en VRML …………………………………………….. 32
2.5.3 Especificación de objetos en OpenGL …………………………………………...
37
2.5.3.1 Primitivas para el dibujado …………………………….…………..……….. 38
2.5.3.2 Transformaciones …………………………………….……………………….. 41
2.6 Especificación de objetos en GrafO3D ……………………………………………….. 43
2.7 Persistencia y recuperación de objetos ……………………………………………….. 46
2.8 Manipulación de objetos …………………………………………………………..……. 52 2.9
Procesos para tratar archivos producidos por otras herramientas
………………… 53 2.10 Conclusiones ………………………………………………………………………........
54
-
ii
CAPÍTULO III. IMPLEMENTACIÓN 3 3.1 Introducción
…….……………………...…………………………………………….... 56 3.2 Especificación de
objetos en GrafO3D ………………….………………………….... 56 3.3 Persistencia y
recuperación de objetos ………………..……………………………… 60 3.4 Manipulación de
objetos ………………..………………………………………………. 62 3.5 Procesos para tratar
archivos producidos por otras herramientas ………………… 70 3.6
Conclusiones ……………..…………………………………………………………….. 71 CAPÍTULO IV.
PRUEBAS Y RESULTADOS 4 asd 4.1 Introducción
……………………………….………………………………………….... 73 4.2 Especificación de casos de
prueba ……………..……..…………………………….... 73 4.3 Especificación del
procedimiento de pruebas ………………………………………… 74
4.3.1 Caso de prueba 1: lectura de un archivo GrafO3D
……………….....………… 74 4.3.2 Caso de prueba 2: aplicación de funciones
de graficación ……………...……... 76 4.3.3 Caso de prueba 3:
visualización de los modelos: modelos sólidos, en alambre y
en vértices ………………………………………………………………………………. 79 4.3.4 Caso de
prueba 4: generación de animación ………………………………….... 80 4.3.5 Caso
de prueba 5: lectura de un archivo de texto conformado por puntos
(x,y) 86
4.4 Conclusiones ……………………………………………………………………………. 89 CAPÍTULO V.
CONCLUSIONES
5 as 5.1 Introducción …………………….…………………………………………………….... 91 5.2
Metas alcanzadas ………………..……………….……..…………………………….... 91 5.3
Conclusiones …………………...……………………………..………………………… 92 5.4 Trabajos
futuros ………………….…………………………………..………………….. 93 Referencias
………………………………………………………………………………………… 95 Glosario de términos
…………………..…….………………………………………….....……… 97 Anexo A: funciones de
bibliotecas de OpenGL ……………………………………………….. 98 Anexo B: tipos de
datos de OpenGL …………………………...………………………………. 99 Anexo C: casos de uso
de GrafO3D ……………………………………………………………… 100 Anexo D: ejemplo de un
archivo GrafO3D ……………………………………………………. 111 Anexo E: ejemplo de un
archivo de texto que describe un objeto en términos de puntos …...
112 Anexo F: ejemplo de un archivo VRML ……………………..………………………………..
113 Anexo G: definición de la clase Lexer en la gramática de
GrafO3D ……………………….. 114 Anexo H: definición de la clase Parser en
la gramática de GrafO3D ……………………….. 115
-
iii
LISTA DE FIGURAS Figura 1.1 Ejemplos de objetos rígidos
……….…………………………………………… 2 Figura 1.2 Ejemplos de objetos articulados
…..…………………………………………… 3 Figura 1.3 Ejemplos de objetos deformables
……….……………………………………. 3 Figura 1.4 Relación de GrafO3D con algunas
herramientas desarrolladas en el cenidet 5 Figura 1.5 Sistema de
coordenadas en un espacio 3D ……..……………………………. 8 Figura 1.6 Niveles
de abstracción de OpenGL …………………………………………... 14 Figura 1.7 Matrices
de transformación lineal ………..…………………………………... 14 Figura 1.8
Interfaz de la herramienta Anim8or ………………………………………… 16 Figura 1.9
Interfaz de la herramienta AC3D ……………..……………………………... 19 Figura 2.1
Diagrama de casos de uso general ……..……………………………………... 25 Figura
2.2 Modelo conceptual de GrafO3D …………………………………………….. 27 Figura 2.3
Tipos de transformaciones ……………………………………………………. 42 Figura 2.4 Tipos
de proyección …………………………………………………………... 42 Figura 2.5 Diagrama de
paquetes de GrafO3D …………………………………………... 47 Figura 2.6 Clases
contenidas en el paquete unspecified ..….……………………………. 47 Figura 2.7
Clases contenidas en el paquete GrafO3D ………..…………………………. 48 Figura
2.8 Clases contenidas en el paquete GrafO3D (continuación de la
figura 2.7) … 49 Figura 2.9 Clases contenidas en el paquete GrafO3D
(continuación de la figura 2.7) … 50 Figura 2.10 Relaciones de
algunas clases abstractas con sus clases hijas ……………… 51 Figura
2.11 Diseño de la interfaz de usuario de GrafO3D ………………………………. 53
Figura 3.1 Proceso para el almacenamiento de los modelos en memoria
……………… 61 Figura 3.2 Menú de opciones y barra de herramientas del
entorno gráfico de GrafO3D 62 Figura 3.3 Editores de propiedades
del entorno gráfico de GrafO3D ………………… 63 Figura 3.4 Controles para
la manipulación de la cámara, luz, piso y ejes del entorno
gráfico de GrafO3D ……………………………………………………………….. 65 Figura 3.5
Pantalla de propiedades de la animación, opción: captura
independiente de
frames ……………………………………………………………………………….. 66 Figura 3.6 Pantalla
de generación de animación con movimiento de traslación,
rotación o escala ……………………………………………………………………. 67 Figura 3.7
Pantalla de generación de animación con movimiento de traslación
……. 67 Figura 3.8 Proceso para tratar archivos generados por la
herramienta para el modelado
automático de objetos alfaflexibles ………………………………………………. 70
Figura 4.1 Archivo de texto y datos almacenados en memoria
………………………….. 75 Figura 4.2 Visualización de los modelos gráficos en
la interfaz de usuario …………… 76 Figura 4.3 Propiedades del modelo
…………………………………………………………. 77 Figura 4.4 Material del objeto
……………………………………………………………… 77 Figura 4.5 Propiedades de la luz
…………………………………………………………… 78 Figura 4.6 Modelo resultante de la
aplicación de funciones de graficación …………… 78 Figura 4.7 Modelos
sólidos …………………………………………………………………... 79 Figura 4.8 Modelos en
alambre ……………………………………………………………… 79 Figura 4.9 Modelos en vértices
……………………………………………………………… 79 Figura 4.10 Frames capturados para
generar un archivo de animación ………………… 80 Figura 4.11 Frames
generados por GrafO3D correspondientes al modelo de una mano … 81
Figura 4.12 Frames generados por GrafO3D correspondientes al modelo
de un brazo de
un robot ……………………………………………………………………………… 82
-
iv
Figura 4.13 Frames generados por GrafO3D correspondientes al
modelo de un gusano ... 83 Figura 4.14 Pantalla de propiedades de
la animación ……………………………………… 84 Figura 4.15 Frames generados por
GrafO3D ……………………………………………….. 84 Figura 4.16 Pantalla de propiedades
de la animación ……………………………………… 85 Figura 4.17 Frames generados por
GrafO3D ……………………………………………….. 85 Figura 4.18 Archivo de texto con la
descripción del modelo de una boca ……………… 86 Figura 4.19 Modelo
gráfico generado por GrafO3D ……………………………………… 87 Figura 4.20 Frames
generados por GrafO3D ……………………………………………….. 87 Figura 4.21 Archivo
de texto con la descripción del modelo de una boca ……………… 88 Figura
4.22 Modelo gráfico generado por GrafO3D ……………………………………… 88 Figura
4.23 Frames generados por GrafO3D ……………………………………………….. 88 Figura
D.1 Modelos descritos en el archivo GrafO3D ……………………………………. 111
Figura E.1 Modelo descrito en términos de puntos en el archivo de
texto ……………. 112 Figura F.1 Modelo resultante del archivo VRML
………………………………………… 113
-
v
LISTA DE TABLAS Tabla 2.1 Descripción de los casos de uso del
diagrama ………………………………. 26 Tabla 2.2 Nodos de figura de VRML
……………………………………………………. 33 Tabla 2.3 Nodos de geometría y material de
VRML …………………………………… 34 Tabla 2.4 Nodos de transformación de VRML
…………………………………………... 35 Tabla 2.5 Nodos de cámara de VRML
………………………………………………….. 36 Tabla 2.6 Nodos de iluminación de VRML
…………………………………………….. 36 Tabla 2.7 Nodos de grupo de VRML
……………………………………………………. 36 Tabla 2.8 Primitivas de línea de OpenGL
……………………………………………….. 39 Tabla 2.9 Primitivas de polígonos de OpenGL
………………………………………… 40 Tabla 2.10 Primitivas de GrafO3D
…………………………………………………………. 43 Tabla 3.1 Símbolos para la definición de
reglas en una gramática ANTLR …….…… 60 Tabla 3.2 Funciones de C++
utilizadas para la creación del archivo de texto …….. 62 Tabla 3.3
Componentes de C++ Builder ……………………………………………….. 63 Tabla 3.4
Instrucciones OpenGL …………………………………………………………. 63 Tabla 3.5
Componentes de C++ Builder ……………………………………………….. 64 Tabla 3.6
Instrucciones OpenGL …………………………………………………………. 64 Tabla 3.7
Componentes de C++ Builder ……………………………………………….. 65 Tabla 3.8
Instrucciones OpenGL …………………………………………………………. 66 Tabla 3.9
Componentes de C++ Builder ……………………………………………….. 68 Tabla 3.10
Instrucciones OpenGL …………………………………………………………. 68 Tabla 3.11 Otras
instrucciones OpenGL ……………………………………………….. 68
-
Entorno de graficación y generación de modelos 2D y 3D para
aplicaciones de Visión Artificial Referencias
95
REFERENCIAS [Ac3d04] Inivis (Agosto 2003) AC3D. [On line]
Available: http://www.ac3d.org. [Anim8or03] S. Glanville (Agosto
2003) Anim8or. [On line] Available: http://www.anim8or.com.
[Antlr03] -- (Agosto, 2003) ANTLR. [On line] Available:
http://www.antlr.org. [Avi04] -- (Marzo, 2004) AVI example code for
creating AVI files. [On line] Available:
http://www.wischik.com/lu/programmer/avi_utils.html. [Booch00] G.
Booch [et al], El Lenguaje Unificado de Modelado, Addison Wesley,
España, 2000. [Compiladores03] H. Hernández. Apuntes de
compiladores, Centro Nacional de Investigación y Desarrollo
Tecnológico (Cenidet), Cuernavaca, Morelos, Mayo 2003. [Delrieux03]
C. Delrieux, Introducción a la Computación Gráfica, Departamento de
Ingeniería Eléctrica, Universidad Nacional del Sur, Agosto, 2003.
[García04] C. García (Noviembre, 03) Programación con Delphi y
OpenGL. [On line] Available: http://glscene.tripod.com. [Huerta04]
J. Huerta (Marzo, 2004) Introducción al CAD/CAM, Universidad Jaime,
Departamento de Lenguajes y Sistemas Informáticos. [On line]
Available: http://www3.uji.es/~huerta/dfao/apuntes/tema1.pdf.
[Lamers96] J. Lamers, M. T. Peterson, 3D Studio Versión 4.0,
Prentice Hall, México, 1996. [López03] J. G. López, “Detallador de
tareas para procesos de Visión Robótica”, Tesis para obtener el
grado de Maestro en Ciencias en Ciencias Computacionales,
Departamento de Ciencias Computacionales, Área de Visión
Artificial, Centro Nacional de Investigación y Desarrollo
Tecnológico (Cenidet), Cuernavaca, Morelos, Julio del 2003.
[Magadán99] A. Magadán, “Reconocimiento de rostros invariante a
expresiones faciales”, Tesis para obtener el grado de Maestro en
Ciencias en Ciencias Computacionales, Departamento de Ciencias
Computacionales, Área de Visión Artificial, Centro Nacional de
Investigación y Desarrollo Tecnológico (Cenidet), Cuernavaca,
Morelos, Noviembre 1999.
-
Entorno de graficación y generación de modelos 2D y 3D para
aplicaciones de Visión Artificial Referencias
96
[May04] I. May, Tesis en desarrollo: “Modelado de objetos
deformables, utilizando color y textura”, Departamento de Ciencias
Computacionales, Área de Visión Artificial, Centro Nacional de
Investigación y Desarrollo Tecnológico (Cenidet), Cuernavaca,
Morelos. [Mcmahon98] C. McMahon, J. Browne, CAD CAM. Principles,
practice and manufacturing management, 2nd edition, Addisson
Wesley, United States of America, 1998. [Nalwa93] V. Nalwa, A
Guided Tour to Computer Vision, Addison Wesley, 1993. [Orbe03] E.
Orbe, “Herramienta para el Modelado Automático de Objetos
Alfaflexibles”, Tesis para obtener el grado de Maestro en Ciencias
en Ciencias Computacionales, Departamento de Ciencias
Computacionales, Área de Visión Artificial, Centro Nacional de
Investigación y Desarrollo Tecnológico (Cenidet), Cuernavaca,
Morelos, Julio del 2003. [Pesce96] M. Pesce, VRML para internet,
Prentice Hall, México, 1996. [Rueda03] C. Rueda Murillo, Tesis en
desarrollo: “Simulador de un brazo articulado con interface
gráfica”, Departamento de Ciencias Computacionales, Área de Visión
Artificial, Centro Nacional de Investigación y Desarrollo
Tecnológico (Cenidet), Cuernavaca, Morelos. [Segal04] M. Segal, K.
Akeley, The OpengGL Graphics System: A Specification (Version 1.5).
Silicon Graphics, Inc. Copyright 1992-2003. [Suárez03] P. K.
Suárez, “Animación y visualización de fenómenos naturales”, Tesis
para obtener el grado de Licenciatura en Ingeniería en Ciencias
Computacionales, Universidad de las Américas, Cholula, Puebla,
Enero del 2003. [On line] Available:
http://www.pue.udlap.mx/~tesis/lis/suarez_r_pk/. [Vrml03] --
(Enero, 2004) VRML 97, ISO/IEC 14772, The Virtual Reality Modeling
Language. [On line] Available:
http://www.web3d.org/x3d/specifications/vrml/ISO_IEC
_14772-All/part1/concepts.html#4.2.1. [Wright97] R. Wright Jr., M.
Sweet. Programación en OpenGL. Anaya. España 1997. [Zamora04] S.
Zamora (Marzo, 2004) La Lengua Española. [On line] Available:
http://www.geocities.com/sergiozamorab/quesla.htm.
-
Entorno de graficación y generación de modelos 2D y 3D para
aplicaciones de Visión Artificial Anexos
98
ANEXO A Funciones de bibliotecas de OpenGL
Ejemplos de funciones contenidas en la biblioteca
OpenGL.DLL.
FUNCIÓN DESCRIPCIÓN
glClearColor Selecciona los valores de color y alfa para borrar
los buffers de color. glOrtho Describe un volumen de trabajo
paralelo.
glViewport Define la porción de ventana en la que puede dibujar
OpenGL.
glVertex Especifica las coordenadas 3D de un vértice.
glMatrixMode Especifica la matriz actual
Ejemplos de funciones contenidas en la biblioteca GLU.DLL.
FUNCIÓN DESCRIPCIÓN
gluLookAt
Define una transformación de visualización basada en la posición
del observador, la posición del centro de la escena y un vector que
apunta hacia arriba desde la perspectiva del observador.
gluPerspective Define una matriz de Proyección en perspectiva
para la visualización.
gluCylinder Dibuja un cilindro cuádrico.
gluSphere Dibuja una esfera cuádrica.
gluQuadricTexture Activa o desactiva la generación de
coordenadas de textura para el mapeado de texturas sobre
cuádricas.
Ejemplos de funciones contenidas en la biblioteca GLUT.DLL.
FUNCIÓN DESCRIPCIÓN
glutInit Modifica las variables de estado del Glut para hacer
una sesión con el sistema de ventanas.
glutInitWindowPosition Indica la posición en píxeles en la
pantalla de la ventana.
glutCreateWindow Crea una ventana.
gluKeyBoardFunc Genera las llamadas al teclado.
glutCreateMenu Crea un menú.
-
Entorno de graficación y generación de modelos 2D y 3D para
aplicaciones de Visión Artificial Anexos
99
ANEXO B Tipos de datos de OpenGL
Tipos de datos de OpenGL.
TIPO DE DATO REPRESENTACIÓN INTERNA
GLbyte Entero de 8 bits.
GLshort Entero de 16 bits.
GLint, GLsizei Entero de 32 bits.
GLfloat, GLclampf Coma flotante de 32 bits.
GLdouble, GLclampd Coma flotante de 64 bits.
GLubyte, GLboolean Entero de 8 bits sin signo.
GLushort Entero de 16 bits sin signo.
GLuint, GLenum, GLbitfield
Entero de 32 bits sin signo.
-
Entorno de graficación y generación de modelos 2D y 3D para
aplicaciones de Visión Artificial Anexos
100
ANEXO C Casos de uso de GrafO3D Documentación de casos de uso
Caso de uso: crear nueva escena Actores: usuario Descripción: este
caso de uso lo inicia el usuario con la finalidad de crear una
nueva escena, eliminando de la pantalla lo que se haya creado
anteriormente.
ACTOR SISTEMA Paso Acción Paso Acción Exc.
1 El usuario selecciona la opción para crear una nueva
escena.
2 El sistema limpia la pantalla para iniciar una nueva
escena.
E1
Excepciones: id Nombre Acción E1 Existe una escena en uso con
cambios
sin guardar. El sistema muestra una pantalla al usuario para
guardar los cambios.
Caso de uso: abrir escena desde archivo Actores: usuario
Descripción: este caso de uso lo inicia el usuario cuando desea
abrir un archivo de texto existente con la descripción de una
escena (archivo GrafO3D).
ACTOR SISTEMA Paso Acción Paso Acción Exc.
1 El usuario selecciona la opción para abrir un archivo de
texto.
2 El sistema presenta una pantalla en la cual el usuario
proporciona el nombre de un archivo existente.
3
El usuario introduce el nombre del archivo.
4 El sistema valida que el archivo de texto exista.
E1
5 El sistema presenta los modelos gráficos descritos en el
archivo de texto.
E2
Excepciones: id Nombre Acción E1 Nombre de archivo inexistente.
Volver a ingresar información. E2 Archivo con errores. Envía
mensaje de error. Abrir otro archivo
Crear nueva escena
usuario
Abrir escena desde archivo
usuario
-
Entorno de graficación y generación de modelos 2D y 3D para
aplicaciones de Visión Artificial Anexos
101
Caso de uso: importar archivo Actores: usuario Descripción: este
caso de uso lo inicia el usuario cuando desea abrir un archivo de
texto existente que contenga la descripción de un modelo en término
de puntos (x,y).
ACTOR SISTEMA Paso Acción Paso Acción Exc.
1 El usuario selecciona la opción para importar un archivo de
texto.
2 El sistema presenta una pantalla en la cual el usuario
proporciona el nombre de un archivo existente.
3
El usuario introduce el nombre del archivo.
4 El sistema valida que el archivo de texto exista.
E1
5 El sistema presenta el modelo gráfico descrito en el archivo
de texto.
6 El sistema presenta al usuario una pantalla para que
proporcione el nombre del archivo de animación y el tiempo de
espera entre cada frame.
E2
7 El sistema genera los archivos BMP correspondientes a los
frames que forman la secuencia de video, y el archivo de video tipo
AVI que contiene la animación resultante.
Excepciones: id Nombre Acción E1 Nombre de archivo inexistente.
Volver a ingresar información. E2 Información inválida. Volver a
ingresar información. Caso de uso: crear nuevo objeto Actores:
usuario Descripción: este caso de uso lo inicia el usuario cuando
desea crear un nuevo objeto en la escena.
ACTOR SISTEMA Paso Acción Paso Acción Exc.
1 El usuario selecciona la opción para crear un nuevo
objeto.
2 El sistema agrega el nombre del objeto al árbol de objetos y
primitivas.
Crear nuevo objeto
usuario
Importar archivo
usuario
-
Entorno de graficación y generación de modelos 2D y 3D para
aplicaciones de Visión Artificial Anexos
102
Caso de uso: modificar propiedades de un objeto o primitiva
Actores: usuario Descripción: este caso de uso lo inicia el usuario
cuando desea modificar las características de un objeto o
primitiva, como lo son: nombre, color, rotación, traslación,
escala, textura. Si las modificaciones son hechas a un objeto,
todas las primitivas que contenga este objeto son también
modificadas.
Caso de uso: cambiar nombre Actores: usuario
Descripción: este caso de uso lo inicia el usuario cuando desea
cambiar el nombre de un objeto o primitiva.
ACTOR SISTEMA Paso Acción Paso Acción Exc.
1 El usuario selecciona la opción para ver las propiedades del
objeto o primitiva.
2 El sistema valida que un objeto o primitiva esté
seleccionado.
E1
3 El sistema presenta la pantalla de propiedades del objeto o
primitiva.
4
El usuario introduce el nuevo nombre del objeto o primitiva.
5 El usuario acepta las modificaciones. 6 El sistema valida que
el nuevo nombre del objeto o primitiva no exista.
E2
7 El sistema presenta al objeto o primitiva con el nuevo nombre,
en el árbol de objetos.
Modificar propiedades de un objeto o primitiva
usuario
Cambiar nombre
usuario
-
Entorno de graficación y generación de modelos 2D y 3D para
aplicaciones de Visión Artificial Anexos
103
Excepciones: id Nombre Acción E1 Objeto o primitiva no
seleccionada. El sistema envía un mensaje de error: no hay
objeto o primitiva seleccionada. E2 Nombre de objeto o primitiva
existente. Volver a ingresar información Caso de uso: cambiar color
Actores: usuario Descripción: este caso de uso lo inicia el usuario
cuando desea cambiar el color de un objeto o primitiva
existente.
ACTOR SISTEMA Paso Acción Paso Acción Exc.
1 El usuario selecciona el objeto o primitiva deseada.
2 El usuario selecciona la opción para ver las propiedades del
objeto o primitiva.
3 El sistema presenta la pantalla de propiedades del objeto o
primitiva.
4 El usuario modifica el color del objeto o primitiva.
5 El usuario acepta las modificaciones. 6 El sistema aplica el
cambio de color al objeto (y a las primitivas que lo compongan) o a
la primitiva seleccionada.
Caso de uso: aplicar rotación Actores: usuario Descripción: este
caso de uso lo inicia el usuario cuando desea rotar algún objeto o
primitiva existente en cualquiera de los ejes x, y o z.
ACTOR SISTEMA Paso Acción Paso Acción Exc.
1 El usuario selecciona el objeto o primitiva deseada.
2 El usuario selecciona la opción para ver las propiedades del
objeto o primitiva.
3 El sistema presenta la pantalla de propiedades del objeto o
primitiva.
4 El usuario maneja los controles para modificar el número de
grados a rotar en cualquiera de los tres ejes.
5 El usuario acepta las modificaciones. 6 El sistema aplica la
rotación al objeto (y a las primitivas que lo compongan) o a la
primitiva seleccionada.
Cambiar color
usuario
Aplicar rotación
usuario
-
Entorno de graficación y generación de modelos 2D y 3D para
aplicaciones de Visión Artificial Anexos
104
Caso de uso: aplicar traslación Actores: usuario Descripción:
este caso de uso lo inicia el usuario cuando desea trasladar o
mover algún objeto o primitiva existente en cualquiera de los ejes
x, y o z.
ACTOR SISTEMA Paso Acción Paso Acción Exc.
1 El usuario selecciona el objeto o primitiva deseada.
2 El usuario selecciona la opción para ver las propiedades del
objeto o primitiva.
3 El sistema presenta la pantalla de propiedades del objeto o
primitiva.
4 El usuario maneja los controles para modificar los puntos en
los que será trasladado el objeto o primitiva en cualquiera de los
tres ejes.
5 El usuario acepta las modificaciones. 6 El sistema presenta el
objeto (y las primitivas que lo compongan) o la primitiva con las
nuevas modificaciones.
Caso de uso: cambiar escala Actores: usuario Descripción: este
caso de uso lo inicia el usuario cuando desea cambiar la escala o
tamaño de un objeto o primitiva existente.
ACTOR SISTEMA Paso Acción Paso Acción Exc.
1 El usuario selecciona el objeto o primitiva deseada.
2 El usuario selecciona la opción para ver las propiedades del
objeto o primitiva.
3 El sistema presenta la pantalla de propiedades del objeto o
primitiva.
4 El usuario maneja los controles para modificar el tamaño del
objeto o primitiva en cualquiera de los tres ejes.
5 El usuario acepta las modificaciones. 6 El sistema presenta el
objeto (y las primitivas que lo compongan) o la primitiva con la
nueva escala.
Aplicar traslación
usuario
Cambiar escala
usuario
-
Entorno de graficación y generación de modelos 2D y 3D para
aplicaciones de Visión Artificial Anexos
105
Caso de uso: aplicar textura Actores: usuario Descripción: este
caso de uso lo inicia el usuario cuando desea aplicar una textura a
un objeto o a una primitiva.
ACTOR SISTEMA Paso Acción Paso Acción Exc.
1 El usuario selecciona el objeto o primitiva deseada.
2 El usuario selecciona la opción para ver las propiedades del
objeto o primitiva.
3 El sistema presenta la pantalla de propiedades del objeto o
primitiva.
4 El usuario selecciona el botón para abrir un archivo de
textura.
5 El sistema envía una pantalla para que el usuario elija el
archivo que contiene la textura.
6 El usuario elige un archivo de textura. 7 El sistema valida
que el archivo exista.
E1
8 El usuario acepta las modificaciones. 9 El sistema presenta el
objeto (y las primitivas que lo compongan) o la primitiva con la
nueva textura.
Excepciones: id Nombre Acción E1
Nombre de archivo inexistente. Volver a ingresar información
Caso de uso: agregar primitiva Actores: usuario Descripción:
este caso de uso lo inicia el usuario cuando desea agregar una
primitiva a un objeto existente.
ACTOR SISTEMA Paso Acción Paso Acción Exc.
1 El usuario selecciona el objeto para agregar una
primitiva.
2 El usuario selecciona la opción de agregar primitiva.
3 El sistema habilita la barra de herramientas de
primitivas.
E1
4 El usuario selecciona la primitiva deseada.
5 El sistema agrega la primitiva al objeto seleccionado y al
árbol de objetos.
6 El sistema dibuja la primitiva en la escena.
Aplicar textura
usuario
Agregar primitiva
usuario
-
Entorno de graficación y generación de modelos 2D y 3D para
aplicaciones de Visión Artificial Anexos
106
Excepciones: id Nombre Acción E1 Objeto no seleccionado El
usuario debe seleccionar un objeto. Caso de uso: guardar escena
Actores: usuario Descripción: este caso de uso lo inicia el usuario
con la finalidad de almacenar en un archivo de texto la información
actual de la escena.
ACTOR SISTEMA Paso Acción Paso Acción Exc.
1 El usuario selecciona la opción para guardar la escena.
2 El sistema presenta una pantalla para que el usuario
proporcione el nombre del archivo.
3
El usuario introduce el nombre del archivo.
4 El sistema valida que no exista otro archivo de texto con el
mismo nombre que introdujo el usuario.
E1
5 El sistema guarda la información de la escena actual en el
archivo de texto.
Excepciones: id Nombre Acción E1 Nombre de archivo existente.
Preguntar si se quiere reemplazar el archivo, de
lo contrario, volver a ingresar información. Caso de uso: manejo
de iluminación Actores: usuario Descripción: este caso de uso lo
inicia el usuario con la finalidad de modificar las propiedades de
la luz, como lo son: nombre, posición y color.
ACTOR SISTEMA Paso Acción Paso Acción Exc.
1 El usuario selecciona el botón para ver la pantalla de
propiedades de la luz.
2 El sistema presenta la pantalla en donde se muestran las
propiedades de la luz.
3
El usuario modifica las propiedades de color, posición o
color.
4 El usuario acepta los cambios.
5 El sistema valida que la información esté correcta.
E1
6 El sistema muestra la escena con las nuevas modificaciones
Guardar escena
usuario
Manejo de iluminación
usuario
-
Entorno de graficación y generación de modelos 2D y 3D para
aplicaciones de Visión Artificial Anexos
107
Caso de uso: cambio de perspectiva Actores: usuario Descripción:
este caso de uso lo inicia el usuario con la finalidad de mover la
cámara en las direcciones de adelante, atrás, izquierda y
derecha.
ACTOR SISTEMA Paso Acción Paso Acción Exc.
1 El usuario selecciona el botón dependiendo de la dirección en
la que quiera mover la cámara.
2 El sistema mueve la cámara en la dirección indicada por el
usuario.
Caso de uso: cambiar vista de modelos Actores: usuario
Descripción: este caso de uso lo inicia el usuario cuando desea
cambiar el estilo o vista de los modelos en la escena, como lo son:
modelos de alambre, sólidos o vértices.
ACTOR SISTEMA Paso Acción Paso Acción Exc.
1 El usuario selecciona desde el menú de opciones, el tipo de
vista que desee.
2 El sistema presenta los modelos con el tipo de vista
especificado por el usuario.
Caso de uso: eliminar objeto o primitiva Actores: usuario
Descripción: este caso de uso lo inicia el usuario cuando desea
eliminar un objeto o primitiva existente.
ACTOR SISTEMA Paso Acción Paso Acción Exc.
1 El usuario selecciona el objeto o primitiva a eliminar.
2 El usuario selecciona la opción de eliminar.
3 El sistema elimina el objeto (con todas sus primitivas) o la
primitiva seleccionada del árbol de objetos y de la escena.
E1
Cambio de perspectiva
usuario
Cambiar vista de modelos
usuario
Eliminar objeto o primitiva
usuario
-
Entorno de graficación y generación de modelos 2D y 3D para
aplicaciones de Visión Artificial Anexos
108
Excepciones: id Nombre Acción E1 Eliminación de la única
primitiva del objeto. El sistema elimina el objeto. Caso de uso:
generar animación Actores: usuario Descripción: este caso de uso lo
inicia el usuario cuando desea generar animación con la escena
actual. Se puede generar animación de tres formas diferentes:
mediante la captura de frames, por la selección del tipo de
movimiento (traslación, rotación, escala), o mediante la
especificación de puntos (x,y,z) sobre los que se trasladará el
objeto.
Caso de uso: captura de frames Actores: usuario Descripción:
este caso de uso lo inicia el usuario cuando genera animación de un
objeto o primitiva, mediante la captura de frames en el momento en
que se desee que esa imagen forme parte del archivo de animación
final.
ACTOR SISTEMA Paso Acción Paso Acción Exc.
1 El usuario selecciona del menú de animación, la opción de
crear nueva animación.
2 El sistema prepara las opciones necesarias para iniciar la
captura de frames.
3 El usuario captura el número de frames que desee.
4 El sistema crea las imágenes BMP correspondientes.
5 El usuario finaliza la captura de frames.
6 El usuario selecciona la opción de ver las propiedades de
animación.
7 El sistema presenta la pantalla de propiedades de la
animación.
8 El usuario proporciona la información necesaria en la pantalla
de propiedades.
9 El usuario selecciona la opción para generar el archivo de
animación.
10 El sistema crea el archivo de video tipo AVI con los frames
capturados.
E1
Generar animación
usuario
Captura de frames
usuario
-
Entorno de graficación y generación de modelos 2D y 3D para
aplicaciones de Visión Artificial Anexos
109
Excepciones: id Nombre Acción E1 Alguna información
proporcionada es inválida. No se crea el archivo de video
correctamente. Caso de uso: selección del tipo de movimiento
Actores: usuario Descripción: este caso de uso lo inicia el usuario
cuando genera animación a través de la selección del tipo de
movimiento que tendrá el objeto o primitiva: traslación, rotación o
escala. El sistema solicita al usuario información sobre el nombre
del archivo de animación, tiempo de espera entre cada frame, número
de repeticiones de la secuencia total, tipo de movimiento, eje
sobre el cual se aplicará el movimiento, y el número de veces que
se repetirá el movimiento.
ACTOR SISTEMA Paso Acción Paso Acción Exc.
1 El usuario selecciona del menú de animación, la opción de
generar animación.
2 El sistema presenta la pantalla de propiedades de la
animación.
3 El usuario proporciona la información necesaria en la pantalla
de propiedades.
9 El usuario selecciona la opción para generar el archivo de
animación.
10 El sistema crea el archivo de video tipo AVI.
E1
Excepciones: id Nombre Acción E1 Alguna información
proporcionada es inválida. No se crea el archivo de video
correctamente. Caso de uso: traslación Actores: usuario
Descripción: este caso de uso lo inicia el usuario cuando genera
animación mediante la traslación de una primitiva. El sistema
solicita al usuario información sobre el nombre del archivo de
animación, tiempo de espera entre cada frame, número de
repeticiones de la secuencia total y el conjunto de puntos (x,y,z)
por los que la primitiva será trasladada.
Selección del tipo de
movimientousuario
Traslación
usuario
-
Entorno de graficación y generación de modelos 2D y 3D para
aplicaciones de Visión Artificial Anexos
110
ACTOR SISTEMA
Paso Acción Paso Acción Exc. 1 El usuario selecciona del menú
de
animación, la opción de generar animación.
2 El sistema presenta la pantalla de propiedades de la
animación.
3 El usuario proporciona la información necesaria en la pantalla
de propiedades.
9 El usuario selecciona la opción para generar el archivo de
animación.
10 El sistema crea el archivo de video tipo AVI.
E1
Excepciones: id Nombre Acción E1 Alguna información
proporcionada es inválida. No se crea el archivo de video
correctamente. Caso de uso: cerrar aplicación Actores: usuario
Descripción: este caso de uso lo inicia el usuario cuando desea
salir de la aplicación.
ACTOR SISTEMA Paso Acción Paso Acción Exc.
1 El usuario selecciona del menú la opción de salir.
2 El sistema verifica que no existan cambios en la escena sin
guardar.
E1
3 El sistema cierra la aplicación. Excepciones: id Nombre Acción
E1 La escena no ha sido guardada. El sistema muestra una pantalla
al usuario
para guardar los cambios.
Cerrar aplicación
usuario
-
Entorno de graficación y generación de modelos 2D y 3D para
aplicaciones de Visión Artificial Anexos
111
ANEXO D Ejemplo de un archivo GrafO3D Ejemplo de un archivo
GrafO3D que describe dos objetos que corresponden a la Tierra y a
la Luna. Los modelos correspondientes se muestran en la Figura D.1.
#Grafo v10 PerspectiveCamera Camara1 {
position 0.00 0.50 6.00 orientation 0.00 1.00 0.00
} Lighting Luz1 {
LightPosition 4.00 4.00 4.00 0.00 LightAmbient 0.20 0.20 0.20
1.00 LightDiffuse 0.80 0.80 0.80 1.00 LightSpecular 1.00 1.00 1.00
1.00
} Separator Objeto1 {
Transform Transform1 {
translation 0.00 0.50 -4.00 rotation 15.00 1.00 0.00 scale 1.00
1.00 1.00
} Material Material1 {
ambientColor 0.80 0.80 0.20 1.00 diffuseColor 0.10 0.50 0.80
1.00 specularColor 1.00 1.00 1.00 1.00 emissiveColor 0.30 0.20 0.20
1.00 shininess 10.00 Texture C:\GrafO3D\texturas\Earth.bmp
}
Sphere Tierra {
radius 1.50 } Transform Transform1 {
translation 2.50 0.50 -3.00 rotation 15.00 1.00 0.00 scale 1.00
1.00 1.00
} Material Material1 {
ambientColor 0.80 0.80 0.20 1.00 diffuseColor 0.10 0.50 0.80
1.00 specularColor 1.00 1.00 1.00 1.00 emissiveColor 0.0 0.20 0.20
1.00 shininess 10.00 Texture C:\GrafO3D\textuas\Sup_Lunar.bmp
} Sphere Luna { radius 1.00 }
}
Figura D.1 Modelos descritos en el archivo GrafO3D.
-
Entorno de graficación y generación de modelos 2D y 3D para
aplicaciones de Visión Artificial Anexos
112
ANEXO E Ejemplo de un archivo de texto que describe un objeto en
términos de puntos
Ejemplo de un archivo de texto que describe un objeto en
términos de los puntos que forman su contorno. El modelo
corresponde al contorno de una boca humana como se muestra en la
Figura E.1: 66 3 encabezado de variables 0.0 1.0 0.1 1.2 0.3 1.3
0.5 1.35 0.7 1.37 0.9 1.35 1.0 1.33 1.1 1.31 1.3 1.29 1.5 1.31 1.7
1.33 1.9 1.35 2.0 1.37 2.1 1.35 2.3 1.3 2.5 1.2 2.7 1.0 2.5 0.9 2.3
0.87 2.1 0.85 2.0 0.83 1.9 0.81 1.7 0.79 1.5 0.77 1.3 0.75 1.1 0.77
1.0 0.79 0.9 0.81 0.7 0.83 0.5 0.85 0.3 0.87 0.1 0.89 0.0 0.91 1.0
1.0 1.1 1.2 1.3 1.3 1.5 1.35 1.7 1.37 1.9 1.35 2.0 1.33 2.1 1.31
2.3 1.29 2.5 1.31 2.7 1.33 2.9 1.35 3.0 1.37 3.1 1.35 3.3 1.3 3.5
1.2 3.7 1.0 3.5 0.9 3.3 0.87 3.1 0.85 3.0 0.83 2.9 0.81 2.7 0.79
2.5 0.77 2.3 0.75 2.1 0.77 2.0 0.79 1.9 0.81 1.7 0.83 1.5 0.85 1.3
0.87 1.1 0.89 1.0 0.91 2.0 1.0 2.1 1.2 2.3 1.3 2.5 1.35 2.7 1.37
2.9 1.35 3.0 1.33 3.1 1.31 3.3 1.29 3.5 1.31 3.7 1.33 3.9 1.35 4.0
1.37 4.1 1.35 4.3 1.3 4.5 1.2 4.7 1.0 4.5 0.9 4.3 0.87 4.1 0.85 4.0
0.83 3.9 0.81 3.7 0.79 3.5 0.77 3.3 0.75 3.1 0.77 3.0 0.79 2.9 0.81
2.7 0.83 2.5 0.85 2.3 0.87 2.1 0.89 2.0 0.91
Figura E.1 Modelo descrito en términos de puntos en el archivo
de texto.
-
Entorno de graficación y generación de modelos 2D y 3D para
aplicaciones de Visión Artificial Anexos
113
ANEXO F Ejemplo de un archivo VRML Ejemplo de un archivo VRML
cuyo objeto descrito corresponde al modelo de una culebra. El
resultado se muestra en la Figura F.1. #VRML V2.0 utf8 Background
{
skyColor 0.7 0.7 0.9 } #ground Shape {
appearance Appearance { material Material { diffuseColor 0.6 0.6
0 }
} geometry Box { size 20 0.01 20 }
} #snake shape Transform {
translation 0 0.3 0 children Shape {
appearance Appearance { material Material {
diffuseColor 1.0 0.8 0 }
} geometry Extrusion { creaseAngle 1.57 crossSection [
#circle
1 0, 0.9135 -0.4067, 0.6691 -0.7431, 0.309 -0.9511, -0.1045
-0.9945, -0.5 -0.866, -0.809 -0.5878, -0.9781 -0.2079, -0.9781
0.2079, -0.809 0.5878, -0.5 0.866, -0.1045 0.9945, 0.309 0.9511,
0.6691 0.7431, 0.9135 0.4067, 1 0
]
spine [ # sinusoid -4.0000 0.0 0.0000, -3.5556 0.0 0.6428,
-3.1111 0.0 0.9848, -2.6667 0.0 0.8660, -2.2222 0.0 0.3420, -1.7778
0.0 -0.3420, -1.3333 0.0 -0.8660, -0.8889 0.0 -0.9848, -0.4444 0.0
-0.6428, 0.0000 0.0 0.0000, 0.4444 0.0 0.6428, 0.8889 0.0 0.9848,
1.3333 0.0 0.8660, 1.7778 0.0 0.3420, 2.2222 0.0 -0.3420, 2.6667
0.0 -0.8660, 3.1111 0.0 -0.9848, 3.5556 0.0 -0.6428, 4.0000 0.0
-0.0000,
] scale [
0.05 0.02, 0.2 0.1, 0.4 0.150, 0.3 0.3, 0.3 0.3, 0.3 0.3, 0.3
0.3, 0.3 0.3, 0.3 0.3, 0.3 0.3, 0.3 0.3, 0.3 0.3, 0.29 0.29, 0.29
0.29, 0.28 0.28, 0.25 0.25, 0.20 0.20, 0.1 0.1, 0.05 0.05
] }
} }
Figura F.1 Modelo resultante del archivo VRML.
-
Entorno de graficación y generación de modelos 2D y 3D para
aplicaciones de Visión Artificial Anexos
114
ANEXO G Definición de la clase Lexer en la gramática de GrafO3D
Definición de la clase del analizador léxico de la gramática de
GrafO3D generada bajo las especificaciones de ANTLR. options {
mangleLiteralPrefix = "TK_"; language="Cpp"; } class miLexer
extends Lexer; options { k=2; exportVocab=Tiny; charVocabulary =
'\3'..'\377'; defaultErrorHandler = false; } tokens { "Grafo";
"Separator"; "PerspectiveCamera"; "position"; "orientation";
"Material"; "ambientColor"; "diffuseColor"; "specularColor";
"emissiveColor"; "shininess"; "rotation"; "translation"; "scale";
"Transform"; "Points"; "Line"; "Triangle"; "Cone"; "Cylinder";
"Sphere"; "SolidBox"; "SolidCone"; "SolidDodecahedron";
"SolidIcosahedron"; "SolidOctahedron"; "SolidThetrahedron";
"SolidTorus"; "WireBox"; "WireCone"; "WireCube"; "WireCylinder";
"WireDodecahedron"; "WireIcosahedron"; "WireOctahedron";
"WireThetrahedron"; "WireTorus"; "WireSphere"; "Polygon";
"bottomRadius"; "height"; "width"; "depth"; "radius";
"interiorRadius"; "exteriorRadius"; "Lighting"; "LightPosition";
"LightAmbient"; "LightSpecular"; "LightDiffuse"; "Texture" ; } WS_
: (' ' | '\t' | '\n' {newline();} | '\r') { _ttype =
antlr::Token::SKIP; } ; SL_COMMENT : "//" (~'\n')* '\n' { _ttype =
antlr::Token::SKIP; newline(); } ; DIAGONAL:'/' ; DIAGINV:'\\' ;
DIGITO:
( '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' ) ;
FLOTANTE: (GUION)? ( (DIGITO)+ PUNTO (DIGITO)+ ) ; GATO:'#' ; ENE:
'ñ' | 'Ñ' ; PUNTOYCOMA:';' ; DOSPUNTOS:':' ; GUION:'-' ; COMA: ','
; CORCHETEA:'[' ; CORCHETEC:']' ; PUNTO:'.' ; ABRIRPARENT:'(' ;
CERRARPARENT:')' ; CURLYR options { paraphrase = "llave cerrada"; }
: '}' ; CURLYL options { paraphrase = "llave abierta"; } : '{' ; ID
options { testLiterals = true; paraphrase = "an identifier"; } :
('a'..'z'|'A'..'Z') ('a'..'z'|'A'..'Z'|':'|'\\'|'_'|'.'|'0'..'9')*
;
-
Entorno de graficación y generación de modelos 2D y 3D para
aplicaciones de Visión Artificial Anexos
115
ANEXO H Definición de la clase Parser en la gramática de
GrafO3D Definición de la clase parser de la gramática de GrafO3D
generada bajo las especificaciones de ANTLR. header
"post_include_hpp" { #include #include #include # include
"CObjects.h" #include "PerspectiveCamera.hpp" #include "Light.hpp"
} header "post_include_cpp" { PerspectiveCamera*
miParser::Getcamera() { return vcamara; } Light*
miParser::Getlight() { return defluz; } } options { language =
"Cpp"; } class miParser extends Parser; options { k=2; genHashLines
= off; importVocab=Tiny; defaultErrorHandler = false; } { public:
vector CObjectsList; PerspectiveCamera* Getcamera(); Light*
Getlight(); private: Transform *vtransf; Material *vmat; Transform
*aux_transf; Material *aux_mat; PerspectiveCamera *vcamara;
CObjects *vobje; Light *defluz; int indexprimitivas; int band_mat;
int band_transf; } grafoFile: {vtransf = NULL;} encabezado
sentencias ; encabezado: GATO TK_Grafo ID ; sentencias: perspectiva
luz (objeto)* ; objeto: { String auxiliar; } TK_Separator { vobje =
new CObjects(); indexprimitivas = 0; band_mat = 0; band_transf = 0;
} a: ID { auxiliar = a->getText().c_str();
vobje->Setname(auxiliar); } CURLYL (sentencia)* {
CObjectsList.push_back(*vobje); } CURLYR ; sentencia: (transform)?
(material)? primitiva ; perspectiva: { String
auxiliar1,auxiliar2,auxiliar3,auxiliar4,auxiliar5,auxiliar6; }
TK_PerspectiveCamera { vcamara = new PerspectiveCamera();} i: ID {
auxiliar1 = i->getText().c_str();
vcamara->Setname(auxiliar1); } CURLYL TK_position a: FLOTANTE {
auxiliar1 = a->getText().c_str(); } b: FLOTANTE { auxiliar2 =
b->getText().c_str(); } c: FLOTANTE { auxiliar3 =
c->getText().c_str(); } TK_orientation d: FLOTANTE { auxiliar4 =
d->getText().c_str(); } e: FLOTANTE { auxiliar5 =
e->getText().c_str(); } f: FLOTANTE { auxiliar6 =
f->getText().c_str(); vcamara->PositionCamera
(StrToFloat(auxiliar1),StrToFloat(auxiliar2),StrToFloat(auxiliar3),0.0,0.5,5.0,StrToFloat(auxiliar4),StrToFloat(auxiliar5),StrToFloat(auxiliar6));
} CURLYR ; luz: { String
auxiliar1,auxiliar2,auxiliar3,auxiliar4,auxiliar5;} TK_Lighting {
defluz = new Light();} a: ID { auxiliar1 = a->getText().c_str();
defluz->Setname(auxiliar1); } CURLYL TK_LightPosition b:
FLOTANTE { auxiliar2 = b->getText().c_str(); } c: FLOTANTE {
auxiliar3 = c->getText().c_str(); } d: FLOTANTE {
-
Entorno de graficación y generación de modelos 2D y 3D para
aplicaciones de Visión Artificial Anexos
116
auxiliar4 = d->getText().c_str(); } e: FLOTANTE { auxiliar5 =
e->getText().c_str();
defluz->Setposition(StrToFloat(auxiliar2),StrToFloat(auxiliar3),StrToFloat(auxiliar4),StrToFloat(auxiliar5));
} TK_LightAmbient f: FLOTANTE { auxiliar2 =
f->getText().c_str(); } g: FLOTANTE { auxiliar3 =
g->getText().c_str(); } h: FLOTANTE { auxiliar4 =
h->getText().c_str(); } i: FLOTANTE { auxiliar5 =
i->getText().c_str();
defluz->Setambient(StrToFloat(auxiliar2),StrToFloat(auxiliar3),StrToFloat(auxiliar4),
StrToFloat(auxiliar5)); } TK_LightDiffuse j: FLOTANTE { auxiliar2 =
j->getText().c_str(); } k: FLOTANTE { auxiliar3 =
k->getText().c_str(); } l: FLOTANTE { auxiliar4 =
l->getText().c_str(); } m: FLOTANTE { auxiliar5 =
m->getText().c_str();
defluz->Setdiffuse(StrToFloat(auxiliar2),StrToFloat(auxiliar3),StrToFloat(auxiliar4),
StrToFloat(auxiliar5)); } TK_LightSpecular n: FLOTANTE { auxiliar2
= n->getText().c_str(); } o: FLOTANTE { auxiliar3 =
o->getText().c_str(); } p: FLOTANTE { auxiliar4 =
p->getText().c_str(); } q: FLOTANTE { auxiliar5 =
q->getText().c_str();
defluz->Setspecular(StrToFloat(auxiliar2),StrToFloat(auxiliar3),StrToFloat(auxiliar4),
StrToFloat(auxiliar5)); } CURLYR ; material: { String
auxiliar1,auxiliar2,auxiliar3,auxiliar4; } TK_Material { aux_mat =
new Material(); band_mat = 1;} o: ID { auxiliar1 =
o->getText().c_str(); aux_mat->Setname(auxiliar1); } CURLYL
TK_ambientColor a: FLOTANTE { auxiliar1 = a->getText().c_str();
} b: FLOTANTE { auxiliar2 = b->getText().c_str(); } c: FLOTANTE
{
auxiliar3 = c->getText().c_str(); } p: FLOTANTE { auxiliar4 =
p->getText().c_str();
aux_mat->SetambientColor(StrToFloat(auxiliar1),StrToFloat(auxiliar2),
StrToFloat(auxiliar3),StrToFloat(auxiliar4)); } TK_diffuseColor d:
FLOTANTE { auxiliar1 = d->getText().c_str(); } e: FLOTANTE {
auxiliar2 = e->getText().c_str(); } f: FLOTANTE { auxiliar3 =
f->getText().c_str(); } q: FLOTANTE { auxiliar4 =
q->getText().c_str();
aux_mat->SetdiffuseColor(StrToFloat(auxiliar1),StrToFloat(auxiliar2),
StrToFloat(auxiliar3),StrToFloat(auxiliar4)); } TK_specularColor g:
FLOTANTE { auxiliar1 = g->getText().c_str(); } h: FLOTANTE {
auxiliar2 = h->getText().c_str(); } i: FLOTANTE { auxiliar3 =
i->getText().c_str(); } r: FLOTANTE { auxiliar4 =
r->getText().c_str();
aux_mat->SetespecularColor(StrToFloat(auxiliar1),StrToFloat(auxiliar2),StrToFloat(auxiliar3),StrToFloat(auxiliar4));
} TK_emissiveColor j: FLOTANTE { auxiliar1 =
j->getText().c_str(); } k: FLOTANTE { auxiliar2 =
k->getText().c_str(); } l: FLOTANTE { auxiliar3 =
l->getText().c_str(); } s: FLOTANTE { auxiliar4 =
s->getText().c_str();
aux_mat->SetemissiveColor(StrToFloat(auxiliar1),StrToFloat(auxiliar2),
StrToFloat(auxiliar3),StrToFloat(auxiliar4)); } TK_shininess m:
FLOTANTE { auxiliar1 = m->getText().c_str();
aux_mat->Setshininess(StrToFloat(auxiliar1)); } (TK_Texture u:
ID { auxiliar1 = u->getText().c_str();
aux_mat->SetpathTexture(auxiliar1); })? CURLYR ; transform: {
String auxiliar; } TK_Transform { aux_transf = new Transform();
band_transf = 1; } a: ID { auxiliar = a->getText().c_str();
aux_transf->Setname(auxiliar); }
-
Entorno de graficación y generación de modelos 2D y 3D para
aplicaciones de Visión Artificial Anexos
117
CURLYL (translate)? (rotate)? (scalefactor)? CURLYR ; rotate: {
String auxiliar1, auxiliar2,auxiliar3; } TK_rotation b: FLOTANTE {
auxiliar1 = b->getText().c_str(); } c: FLOTANTE { auxiliar2 =
c->getText().c_str(); } d: FLOTANTE { auxiliar3 =
d->getText().c_str();
aux_transf->Setrotation(StrToFloat(auxiliar1),StrToFloat(auxiliar2),
StrToFloat(auxiliar3)); } ; translate: { String
auxiliar1,auxiliar2,auxiliar3; } TK_translation f: FLOTANTE {
auxiliar1 = f->getText().c_str(); } g: FLOTANTE { auxiliar2 =
g->getText().c_str(); } h: FLOTANTE { auxiliar3 =
h->getText().c_str();
aux_transf->Settranslation(StrToFloat(auxiliar1),StrToFloat(auxiliar2),StrToFloat(auxiliar3));
} ; scalefactor:TK_scale { String auxiliar1,auxiliar2,auxiliar3; }
i: FLOTANTE { auxiliar1 = i->getText().c_str(); } j: FLOTANTE {
auxiliar2 = j->getText().c_str(); } k: FLOTANTE { auxiliar3 =
k->getText().c_str();
aux_transf->SetscaleFactor(StrToFloat(auxiliar1),StrToFloat(auxiliar2),StrToFloat(auxiliar3));
} ; primitiva: ( point| line | triangle | cone | cylinder | sphere
| solidbox | soliddodecahedron | solidicosahedron |
solidoctahedron| solidthetrahedron | solidtorus| wirebox| wirecone|
wirecylinder| wiredodecahedron | wireicosahedron| wireoctahedron|
wirethetrahedron| wiretorus| wiresphere ) ; point : { GLfloat
auxx=0,auxy=0,auxz=0,auxi; String
auxiliar,auxiliar1,auxiliar2,auxiliar3; } TK_Points {
vobje->CreatePoints(); } g: ID { auxiliar =
g->getText().c_str();
vobje->nuevopunto->Points::Setname(auxiliar); if ( band_mat
!= 1 ) { aux_mat = new Material(); }
vobje->nuevopunto->Material::Setname(aux_mat->Getname());
vobje->nuevopunto->SetambientColor(aux_mat->GetambientColor(0),
aux_mat->GetambientColor(1),aux_mat->GetambientColor(2),
aux_mat->GetambientColor(3));
vobje->nuevopunto->SetdiffuseColor(aux_mat->GetdiffuseColor(0),
aux_mat->GetdiffuseColor(1),aux_mat->GetdiffuseColor(2),
aux_mat->GetdiffuseColor(3));
vobje->nuevopunto->SetespecularColor(aux_mat->GetespecularColor(0),
aux_mat->GetespecularColor(1),aux_mat->GetespecularColor(2),
aux_mat->GetespecularColor(3));
vobje->nuevopunto->SetemissiveColor(aux_mat->GetemissiveColor(0),
aux_mat->GetemissiveColor(1),aux_mat->GetemissiveColor(2),
aux_mat->GetemissiveColor(3));
vobje->nuevopunto->Setshininess(aux_mat->Getshininess());
vobje->nuevopunto->Settransparency(aux_mat->Gettransparency());
vobje->nuevopunto->SetpathTexture(aux_mat->GetpathTexture());
if ( band_transf != 1 ) { aux_transf = new Transform(); }
vobje->nuevopunto->Transform::Setname(aux_transf->Getname());
vobje->nuevopunto->Setrotation(aux_transf->Getrotation(0),
aux_transf->Getrotation(1),aux_transf->Getrotation(2));
vobje->nuevopunto->Settranslation(aux_transf->Gettranslation(0),
aux_transf->Gettranslation(1),aux_transf->Gettranslation(2));
vobje->nuevopunto->SetscaleFactor(aux_transf->GetscaleFactor(0),
aux_transf->GetscaleFactor(1),aux_transf->GetscaleFactor(2));
} CURLYL (sentencia)* ( a: FLOTANTE { auxiliar1 =
a->getText().c_str(); } b: FLOTANTE { auxiliar2 =
b->getText().c_str(); } c: FLOTANTE { auxiliar3 =
c->getText().c_str(); auxx = StrToFloat(auxiliar1); auxy =
StrToFloat(auxiliar2); auxz = StrToFloat(auxiliar3);
vobje->nuevopunto->Setpoints(auxx,auxy,auxz); } )+ CURLYR {
vobje->SavePointsList(); } ; line options { defaultErrorHandler
= true; } : { int auxi; String auxiliar; String auxiliar1; String
auxiliar2; String auxiliar3; } TK_Line { vobje->CreateLine(); if
( band_mat != 1 ) { aux_mat = new Material(); }
vobje->nuevalinea->Material::Setname(aux_mat->Getname());
vobje->nuevalinea->SetambientColor(aux_mat->GetambientColor(0),aux_mat->GetambientColor(1),aux_mat->GetambientColor(2),aux_mat->GetambientColor(3));
vobje->nuevalinea->SetdiffuseColor(aux_mat->GetdiffuseColor(0),aux_mat->GetdiffuseColor(1),aux_mat->GetdiffuseColor(2),aux_mat->GetdiffuseColor(3));
vobje->nuevalinea->SetespecularColor(aux_mat->GetespecularColor(0),aux_mat->GetespecularColor(1),aux_mat->GetespecularColor(2),aux_mat->GetespecularColor(3));
vobje->nuevalinea->SetemissiveColor(aux_mat->GetemissiveColor(0),aux_mat->GetemissiveColor(1),aux_mat->GetemissiveColor(2),aux_mat->GetemissiveColor(3));
vobje->nuevalinea->Setshininess(aux_mat->Getshininess());
vobje->nuevalinea->Settransparency(aux_mat->Gettransparency());
vobje->nuevalinea->SetpathTexture(aux_mat->GetpathTexture());
if ( band_transf != 1 ) { aux_transf = new Transform(); }
vobje->nuevalinea->Transform::Setname(aux_transf->Getname());
vobje->nuevalinea->Setrotation(aux_transf->Getrotation(0),aux_transf->Getrotation(1),aux_transf->Getrotation(2));
vobje->nuevalinea->Settranslation(aux_transf->Gettranslation(0),aux_transf->Gettranslation(1),aux_transf->Gettranslation(2));
vobje->nuevalinea->SetscaleFactor(aux_transf->GetscaleFactor(0),aux_transf->GetscaleFactor(1),aux_transf->GetscaleFactor(2));
}
-
Entorno de graficación y generación de modelos 2D y 3D para
aplicaciones de Visión Artificial Anexos
118
g: ID { auxiliar = g->getText().c_str();
vobje->nuevalinea->Line::Setname(auxiliar); } CURLYL
(sentencia)* a:FLOTANTE { auxiliar1 = a->getText().c_str(); }
b:FLOTANTE { auxiliar2 = b->getText().c_str(); } c:FLOTANTE {
auxiliar3 = c->getText().c_str();
vobje->nuevalinea->Setpoint1(StrToFloat(auxiliar1),StrToFloat(auxiliar2),StrToFloat(auxiliar3));
} d:FLOTANTE { auxiliar1 = d->getText().c_str(); } e:FLOTANTE {
auxiliar2 = e->getText().c_str(); } f:FLOTANTE { auxiliar3 =
f->getText().c_str();
vobje->nuevalinea->Setpoint2(StrToFloat(auxiliar1),StrToFloat(auxiliar2),StrToFloat(auxiliar3));
} CURLYR { vobje->SaveLineList(); } ; triangle: { int auxi;
String
auxiliar,auxiliar1,auxiliar2,auxiliar3,auxiliar4,auxiliar5,auxiliar6,auxiliar7,auxiliar8,auxiliar9;
} TK_Triangle { vobje->CreateTriangle(); if ( band_mat != 1 ) {
aux_mat = new Material(); }
vobje->nuevotriangulo->Material::Setname(aux_mat->Getname());
vobje->nuevotriangulo->SetambientColor(aux_mat->GetambientColor(0),aux_mat->GetambientColor(1),aux_mat->GetambientColor(2),aux_mat->GetambientColor(3));
vobje->nuevotriangulo->SetdiffuseColor(aux_mat->GetdiffuseColor(0),aux_mat->GetdiffuseColor(1),aux_mat->GetdiffuseColor(2),aux_mat->GetdiffuseColor(3));
vobje->nuevotriangulo->SetespecularColor(aux_mat->GetespecularColor(0),aux_mat->GetespecularColor(1),aux_mat->GetespecularColor(2),aux_mat->GetespecularColor(3));
vobje->nuevotriangulo->SetemissiveColor(aux_mat->GetemissiveColor(0),aux_mat->GetemissiveColor(1),aux_mat->GetemissiveColor(2),aux_mat->GetemissiveColor(3));
vobje->nuevotriangulo->Setshininess(aux_mat->Getshininess());
vobje->nuevotriangulo->Settransparency(aux_mat->Gettransparency());
vobje->nuevotriangulo->SetpathTexture(aux_mat->GetpathTexture());
if ( band_transf != 1 ) { aux_transf = new Transform(); }
vobje->nuevotriangulo->Transform::Setname(aux_transf->Getname());
vobje->nuevotriangulo->Setrotation(aux_transf->Getrotation(0),aux_transf->Getrotation(1),aux_transf->Getrotation(2));
vobje->nuevotriangulo->Settranslation(aux_transf->Gettranslation(0),aux_transf->Gettranslation(1),aux_transf->Gettranslation(2));
vobje->nuevotriangulo->SetscaleFactor(aux_transf->GetscaleFactor(0),aux_transf->GetscaleFactor(1),aux_transf->GetscaleFactor(2));
} j: ID { auxiliar = j->getText().c_str();
vobje->nuevotriangulo->Triangle::Setname(auxiliar); } CURLYL
(sentencia)* a: FLOTANTE { auxiliar1 = a->getText().c_str(); }
b: FLOTANTE { auxiliar2 = b->getText().c_str(); } c:
FLOTANTE
{ auxiliar3 = c->getText().c_str(); } d: FLOTANTE { auxiliar4
= d->getText().c_str(); } e: FLOTANTE { auxiliar5 =
e->getText().c_str(); } f: FLOTANTE { auxiliar6 =
f->getText().c_str();
vobje->nuevotriangulo->Setlinea1(StrToFloat(auxiliar1),StrToFloat(auxiliar2),StrToFloat(auxiliar3),StrToFloat(auxiliar4),StrToFloat(auxiliar5),StrToFloat(auxiliar6));
} g: FLOTANTE { auxiliar7 = g->getText().c_str(); } h: FLOTANTE
{ auxiliar8 = h->getText().c_str(); } i: FLOTANTE { auxiliar9 =
i->getText().c_str();
vobje->nuevotriangulo->Setlinea2(StrToFloat(auxiliar4),StrToFloat(auxiliar5),StrToFloat(auxiliar6),StrToFloat(auxiliar7),StrToFloat(auxiliar8),StrToFloat(auxiliar9));
vobje->nuevotriangulo->Setlinea3(StrToFloat(auxiliar1),StrToFloat(auxiliar2),StrToFloat(auxiliar3),StrToFloat(auxiliar7),StrToFloat(auxiliar8),StrToFloat(auxiliar9));
} CURLYR { vobje->SaveTriangleList(); } ; cone: { String
auxiliar; int auxi;} TK_Cone { vobje->CreateCone(); if (
band_mat != 1 ) { aux_mat = new Material(); }
vobje->nuevocil->Material::Setname(aux_mat->Getname());
vobje->nuevocil->SetambientColor(aux_mat->GetambientColor(0),aux_mat->GetambientColor(1),aux_mat->GetambientColor(2),aux_mat->GetambientColor(3));
vobje->nuevocil->SetdiffuseColor(aux_mat->GetdiffuseColor(0),aux_mat->GetdiffuseColor(1),aux_mat->GetdiffuseColor(2),aux_mat->GetdiffuseColor(3));
vobje->nuevocil->SetespecularColor(aux_mat->GetespecularColor(0),aux_mat->GetespecularColor(1),aux_mat->GetespecularColor(2),aux_mat->GetespecularColor(3));
vobje->nuevocil->SetemissiveColor(aux_mat->GetemissiveColor(0),aux_mat->GetemissiveColor(1),aux_mat->GetemissiveColor(2),aux_mat->GetemissiveColor(3));
vobje->nuevocil->Setshininess(aux_mat->Getshininess());
vobje->nuevocil->Settransparency(aux_mat->Gettransparency());
vobje->nuevocil->SetpathTexture(aux_mat->GetpathTexture());
if ( band_transf != 1 ) { aux_transf = new Transform(); }
vobje->nuevocil->Transform::Setname(aux_transf->Getname());
vobje->nuevocil->Setrotation(aux_transf->Getrotation(0),aux_transf->Getrotation(1),aux_transf->Getrotation(2));
vobje->nuevocil->Settranslation(aux_transf->Gettranslation(0),aux_transf->Gettranslation(1),aux_transf->Gettranslation(2));
vobje->nuevocil->SetscaleFactor(aux_transf->GetscaleFactor(0),aux_transf->GetscaleFactor(1),aux_transf->GetscaleFactor(2));
} c: ID { auxiliar = c->getText().c_str();
vobje->nuevocil->ABaseCyl::Setname(auxiliar); } CURLYL
(sentencia)* TK_bottomRadius a:FLOTANTE { auxiliar =
a->getText().c_str();
vobje->nuevocil->Setradius(StrToFloat(auxiliar));
-
Entorno de graficación y generación de modelos 2D y 3D para
aplicaciones de Visión Artificial Anexos
119
} TK_height b:FLOTANTE { auxiliar = b->getText().c_str();
vobje->nuevocil->Setheight(StrToFloat(auxiliar)); } CURLYR {
vobje->SaveConeList(); } ; cylinder: { int auxi; String
auxiliar; } TK_Cylinder { vobje->CreateCylinder(); if ( band_mat
!= 1 ) { aux_mat = new Material(); }
vobje->nuevocil->Material::Setname(aux_mat->Getname());
vobje->nuevocil->SetambientColor(aux_mat->GetambientColor(0),aux_mat->GetambientColor(1),aux_mat->GetambientColor(2),aux_mat->GetambientColor(3));
vobje->nuevocil->SetdiffuseColor(aux_mat->GetdiffuseColor(0),aux_mat->GetdiffuseColor(1),aux_mat->GetdiffuseColor(2),aux_mat->GetdiffuseColor(3));
vobje->nuevocil->SetespecularColor(aux_mat->GetespecularColor(0),aux_mat->GetespecularColor(1),aux_mat->GetespecularColor(2),aux_mat->GetespecularColor(3));
vobje->nuevocil->SetemissiveColor(aux_mat->GetemissiveColor(0),aux_mat->GetemissiveColor(1),aux_mat->GetemissiveColor(2),aux_mat->GetemissiveColor(3));
vobje->nuevocil->Setshininess(aux_mat->Getshininess());
vobje->nuevocil->Settransparency(aux_mat->Gettransparency());
vobje->nuevocil->SetpathTexture(aux_mat->GetpathTexture());
if ( band_transf != 1 ) { aux_transf = new Transform(); }
vobje->nuevocil->Transform::Setname(aux_transf->Getname());
vobje->nuevocil->Setrotation(aux_transf->Getrotation(0),aux_transf->Getrotation(1),aux_transf->Getrotation(2));
vobje->nuevocil->Settranslation(aux_transf->Gettranslation(0),aux_transf->Gettranslation(1),aux_transf->Gettranslation(2));
vobje->nuevocil->SetscaleFactor(aux_transf->GetscaleFactor(0),aux_transf->GetscaleFactor(1),aux_transf->GetscaleFactor(2));
} c: ID { auxiliar = c->getText().c_str();
vobje->nuevocil->ABaseCyl::Setname(auxiliar); } CURLYL
(sentencia)* TK_radius a: FLOTANTE { auxiliar =
a->getText().c_str();
vobje->nuevocil->Setradius(StrToFloat(auxiliar)); } TK_height
b :FLOTANTE { auxiliar = b->getText().c_str();
vobje->nuevocil->Setheight(StrToFloat(auxiliar)); } CURLYR {
vobje->SaveCylinderList(); } ; sphere: { int auxi; String
auxiliar; } TK_Sphere { vobje->CreateSphere(); if ( band_mat !=
1 ) { aux_mat = new Material(); }
vobje->nuevopoli->Material::Setname(aux_mat->Getname());
vobje->nuevopoli->SetambientColor(aux_mat->GetambientColor(0),aux_mat->GetambientColor(1),aux_mat->GetambientColor(2),aux_mat->GetambientColor(3));
vobje->nuevopoli->SetdiffuseColor(aux_mat->GetdiffuseColor(0),aux_mat->GetdiffuseColor(1),aux_mat->GetdiffuseColor(2),aux_mat->GetdiffuseColor(3));
vobje->nuevopoli->SetespecularColor(aux_mat->GetespecularColor(0),aux_mat->GetespecularColor(1),aux_mat->GetespecularColor(2),aux_mat->GetespecularColor(3));
vobje->nuevopoli->SetemissiveColor(aux_mat->GetemissiveColor(0),aux_mat->GetemissiveColor(1),aux_mat->GetemissiveColor(2),aux_mat->GetemissiveColor(3));
vobje->nuevopoli->Setshininess(aux_mat->Getshininess());
vobje->nuevopoli->Settransparency(aux_mat->Gettransparency());
vobje->nuevopoli->SetpathTexture(aux_mat->GetpathTexture());
if ( band_transf != 1 ) { aux_transf = new Transform(); }
vobje->nuevopoli->Transform::Setname(aux_transf->Getname());
vobje->nuevopoli->Setrotation(aux_transf->Getrotation(0),aux_transf->Getrotation(1),aux_transf->Getrotation(2));
vobje->nuevopoli->Settranslation(aux_transf->Gettranslation(0),aux_transf->Gettranslation(1),aux_transf->Gettranslation(2));
vobje->nuevopoli->SetscaleFactor(aux_transf->GetscaleFactor(0),aux_transf->GetscaleFactor(1),aux_transf->GetscaleFactor(2));
} c: ID { auxiliar = c->getText().c_str();
vobje->nuevopoli->APolyhedron::Setname(auxiliar); } CURLYL
(sentencia)* TK_radius a: FLOTANTE { auxiliar =
a->getText().c_str();
vobje->nuevopoli->Setradius(StrToFloat(auxiliar)); } CURLYR {
vobje->SaveSphereList(); } ; solidbox: { int auxi; String
auxiliar; } TK_SolidBox { vobje->CreateSBox(); if ( band_mat !=
1 ) { aux_mat = new Material(); }
vobje->nuevocuad->Material::Setname(aux_mat->Getname());
vobje->nuevocuad->SetambientColor(aux_mat->GetambientColor(0),aux_mat->GetambientColor(1),aux_mat->GetambientColor(2),aux_mat->GetambientColor(3));
vobje->nuevocuad->SetdiffuseColor(aux_mat->GetdiffuseColor(0),aux_mat->GetdiffuseColor(1),aux_mat->GetdiffuseColor(2),aux_mat->GetdiffuseColor(3));
vobje->nuevocuad->SetespecularColor(aux_mat->GetespecularColor(0),aux_mat->GetespecularColor(1),aux_mat->GetespecularColor(2),aux_mat->GetespecularColor(3));
vobje->nuevocuad->SetemissiveColor(aux_mat->GetemissiveColor(0),aux_mat->GetemissiveColor(1),aux_mat->GetemissiveColor(2),aux_mat->GetemissiveColor(3));
vobje->nuevocuad->Setshininess(aux_mat->Getshininess());
vobje->nuevocuad->Settransparency(aux_mat->Gettransparency());
vobje->nuevocuad->SetpathTexture(aux_mat->GetpathTexture());
if ( band_transf != 1 ) { aux_transf = new Transform(); }
vobje->nuevocuad->Material::Setname(aux_transf->Getname());
vobje->nuevocuad->Setrotation(aux_transf->Getrotation(0),aux_transf->Getrotation(1),aux_transf->Getrotation(2));
vobje->nuevocuad->Settranslation(aux_transf->Gettranslation(0),aux_transf->Gettranslation(1),aux_transf->Gettranslation(2));
vobje->nuevocuad->SetscaleFactor(aux_transf->GetscaleFactor(0),aux_transf->GetscaleFactor(1),aux_transf->GetscaleFactor(2));
} d: ID { auxiliar = d->getText().c_str();
vobje->nuevocuad->AQuad::Setname(auxiliar); } CURLYL
(sentencia)* TK_width a: FLOTANTE { auxiliar =
a->getText().c_str();
vobje->nuevocuad->Setwidth(StrToFloat(auxiliar)); } TK_height
b: FLOTANTE { auxiliar = b->getText().c_str();
vobje->nuevocuad->Setheight(StrToFloat(auxiliar)); } TK_depth
c: FLOTANTE {
-
Entorno de graficación y generación de modelos 2D y 3D para
aplicaciones de Visión Artificial Anexos
120
auxiliar = c->getText().c_str();
vobje->nuevocuad->Setdepth(StrToFloat(auxiliar)); } CURLYR {
vobje->SaveSBoxList(); } ; soliddodecahedron: { int auxi; String
auxiliar; } TK_SolidDodecahedron { vobje->CreateSDod(); if (
band_mat != 1 ) { aux_mat = new Material(); }
vobje->nuevopoli->Material::Setname(aux_mat->Getname());
vobje->nuevopoli->SetambientColor(aux_mat->GetambientColor(0),aux_mat->GetambientColor(1),aux_mat->GetambientColor(2),aux_mat->GetambientColor(3));
vobje->nuevopoli->SetdiffuseColor(aux_mat->GetdiffuseColor(0),aux_mat->GetdiffuseColor(1),aux_mat->GetdiffuseColor(2),aux_mat->GetdiffuseColor(3));
vobje->nuevopoli->SetespecularColor(aux_mat->GetespecularColor(0),aux_mat->GetespecularColor(1),aux_mat->GetespecularColor(2),aux_mat->GetespecularColor(3));
vobje->nuevopoli->SetemissiveColor(aux_mat->GetemissiveColor(0),aux_mat->GetemissiveColor(1),aux_mat->GetemissiveColor(2),aux_mat->GetemissiveColor(3));
vobje->nuevopoli->Setshininess(aux_mat->Getshininess());
vobje->nuevopoli->Settransparency(aux_mat->Gettransparency());
vobje->nuevopoli->SetpathTexture(aux_mat->GetpathTexture());
if ( band_transf != 1 ) { aux_transf = new Transform(); }
vobje->nuevopoli->Transform::Setname(aux_transf->Getname());
vobje->nuevopoli->Setrotation(aux_transf->Getrotation(0),aux_transf->Getrotation(1),aux_transf->Getrotation(2));
vobje->nuevopoli->Settranslation(aux_transf->Gettranslation(0),aux_transf->Gettranslation(1),aux_transf->Gettranslation(2));
vobje->nuevopoli->SetscaleFactor(aux_transf->GetscaleFactor(0),aux_transf->GetscaleFactor(1),aux_transf->GetscaleFactor(2));
} c: ID { auxiliar = c->getText().c_str();
vobje->nuevopoli->APolyhedron::Setname(auxiliar); } CURLYL
(sentencia)* TK_radius a: FLOTANTE { auxiliar =
a->getText().c_str();
vobje->nuevopoli->Setradius(StrToFloat(auxiliar)); } CURLYR {
vobje->SaveSDodList(); } ; solidicosahedron: { int auxi; String
auxiliar; } TK_SolidIcosahedron { vobje->CreateSIco(); if (
band_mat != 1 ) { aux_mat = new Material(); }
vobje->nuevopoli->Material::Setname(aux_mat->Getname());
vobje->nuevopoli->SetambientColor(aux_mat->GetambientColor(0),aux_mat->GetambientColor(1),aux_mat->GetambientColor(2),aux_mat->GetambientColor(3));
vobje->nuevopoli->SetdiffuseColor(aux_mat->GetdiffuseColor(0),aux_mat->GetdiffuseColor(1),aux_mat->GetdiffuseColor(2),aux_mat->GetdiffuseColor(3));
vobje->nuevopoli->SetespecularColor(aux_mat->GetespecularColor(0),aux_mat->GetespecularColor(1),aux_mat->GetespecularColor(2),aux_mat->GetespecularColor(3));
vobje->nuevopoli->SetemissiveColor(aux_mat->GetemissiveColor(0),aux_mat->GetemissiveColor(1),aux_mat->GetemissiveColor(2),aux_mat->GetemissiveColor(3));
vobje->nuevopoli->Setshininess(aux_mat->Getshininess());
vobje->nuevopoli->Settransparency(aux_mat->Gettransparency());
vobje->nuevopoli->SetpathTexture(aux_mat->GetpathTexture());
if ( band_transf != 1 ) { aux_transf = new Transform(); }
vobje->nuevopoli->Transform::Setname(aux_transf->Getname());
vobje->nuevopoli->Setrotation(aux_transf->Getrotation(0),aux_transf->Getrotation(1),aux_transf->Getrotation(2));
vobje->nuevopoli->Settranslation(aux_transf->Gettranslation(0),aux_transf->Gettranslation(1),aux_transf->Gettranslation(2));
vobje->nuevopoli->SetscaleFactor(aux_transf->GetscaleFactor(0),aux_transf->GetscaleFactor(1),aux_transf->GetscaleFactor(2));
} c: ID { auxiliar = c->getText().c_str();
vobje->nuevopoli->APolyhedron::Setname(auxiliar); } CURLYL
(sentencia)* TK_radius a: FLOTANTE { auxiliar =
a->getText().c_str();
vobje->nuevopoli->Setradius(StrToFloat(auxiliar)); } CURLYR {
vobje->SaveSIcoList(); } ; solidoctahedron: { int auxi; String
auxiliar; } TK_SolidOctahedron { vobje->CreateSOct(); if (
band_mat != 1 ) { aux_mat = new Material(); }
vobje->nuevopoli->Material::Setname(aux_mat->Getname());
vobje->nuevopoli->SetambientColor(aux_mat->GetambientColor(0),aux_mat->GetambientColor(1),aux_mat->GetambientColor(2),aux_mat->GetambientColor(3));
vobje->nuevopoli->SetdiffuseColor(aux_mat->GetdiffuseColor(0),aux_mat->GetdiffuseColor(1),aux_mat->GetdiffuseColor(2),aux_mat->GetdiffuseColor(3));
vobje->nuevopoli->SetespecularColor(aux_mat->GetespecularColor(0),aux_mat->GetespecularColor(1),aux_mat->GetespecularColor(2),aux_mat->GetespecularColor(3));
vobje->nuevopoli->SetemissiveColor(aux_mat->GetemissiveColor(0),aux_mat->GetemissiveColor(1),aux_mat->GetemissiveColor(2),aux_mat->GetemissiveColor(3));
vobje->nuevopoli->Setshininess(aux_mat->Getshininess());
vobje->nuevopoli->Settransparency(aux_mat->Gettransparency());
vobje->nuevopoli->SetpathTexture(aux_mat->GetpathTexture());
if ( band_transf != 1 ) { aux_transf = new Transform(); }
vobje->nuevopoli->Transform::Setname(aux_transf->Getname());
vobje->nuevopoli->Setrotation(aux_transf->Getrotation(0),aux_transf->Getrotation(1),aux_transf->Getrotation(2));
vobje->nuevopoli->Settranslation(aux_transf->Gettranslation(0),aux_transf->Gettranslation(1),aux_transf->Gettranslation(2));
vobje->nuevopoli->SetscaleFactor(aux_transf->GetscaleFactor(0),aux_transf->GetscaleFactor(1),aux_transf->GetscaleFactor(2));
} c: ID { auxiliar = c->getText().c_str();
vobje->nuevopoli->APolyhedron::Setname(auxiliar); } CURLYL
(sentencia)* TK_radius a: FLOTANTE { auxiliar =
a->getText().c_str();
vobje->nuevopoli->Setradius(StrToFloat(auxiliar)); } CURLYR {
vobje->SaveSOctList(); } ; solidthetrahedron: { int auxi; String
auxiliar; } TK_SolidThetrahedron { vobje->CreateSThe(); if (
band_mat != 1 ) { aux_mat = new Material(); }
vobje->nuevopoli->Material::Setname(aux_mat->Getname());
vobje->nuevopoli->SetambientColor(aux_mat->GetambientColor(0),aux_mat->GetambientColor(1),aux_mat->GetambientColor(2),aux_mat->GetambientColor(3));
vobje->nuevopoli->SetdiffuseColor(aux_mat->GetdiffuseColor(0),aux_mat->GetdiffuseColor(1),aux_mat->GetdiffuseColor(2),aux_mat->GetdiffuseColor(3));
-
Entorno de graficación y generación de modelos 2D y 3D para
aplicaciones de Visión Artificial Anexos
121
vobje->nuevopoli->SetespecularColor(aux_mat->GetespecularColor(0),aux_mat->GetespecularColor(1),aux_mat->GetespecularColor(2),aux_mat->GetespecularColor(3));
vobje->nuevopoli->SetemissiveColor(aux_mat->GetemissiveColor(0),aux_mat->GetemissiveColor(1),aux_mat->GetemissiveColor(2),aux_mat->GetemissiveColor(3));
vobje->nuevopoli->Setshininess(aux_mat->Getshininess());
vobje->nuevopoli->Settransparency(aux_mat->Gettransparency());
vobje->nuevopoli->SetpathTexture(aux_mat->GetpathTexture());
if ( band_transf != 1 ) { aux_transf = new Transform(); }
vobje->nuevopoli->Transform::Setname(aux_transf->Getname());
vobje->nuevopoli->Setrotation(aux_transf->Getrotation(0),aux_transf->Getrotation(1),aux_transf->Getrotation(2));
vobje->nuevopoli->Settranslation(aux_transf->Gettranslation(0),aux_transf->Gettranslation(1),aux_transf->Gettranslation(2));
vobje->nuevopoli->SetscaleFactor(aux_transf->GetscaleFactor(0),aux_transf->GetscaleFactor(1),aux_transf->GetscaleFactor(2));
} c: ID { auxiliar = c->getText().c_str();
vobje->nuevopoli->APolyhedron::Setname(auxiliar); } CURLYL
(sentencia)* TK_radius a: FLOTANTE { auxiliar =
a->getText().c_str();
vobje->nuevopoli->Setradius(StrToFloat(auxiliar)); } CURLYR {
vobje->SaveSTheList(); } ; solidtorus: { int auxi; String
auxiliar; } TK_SolidTorus { vobje->CreateSTorus(); if ( band_mat
!= 1 ) { aux_mat = new Material(); }
vobje->nuevotorus->Material::Setname(aux_mat->Getname());
vobje->nuevotorus->SetambientColor(aux_mat->GetambientColor(0),aux_mat->GetambientColor(1),aux_mat->GetambientColor(2),aux_mat->GetambientColor(3));
vobje->nuevotorus->SetdiffuseColor(aux_mat->GetdiffuseColor(0),aux_mat->GetdiffuseColor(1),aux_mat->GetdiffuseColor(2),aux_mat->GetdiffuseColor(3));
vobje->nuevotorus->SetespecularColor(aux_mat->GetespecularColor(0),aux_mat->GetespecularColor(1),aux_mat->GetespecularColor(2),aux_mat->GetespecularColor(3));
vobje->nuevotorus->SetemissiveColor(aux_mat->GetemissiveColor(0),aux_mat->GetemissiveColor(1),aux_mat->GetemissiveColor(2),aux_mat->GetemissiveColor(3));
vobje->nuevotorus->Setshininess(aux_mat->Getshininess());
vobje->nuevotorus->Settransparency(aux_mat->Gettransparency());
vobje->nuevotorus->SetpathTexture(aux_mat->GetpathTexture());
if ( band_transf != 1 ) { aux_transf = new Transform(); }
vobje->nuevotorus->Transform::Setname(aux_transf->Getname());
vobje->nuevotorus->Setrotation(aux_transf->Getrotation(0),aux_transf->Getrotation(1),aux_transf->Getrotation(2));
vobje->nuevotorus->Settranslation(aux_transf->Gettranslation(0),aux_transf->Gettranslation(1),aux_transf->Gettranslation(2));
vobje->nuevotorus->SetscaleFactor(aux_transf->GetscaleFactor(0),aux_transf->GetscaleFactor(1),aux_transf->GetscaleFactor(2));
} c: ID { auxiliar = c->getText().c_str();
vobje->nuevotorus->ATorus::Setname(auxiliar); } CURLYL
(sentencia)* TK_interiorRadius a: FLOTANTE { auxiliar =
a->getText().c_str();
vobje->nuevotorus->SetinteriorRadius(StrToFloat(auxiliar)); }
TK_exteriorRadius b: FLOTANTE { auxiliar = b->getText().c_str();
vobje->nuevotorus->SetexteriorRadius(StrToFloat(auxiliar));
}
CURLYR { vobje->SaveSTorusList(); } ; wirebox: { String
auxiliar; } TK_WireBox { vobje->CreateWBox(); if ( band_mat != 1
) { aux_mat = new Material(); }
vobje->nuevocuad->Material::Setname(aux_mat->Getname());
vobje->nuevocuad->SetambientColor(aux_mat->GetambientColor(0),aux_mat->GetambientColor(1),aux_mat->GetambientColor(2),aux_mat->GetambientColor(3));
vobje->nuevocuad->SetdiffuseColor(aux_mat->GetdiffuseColor(0),aux_mat->GetdiffuseColor(1),aux_mat->GetdiffuseColor(2),aux_mat->GetdiffuseColor(3));
vobje->nuevocuad->SetespecularColor(aux_mat->GetespecularColor(0),aux_mat->GetespecularColor(1),aux_mat->GetespecularColor(2),aux_mat->GetespecularColor(3));
vobje->nuevocuad->SetemissiveColor(aux_mat->GetemissiveColor(0),aux_mat->GetemissiveColor(1),aux_mat->GetemissiveColor(2),aux_mat->GetemissiveColor(3));
vobje->nuevocuad->Setshininess(aux_mat->Getshininess());
vobje->nuevocuad->Settransparency(aux_mat->Gettransparency());
vobje->nuevocuad->SetpathTexture(aux_mat->GetpathTexture());
if ( band_transf != 1 ) { aux_transf = new Transform(); }
vobje->nuevocuad->Transform::Setname(aux_transf->Getname());
vobje->nuevocuad->Setrotation(aux_transf->Getrotation(0),aux_transf->Getrotation(1),aux_transf->Getrotation(2));
vobje->nuevocuad->Settranslation(aux_transf->Gettranslation(0),aux_transf->Gettranslation(1),aux_transf->Gettranslation(2));
vobje->nuevocuad->SetscaleFactor(aux_transf->GetscaleFactor(0),aux_transf->GetscaleFactor(1),aux_transf->GetscaleFactor(2));
} d: ID { auxiliar = d->getText().c_str();
vobje->nuevocuad->AQuad::Setname(auxiliar); } CURLYL
(sentencia)* TK_width a: FLOTANTE { auxiliar =
a->getText().c_str();
vobje->nuevocuad->Setwidth(StrToFloat(auxiliar)); } TK_height
b: FLOTANTE { auxiliar = b->getText().c_str();
vobje->nuevocuad->Setheight(StrToFloat(auxiliar)); } TK_depth
c: FLOTANTE { auxiliar = c->getText().c_str();
vobje->nuevocuad->Setdepth(StrToFloat(auxiliar)); } CURLYR {
vobje->SaveWBoxList(); } ; wirecone: { String auxiliar; }
TK_WireCone { vobje->CreateWCone(); if ( band_mat != 1 ) {
aux_mat = new Material(); }
vobje->nuevocil->Material::Setname(aux_mat->Getname());
vobje->nuevocil->SetambientColor(aux_mat->GetambientColor(0),aux_mat->GetambientColor(1),aux_mat->GetambientColor(2),aux_mat->GetambientColor(3));
vobje->nuevocil->SetdiffuseColor(aux_mat->GetdiffuseColor(0),aux_mat->GetdiffuseColor(1),aux_mat->GetdiffuseColor(2),aux_mat->GetdiffuseColor(3));
vobje->nuevocil->SetespecularColor(aux_mat->GetespecularColor(0),aux_mat->GetespecularColor(1),aux_mat->GetespecularColor(2),aux_mat->GetespecularColor(3));
vobje->nuevocil->SetemissiveColor(aux_mat->GetemissiveColor(0),aux_mat->GetemissiveColor(1),aux_mat->GetemissiveColor(2),aux_mat->GetemissiveColor(3));
vobje->nuevocil->Setshininess(aux_mat->Getshininess());
-
Entorno de graficación y generación de modelos 2D y 3D para
aplicaciones de Visión Artificial Anexos
122
vobje->nuevocil-