• No se han encontrado resultados

OpenGL en dispositivos móviles

N/A
N/A
Protected

Academic year: 2020

Share "OpenGL en dispositivos móviles"

Copied!
93
0
0

Texto completo

(1)Documento Final de Tesis. Entrega Final de Ciclo Terminal II OpenGL en Dispositivos Móviles. Presentado por: Carlos Eduardo Oviedo. Presentado a: Harold Cruz. Facultad de Ingeniería Departamento de Sistemas y Computación Universidad de los Andes Bogotá, Febrero 04 de 2005.

(2) AGRADECIMIENTOS. Harold Cruz Ingeniería de Sistemas, Universidad de los Andes. Director de tesis. A la mi director de tesis por su apoyo incondicional y la oportunidad brindada para la realización de este trabajo..

(3) LISTA DE FIGURAS Pág. Figura 1.. Rotación en 2 dimensiones (pivote en el origen). 26. Figura 2.. Rotación en 2 dimensiones (pivote arbitrario). 27. Figura 3.. Proyección en paralela. 34. Figura 4.. Proyección en perspectiva. 35. Figura 5.. Instalación SuperWaba en POSE (Pantalla 1). 39. Figura 6.. Instalación SuperWaba en POSE (Pantalla 2). 39. Figura 7.. Instalación SuperWaba en POSE (Pantalla 3). 39. Figura 8.. Instalación de aplicaciones en POSE. 40. Figura 9.. Instalación SuperWaba en PC. 42. Figura 10.. GuiBuilder Instalado (Pantalla 1). 46. Figura 11.. GuiBuilder Instalado (Pantalla 2). 46. Figura 12.. Deshabilitando opciones POSE. 48. Figura 13.. Estructura de directorios del Proyecto. 53. Figura 14.. Diagrama de Paquetes. 61. Figura 15.. Diagrama del paquete GL. 62. Figura 16.. Diagrama del paquete SYS. 64. Figura 17.. Diagrama del paquete UTIL. 66. Figura 18.. Diagrama del paquete TESTS. 68. Figura 19-21. Instalación MobileGL sobre POSE. 71. Figura 22.. Modelo Jerárquico. 72. Figura 23.. Imagen del Robot. 73. Figura 24.. Estructura de directorios del proyecto. 74. Figura 25.. Diagrama de clases Caso de Estudio. 79. Figura 26.. Instalación MobileGL (Pantalla 1). 81. Figura 27.. Instalación MobileGL (Pantalla 2). 81. Figura 28-32. Demo MobileGL. 82. Figura 33.. 83. Demo MobileGL con OpenGL.

(4) Tabla de contenido. I. Introducción. 3. II. Objetivo. 5. III. Alcance. 6. IV. Estado del Arte. 8. 1. MiniGL. 8. 2. TinyGL. 9. 3. Pocket GL. 10. 4. OpenGL ES. 10. V. Marco Teórico. 11. 1. OpenGL. 11. 1.1.. Estructura de un Programa en OpenGL. 12. 1.2.. Sintaxis de los Comandos/Constantes OpenGL. 12. 1.3.. OpenGL como una Máquina de Estados. 14. 1.4.. Animación en OpenGL. 18. 1.5.. Operaciones Básicas de OpenGL. 18. 1.6.. Transformaciones en OpenGL. 21. 2. Conceptos Gráficos. 24. 2.1.. Traslación. 25. 2.2.. Rotación. 26. 2.3.. Escalamiento. 28. 2.4.. Representación de Matriz y Coordenadas Homogéneas 29. 2.5.. Transformaciones Geométricas Tridimensionales. 31. 2.6.. Métodos de Despliegue Tridimensional. 33. 3. SuperWaba. 37. 3.1.. Instalación en Dispositivos Palm OS. 38. 3.2.. Instalación en Windows CE/Pocket PC. 40. 3.3.. Instalación en Computadores de Escritorio. 42. 1.

(5) 3.4.. Prueba de Instalación de SuperWaba. 44. 3.5.. Desarrollo de una Aplicación en SuperWaba. 46. 3.6.. Warp y ExeGen. 48. 3.7.. IDEs y SuperWaba. 50. VI. MobileGL. 52. 1. Estructura de Directorios del Proyecto. 52. 2. Funciones Implementadas. 54. 3. Diagrama de Clases de la Librería. 61. 3.1.. Diagrama de Paquetes. 61. 3.2.. Diagrama del Paquete GL. 62. 3.3.. Diagrama del Paquete SYS. 64. 3.4.. Diagrama del Paquete UTIL. 65. 3.5.. Diagrama del Paquete TESTS. 67. 4. Compilación y Ejecución. 69. 5. Instalación. 70. VII. Caso de Estudio. 72. 1. Descripción del Modelo Jerárquico a Implementar. 72. 2. Estructura de directorios del Caso de Estudio. 74. 3. Funciones Implementadas. 75. 4. Diagrama de Clases del Caso de Estudio. 78. 5. Compilación y Ejecución. 80. 6. Instalación. 81. VIII. A Futuro IX. Conclusiones X. Glosario XI. Referencias. 84 86 87 88. 2.

(6) I. Introducción. Son doce años los que consolidan OpenGL como el ambiente de preferencia para el desarrollo de aplicaciones gráficas en dos y tres dimensiones. Pero OpenGL es más que un ambiente de desarrollo; es una interfaz de programación de aplicaciones (API por sus siglas en inglés) adoptada actualmente por la mayoría de la industria. Las facilidades que ofrece para el desarrollo de aplicaciones altamente portables convierten a OpenGL en una especificación irresistible de implementar tanto para fabricantes de hardware como para desarrolladores de software. Pero las ventajas que ofrece OpenGL son muchas además de la anteriormente presentada; para los desarrolladores, un conjunto extenso de complejas funciones de visualización agilizan la labor de construcción del software, facilitando la codificación de un gran número de tareas. Esto a su ve z reduce el tiempo que tarda el producto en entrar al mercado, lo que beneficia de igual manera al usuario final. El usuario también se ve beneficiado al recibir un software con gráficos más reales e interfaces de usuario más amigables y completas. Tal vez una de las limitantes más graves que tiene OpenGL es la dependencia a un hardware especial que soporte muchas de las funciones que ofrece. A pesar de que este tipo de hardware es incorporado desde varios años ya a los equipos tradicionales y que usualmente manejamos (computadores de escritorio para ser más precisos), hay una nueva generación de dispositivos que progresivamente se han ido apoderando del mercado y que no poseen el hardware necesario para tomar ventaja de las facilidades que ofrece OpenGL. Los beneficios recibidos por los usuarios desde la aparición de la tecnología móvil son incontables; comunicación prácticamente ilimitada entre usuarios de la tecnología, información cada vez más disponible (sin importar el lugar de ubicación de la persona), y la facilidad que ofrecen estos dispositivos para el desarrollo de tareas que normalmente se realizan en equipos ligados a un escritorio son algunos de ellos. Pero estos dispositivos móviles están lejos de ser perfectos; una menor capacidad de procesamiento de información, menor cantidad de memoria disponible y menor resolución de pantalla son algunas de las falencias que hacen casi imposible que estos equipos ofrezcan la misma calidad de gráficos que los dispositivos de escritorio. Lo que se propone en el presente trabajo es la integración de dos elementos altamente útiles y populares para lograr un producto novedoso y de alta calidad; la llegada de OpenGL al mundo móvil abrirá las puertas a una nueva generación de aplicaciones compatibles con este tipo de dispositivos. La. 3.

(7) utilidad que alcanzarían estos equipos sería inmensamente superior a la que actualmente poseen, así como la productividad de las personas que hacen uso de los mismos. En secciones siguientes se analizarán algunas alternativas consideradas para el desarrollo del proyecto, presentando posteriormente aquella que ofrece los mayores beneficios. Se presentarán las herramientas utilizadas y una descripción detallada del procesó seguido. Se concluirá con el listado de resultados obtenidos y conclusiones del trabajo.. 4.

(8) II. Objetivo. El objetivo principal de este trabajo es la integración de OpenGL al mundo móvil, particularmente a las asistentes personales digitales o PDA (por sus siglas en inglés). Es claro que el hardware de este tipo de equipos es ciento por ciento diferente a aquel presente en un computador de escritorio, por lo que la manera a seguir para lograr el objetivo es a través de software; siendo OpenGL una interfaz de software para un hardware de gráficas, el trabajo propuesto en este documento tiende a seguir el mismo lineamiento. La librería gráfica móvil propuesta consta de una serie de interfaces, diferenciándose de OpenGL en que estas interfaces trabajan sobre una capa de software, no hardware. El software sobre el cuál trabajan estas interfaces es conocido como SuperWaba, y brevemente puede ser reducido como una máquina virtual (similar a las máquinas virtuales para Java) dirigida principalmente a dispositivos móviles de tipo PDA. Hay que hacer la salvedad de que es posible instalar SuperWaba en un computador de escritorio, pero esto se debe ver solo como una manera de facilitar el desarrollo y depuración de aplicaciones móviles basadas en este software. Tanto OpenGL como SuperWaba tienen una sección dentro del documento dedicada exclusivamente a su profundización y detalle, ya que ambas juegan un papel fundamental en la elaboración del presente trabajo. Es necesario entender como funciona OpenGL debido a que la librería gráfica móvil trata de simular en lo posible tanto las funciones que ofrece como su modo de operar. Por su parte, sin unas buenas bases en SuperWaba difícilmente se podrá apreciar en su plenitud el trabajo presentado a continuación.. 5.

(9) III. Alcance. El extenso número de funciones y operaciones permitidas por OpenGL es proporcional al grado de complejidad del proyecto. El ideal sin ninguna duda sería el de migrar toda la interfaz a los dispositivos móviles, algo que se podría conseguir si se contara con varios años de trabajo y un número mayor de personas involucradas en el proyecto. Desafortunadamente este no es el caso del presente trabajo, por lo que es de suma necesidad el acotar el alcance del mismo para asegurar que su desenlace arroje unos resultados concretos y satisfactorios. La metodología de desarrollo más apropiada para un tipo de proyecto como el que se especifica en el presente documento es la de desarrollo por etapas o desarrollo en espiral; es una técnica común en el mundo de la ingeniería de software y consiste en dividir el proyecto en varias fases, cada una con unos objetivos claros y concretos. Después de cada fase se realizan las pruebas necesarias y se elabora un postmortem que describe el proceso de desarrollo durante la fase, detallando aquellas tareas exitosas y puntualizando en los errores que pudieron haber impedido la obtención de todos los objetivos pactados para la etapa. Para este proyecto el gran objetivo es el desarrollo de una librería gráfica móvil que simule en su totalidad a OpenGL (tanto en funciones ofrecidas como en su modo de operar). Teniendo en cuenta que nada más el número de funciones que ofrece esta interfaz es del orden de 1 120 , y que la complejidad de la mayoría de estas es bastante elevada, el plan a seguir es el de categorizar las funciones y separar su implementación y migración en distintas etapas de desarrollo. La primera etapa del proyecto es la que se propone desarrollar en el presente trabajo. Las funciones a las que se le ha dado prioridad inicialmente son aquellas que tienen que ver con las transformaciones de modelo-vista. Este es un concepto que será tratado en la sección dedicada a OpenGL, pero que por ahora puede entenderse como un conjunto de operaciones que determinan la ubicación y forma de los objetos que componen la escena. El total de funciones a implementar entonces suman catorce, y son listadas a continuación para dar al lector una breve idea de lo que es OpenGL y lo que será la librería gráfica móvil a implementar: •. glBegin. 1. Tomado de: Chapter 1 - OpenGL Programming Guide (Addison-Wesley Publishing Company) http://rush3d.com/reference/opengl-redbook-1.1/chapt er01.html. 6.

(10) • • • • • • • • • • • • •. glEnd glClear glClearColor glGetFloatv glGetError glVertex3f glFlush glColor3f glPolygonMode glRotatef glTranslatef glPushMatrix glPopMatrix. La siguiente etapa podría dedicarse a la incorporación de funciones relacionadas con las transformaciones de proyección, estas no son un grupo tan numeroso de operaciones pero la complejidad que implican amerita su separación en otra fase distinta. Esta y las siguientes etapas bien pueden convertirse en tema para futuros trabajos de grado; de esta manera continuamente se estaría robusteciendo la librería, acercándose cada vez al objetivo principal que es el de lograr migrar OpenGL al mundo móvil.. 7.

(11) IV. Estado del Arte. En esta sección se presentará lo que a la fecha existe en cuanto a trabajos relacionados con el área gráfica en dispositivos móviles. Se concentrarán esfuerzos en el detalle de aquellos proyectos directamente orientados al desarrollo de librerías gráficas sobre este tipo de equipos. Vale la pena anotar que el número de proyectos encontrados no es muy grande. El listado de estos es presentado a continuación: • • • •. MiniGL TinyGL Pocket GL OpenGL ES. 1. MiniGL Es una librería que pretende llevar OpenGL al mundo móvil, restringiendo su alcance a la plataforma Palm OS. La mayor ventaja de la librería es tal vez el hecho de que es libre y puede ser descargada y utilizada bajo la licencia LGPL (GNU Lesser General Public Licence). miniGL es un proyecto que lleva alrededor de 4 años, y en sus 4 versiones han logrado los siguientes 2 resultados : •. •. •. •. versión 1.0: provee un conjunto básico de funciones para el dibujo de objetos alambrados utilizando primitivas GL_POLYGON y GL_LINES. Tanto las proyecciones ortográficas como en perspectiva son soportadas. versión 2.0: adiciona el soporte a las primitivas GL_TRIANGLES, GL_QUADS y GL_QU AD_STRIP. Además de esto incorporan soporte inicial de fuenes de luz difusa, dobles buffers y el comienzo de soporte a color basado en escalas de grises de cuatro bits. versión 3.0: soporte completo de luces (difusa, especular y de ambiente). Incorporan el tipo de sombreado Gouraud. Además de esto empiezan a agregar soporte a z-buffer para poder determinar cuando un polígono oculta o no a otro. versión 4.0: separan el código de la librería en un archivo prc.. 2. Tomado de: DSBox | miniGL http://www.dsbox.com/minigl.html. 8.

(12) Hasta el momento han implementado un total de 27 funciones. El listado de 3 las mismas puede ser consultado a continuación : • • • • • • • • • • • • • •. glLoadMatrix glMultMatri x glLoadIdentity glClearColor glClear glColor3f glColor4f glOrtho glViewport gluOrtho2D gluPerspective glEnable glDisable glLightfv. glBegin glEnd glFlush glVertex2f glVertex3f glShadeModel glRotatef glScalef glTranslatef glPopMatrix glPushMatrix glMatrixMode glNormal3f. Algunas de las desventajas de la librería son: • •. La librería solo ha sido probada bajo el sistema operativo Linux. Se restringe su uso a la plataforma Palm OS.. 2. TinyGL Es una implementación de un subconjunto de funciones OpenGL. Es una 4 implementación 100% software (mismo caso para la librería gráfica móvil a desarrollar en este proyecto). Según sus autores es una librería más rápida que OpenGL debido a que no es totalmente compatible con la misma. Las transformaciones y el mapeo de texturas se realizan de una manera un poco diferente. La página web oficial de la librería [16] no es muy clara en cuanto al número de métodos implementados. tinyGL debe tener aproximadamente el mismo tiempo de desarrollo que miniGL, y el número de versiones que han sacado de la misma ha sido 5. Según el log de cambios son dos los autores 3. Tomado de: DSBox | miniGL http://www.dsbox.com/minigl.html 4. Tomado de: TinyGL : a Small, Free and Fast Subset of OpenGL* http://fabrice.bellard. free. fr/TinyGL/. 9.

(13) principales del proyecto. Una de las desventaja es el hecho de que no es muy claro sobre que tipo de dispositivos es capaz de funcionar la librería. 3. Pocket GL. Es una librería gráfica en tres dimensiones para C/C++ y que sirve para 5 programar gráficos para dispositivos Pocket PC . Entre sus características están las siguientes: • • • • • •. Soporta objetos con texturas o modelos alambrados de los mismos. Proyección en perspectiva. Transparencia alfa. Utiliza matemática de punto fijo para operaciones matriciales y de vértices. Soporta luces. Trabaja con triángulos, cuadriláteros y arreglos de vértices.. La última versión de la librería salió hace poco más de un año y entre las grandes desventajas que presenta es que el acceso a la misma no es gratis. Se puede obtener una versión de demostración que no incluye tutoriales ni código fuente de la librería.. 4. OpenGL ES Es un API que permite desarrollar gráficos en dos y tres dimensiones sobre sistemas embebidos (celulares, PDAs y demás dispositivos electrónicos de tamaño reducido). Ofrece un subconjunto de funciones encontradas en la versión OpenGL que se encuentra en los computadores de escritorio. Al igual que OpenGL, OpenGL ES es una especificación mas no una implementación, por lo que es necesario buscar algún producto basado en 6 OpenGL ES y trabajar sobre éste . Una de las grandes desventajas es el bajo número actual de implementaciones del estándar; la única implementación encontrada hasta el momento es la ofrecida por la compañía 7 Hybrid Graphics , pero es una versión comercial. 5. Tomado de: Pocket GL (ARM & Mips) on PocketGear.com http://www.pocketgear.com/software_detail.asp?id=1858 6. Tomado de: OpenGL ES Overview http://www.khronos.org/opengles/index.html 7. Tomado de: Hybrid Graphics - OpenGL ES API Framework http://www.hybrid.fi/main/esframework/index.php. 10.

(14) V. Marco Teórico. La presente sección es tal ve z una de las más importantes por lo que representa para el proyecto; agrupa las bases y fundamentos que hicieron del mismo una realidad. Es de vital importancia para el lector la comprensión y entendimiento de lo que a continuación se enuncia, ya que de esta manera se garantizarán el mínimo de conceptos requeridos al momento de detallar la librería gráfica móvil desarrollada y e xpuesta en este trabajo. Si este no es el caso, de seguro no se sacará el mejor provecho a este texto y la comprensión de la librería móvil se hará infinitamente más complicada. En las siguientes secciones se tratarán los siguientes temas: •. •. •. OpenGL: es la base de todo el proyecto. El objetivo principal es lograr migrar esta interfaz de hardware al mundo de los dispositivos móviles, restringiendo el conjunto de equipos a las asistentes personales digitales. Conceptos Gráficos: conjunto de técnicas y metodologías comunes en el mundo de la computación gráfica. Es necesario conocerlas debido a que son los fundamentos tanto de OpenGL como de la librería gráfica móvil a desarrollar. SuperWaba: es la herramienta de desarrollo que apoya todo el proceso de implementación de la librería gráfica móvil. Es importante conocerla en detalle para entender de una mejor manera la forma en que se construyó la librería (en su primera etapa).. Una vez comprendidos los temas anteriormente descritos se procede a detallar la librería gráfica móvil implementada, seguido de la descripción de su respectivo caso de estudio.. 1. OpenGL OpenGL es una interfaz en software a un hardware dedicado a gráficos. La interfaz consta de 120 funciones diferentes que pueden ser utilizadas para especificar objetos y operaciones que permitan la elaboración de aplicaciones interactivas en tres dimensiones. 8. Algunas otras características de OpenGL se enuncian a continuación :. 8. Tomado de: Chapter 1 - OpenGL Programming Guide (Addison-Wesley Publishing Company) http://rush3d.com/reference/opengl-redbook-1.1/chapt er01.html. 11.

(15) •. •. •. •. Es capaz de trabajar en un ambiente distribuído, en donde una máquina (cliente) emite los comandos OpenGL para dibujar en pantalla y otra máquina (servidor) es la que procesa y realiza las operaciones (los resultados de las llamadas a funciones OpenGL se ven remotamente, en la máquina servidora). Fue diseñado para poder ser implementado en cualquier plataforma de hardware. Para hacer esto fue necesario excluir de OpenGL funciones relacionadas con la manipulación de ventanas y captura de entradas de usuario (a pesar de esto hay paquetes como glut u glaux que facilitan este tipo de operaciones y que pueden ser obtenidos fácilmente a través de Internet). No provee comandos para describir objetos tridimensionales complejos; para realizar esto se debe construir el objeto a partir de las primitivas que ofrece OpenGL para dibujar puntos, líneas y polígonos (entre otras cosas). Ofrece funciones para alcanzar efectos de sombreado, iluminación, esconde objetos que en la escena se encuentren ocultos por otros y efectos de profundidad (visión en perspectiva) entre otros.. 1.1.. Estructura de un Programa en OpenGL. Para entender la manera en que la librería gráfica móvil opera es importante conocer la manera en que se estructuran los programas en OpenGL, ya que de manera muy similar se estructurarán los programas que operen con Mob ileGL. A pesar de que las incontables operaciones que ofrece OpenGL le agregan complejidad a los programas que puedan ser desarrollados utilizando esta interfaz, la estructura básica de cualquier programa es algo sencilla y de alguna manera estándar (común entre todos los programas que hacen uso de OpenGL). Básicamente la estructura de estos programas sigue la siguiente forma: •. •. Inicializar ciertos estados que rigen la manera en la que OpenGL dibuja los objetos en escena. Algunos de estos estados son el color del fondo de la escena y el color con el que serán dibujados los objetos de la misma. Colocar y dibujar los objetos que componen el mundo (la escena).. 1.2.. Sintaxis de los Comandos/Constantes OpenGL. Para hacer menos traumático el porte de una aplicación OpenGL a la librería gráfica móvil, la sintaxis de los comandos y constantes para MobileGL es. 12.

(16) identica a la que se utiliza en OpenGL. Es éste entonces el motivo de dedicarle una sección a detallar la nomenclatura de las funciones que hacen parte de OpenGL. En la sección de Alcance se listaron las funciones a implementar en esta etapa del proyecto. Se pudo apreciar entonces que todas las funciones empezaban con el prefijo gl, y cada palabra que compone la función era capitalizada. Es precisamente esta la nomenclatura que sigue OpenGL al momento de nombrar sus funciones. De una manera parecida procede con las constantes que utiliza; todas sin excepción empiezan con el prefijo GL, capitalizando cada letra de la palabra y separando palabras distintas con el caracter '_'. Además de estos prefijos, OpenGL utiliza una serie de sufijos que determinan tanto el tipo como el número de argumentos que la función recibe. Estos sufijos son de la manera <numero_argumentos><tipo_argumentos>. El número de argumentos varía entre 2 y 4, mientras que el conjunto de tipos 9 de datos que soporta OpenGL es más extenso y se lista a continuación : • • • • • • • •. b: booleano, definido en OpenGL como GLb yte. s: corto (short), definido en OpenGL como GLshort. i: entero (largo), definido en OpenGL como GLint o GLsizei. f: flotante, definido en OpenGL como GLfloat o GLclampf. d: doble, definido en OpenGL como GLdoub le o GLclampd. ub: entero sin signo de 8 bits o caracter sin signo, definido en OpenGL como GLub yte o GLb oolean. us: entero corto sin signo (de 16 bits), definido en OpenGL como GLushort. ui: entero sin signo (de 32 bits), definido en OpenGL como GLuint, GLenum o GLb itfield.. Para hacer mayor claridad en el tema, un ejemplo ilustrativo es el siguiente: glVertex2f(2.0, 1.0); glVertex2i(2, 1); Las dos funciones mencionadas a continuación tienen como propósito el especificar un vértice a dibujar en pantalla. En realidad ambas desarrollan la misma tarea y difieren únicamente en el tipo de argumentos que reciben (la primera recibe flotantes mientras la segunda recibe enteros). El número 2 en el sufijo indica que la función recibe únicamente dos argumentos. 9. Tomado de: Chapter 1 - OpenGL Programming Guide (Addison-Wesley Publishing Company) http://rush3d.com/reference/opengl-redbook-1.1/chapt er01.html. 13.

(17) Para efectos del proyecto y debido a que el lenguaje de programación Java no soporta el mismo número de tipos de datos soportados por OpenGL, las funciones con las que se trabajará excluyen los tipos de datos sin signo (aquellos que comienzan por u y que fueron enunciados anteriormente). Para concluir con esta sección es pertinente hacer una última salvedad; el sufijo de las funciones puede incluir además una v que determina que el tipo de parámetro aceptado es un vector de longitud igual al número de parámetros que aceptaría la función en condiciones normales (sin la v). Algunas funciones en OpenGL aceptan todo tipo de parámetros, mientras otras solo unos cuantos. Para evitar ambigüedades en este tema, la documentación de la librería deja explícitamente citados los diferentes tipos de datos y números de argumentos con los que trabaja una función. 1.3.. OpenGL como una Máquina de Estados. OpenGL se considera una máquina de estados debido a la manera como realiza sus operaciones; durante toda la ejecución de un programa, OpenGL mantiene una colección de estados que se mantienen con los mismos valores hasta que el programa decida cambiarlos haciendo uso de algunas 10 de las funciones que ofrece OpenGL . Variables como el color con los que se dibujarán los vértices, el modo de interpretar los vértices al momento de armar los objetos geométricos, las características de los materiales, iluminación y sombreado representan algunos de los estados mantenidos por OpenGL. Algunos de estos estados son habilitados haciendo uso de unas funciones preestablecidas, mientras que para otros esto se puede conseguir haciendo uso de las funciones glEnable y glDisable. Si el programa no modifica ninguno de los valores de las variables de estado, sus valores por defecto serán utilizados. Para consultar estos valores es necesario hacer uso de la función glGet*, concretamente de sus variantes glGetFloatv, glGetDoublev, glGetIntegerv y glGetBooleanv. Para efectos de la librería gráfica a desarrollar, los estados que se incorporaron en esta etapa son los siguientes: •. GL_CURRENT_COLOR: color actual utilizado para dibujar los vértices de los objetos geométricos de la escena. Su valor por defecto es (1, 1, 1, 1) o el color blanco, y se puede utilizar tanto glGetIntegerv como glGetFloatv para obtener su valor.. 10. Tomado de: Chapter 1 - OpenGL Programming Guide (Addison-Wesley Publishing Company) http://rush3d.com/reference/opengl-redbook-1.1/chapt er01.html. 14.

(18) •. •. •. •. •. •. GL_MODELVIEW_ MATRIX: matriz de almacenamiento de transformaciones de modelo y de vista. Su valor por defecto es la matriz de identidad y puede ser consultado mediante la función glGetFloatv. GL_MODELVIEW_STACK_DEPTH: profundidad de la pila de matrices de modelo-vista. Su valor por defecto (y único e inmodificable) es 16 y puede ser consultado por medio de la función glGetIntegertv. GL_MATRIX_ MODE: la pila de matrices sobre la cuál recaen todas las operaciones efectuadas. Su valor por defecto es GL_MODELVIEW, lo que indica que inicialmente la pila de matrices de modelo-vista es la que recibe todas las transformaciones realizadas. Su valor puede ser obtenido por medio de la función glGetIntegerv. GL_POLYGON_ MODE: el modo de rasterización de los polígonos. En este caso hay una diferencia entre OpenGL y la librería gráfica móvil a desarrollar. Para OpenGL el valor por defecto es GL_FILL, lo que indica que el interior de los polígonos es rellenado. El relleno de polígonos (sobretodo en 3 dimensiones) es una labor bastante compleja, existiendo a la fecha algunos algorítmos que intentan desarrollar la labor. Debido a que esta es la primera etapa del proyecto y que la prioridad es lograr la migración e implementación de las transformaciones de modelo-vista, la librería gráfica móvil a desarrollar toma este valor como GL_LINE, siendo este junto con GL_POINT los únicos soportados para este estado. Este valor puede ser consultado haciendo uso de la función glGetIntegerv. GL_COLOR_CLEAR_VALUE: color con el es limpiado el buffer de color. Su valor por defecto es (0, 0, 0, 0) o el color negro, y puede ser consultado haciendo uso de la función glGetFloatv. GL_DOUBLEBUFFER: varible que especifica si la aplicación se encuentra trabajando con dos buffers o con uno. Este tipo de buffers hace referencia a aquellos que almacenan los píxeles de la escena. Cuando hay dos buffers, mientras se despliega la escena usando la información del buffer principal, la misma escena puede estar repintandose en el buffer secundario. Al finalizar el proceso de pintada en el buffer secundario, los datos de los buffers se intercambian para poder desplegar la escena recien pintada (y el proceso se repite así hasta que el programa termine su ejecución). En el caso de que un programa se encuentre trabajando con dos buffers, esta variable almacenará el valor booleano verdadero; en el caso contrario, el valor falso será almacenado. Para consultar este valor se puede utilizar la función glGetBooleanv.. Además de los estados anteriormente mencionados, OpenGL mantiene uno muy especial en el cual almacena el error generado por la última operación ejecutada. Esta variable se consulta de una manera diferente, razón por la cual es tratada aparte de las demás. Para OpenGL, la manera de procesar un error se resume a continuación: •. Inicialmente la variable con tiene el valor GL_NO_ERROR, lo cual indica que hasta el momento no se ha presentado ningún error.. 15.

(19) •. Para el caso en el que un llamado a una función de la librería genera un error, hay dos maneras de proceder; si la variable de error contiene el valor GL_NO_ERROR, este valor es remplazado por uno de los códigos de error que define OpenGL y que corresponde al error presentado; si este no es el caso y la variable de error ya ha registrado un error, este valor se preserva hasta que el programa haga una llamada a la función glGetError (función utilizada para obtener el valor de la variable de error). Esta función seguirá retornando todos los errores que se han presentado hasta llegar a retornar GL_NO_ERROR cuando no hay más errores por reportar.. Debido a lo anterior, la práctica recomendada es la de llamar a glGetError hasta que esta función retorne el valor GL_NO_ERROR. Para efectos de la librería gráfica móvil a desarrollar, los códigos de error manejados son idénticos a los utilizados por OpenGL y se describen a continuación: •. •. •. •. GL_INVALID_ENUM: error que se presenta cuando la función espera un conjunto de constantes simbólicas con base en los cuales va a operar, pero el valor recibido se encuentra fuera del rango de las constantes válidas para la función. Este es el caso de glMatrixMode, función que acepta los parámetros GL_MATRIXMODE, GL_PROJECTION y GL_TEXTURE. Si algún valor distinto de estos le es especificado a la función, este tipo de error será reportado por la librería gráfica. GL_INVALID_VALUE: error que se presenta cuando se le especifica a una función un valor inválido. Cada función en su documentación especifica los valores que esta preparada a recibir; si se especifica un valor fuera de este rango, este error será registrado por la librería gráfica. Este es el caso de la función glClear, que acepta una combinación lógica de valores GL_COLOR_BUFFER_BIT, GL_DEPTH_BUFFER_BIT, GL_ACCUM_BUFFER_BIT y GL_STENCIL_BUFFER_BIT. Esto quiere decir que la función está preparada a recibir cada valor por separado o una combinación de los mismos haciendo uso del operador lógico '|'. Si un valor diferente es especificado, este error quedará registrado. GL_INVALID_OPERATION: error que se presenta cuando una operación es llamada mientras la librería se encuentra en un estado donde este tipo de operación no es permitida. El ejemplo clásico es el del par de funciones glBegin y glEnd. Este tipo de funciones delimitan la especificación de un conjunto de vértices que conforman una primitiva a dibujar en pantalla. En la documentación de la librería se especifica el conjunto de funciones que pueden ser llamadas entre un llamado a glBegin y glEnd. Si cualquier otra función distinta a las especificadas es llamada, este error será registrado por la librería gráfica. GL_STACK_OVERFLOW: error que se produce cuando la operación a efectuar causaría un desbordamiento de pila. Por lo general este error se presenta al tratar de salvar algún estado (haciendo uso de la función glPushMatrix o glPushAttrib ) cuando la pila correspondiente al estado se encuentra llena.. 16.

(20) •. •. GL_STACK_UNDERFLOW: error que se produce cuando la operación a efectuar intenta obtener un valor de una de las pilas de la librería y la pila correspondiente se encuentra vacía. GL_OUT_OF_MEMOR Y: error que se produce cuando el sistema no dispone de memoria suficiente para ejecutar el comando.. Para todos los casos de error exceptuando GL_OUT_OF_MEMORY la forma de proceder es la de reportar el error ocurrido e ignorar la operación. Para este último caso de error, el estado de la librería gráfica es indefinido. Antes de concluir la sección es importante dejar detallada la manera que ofrece OpenGL para guardar estos estados y reestablecerlos a futuro. Para efectos de la librería gráfica móvil a desarrollar, únicamente serán descritos aquellos estados incorporados a esta librería. Se debe hacer claridad sobre el hecho de que hay dos diferentes tipos de variables de estados: unas variables son matrices (o arreglos que son interpretados como matrices) y otras son variables comunes y corrientes. Para salvar el estado de una matriz (de la matriz que se encuentra en el tope de la pila que recibe todas las transformaciones que se estén ejecutando) basta con llamar a la función glPushMatrix. Si la variable de estado que se quiere guardar no es de tipo matriz, la manera a proceder es haciendo un llamado a la función glPushAttrib y especificando uno de los siguientes argumentos (o una combinación de los mismos haciendo uso del operador lógico '|'): • • • •. GL_COLOR_BUFFER_BIT: guarda el modo de color que se esta utilizando (RGBA o modo índices). GL_CURRENT_BIT: guara el color con el que se están dibujando los vértices de las primitivas. GL_POLYGON_BIT: guarda el modo en el que se están dibujando los polígonos en pantalla. GL_TRANSFOR M_BIT: guarda la constante simbólica que indica el tipo de la pila de matrices sobre la cual recaen todas las operaciones de transformación actualmente.. Para restablecer los valores almacenados se llama a glPopMatrix si la variable de estado es una matriz o glPopAttrib si no lo es. Hasta este punto se han mencionado varias constantes y funciones, sin llegar al punto de profundizar hasta el más mínimo detalle. Esto se debe a que en una sección futura se detallará la librería gráfica móvil a desarrollar, la cual es el pilar del presente trabajo. En esa sección se estudiará cada una de las funciones implementadas, detallando los parámetros que reciben y los códigos de error que pudiesen llegar a generar.. 17.

(21) 1.4.. Animación en OpenGL. El proceso que sigue OpenGL para llegar a una escena animada es similar al que utilizan los teatros de cine; se tiene un conjunto de imágenes desplegadas a razón de segundo transcurrido (en un principio el número de imágenes desplegadas era de 16 por segundo, luego se incrementó este número a 24 y en la actualidad se suele hacer con 48 imágenes). En el caso de OpenGL, cada imagen a desplegar debe haber sido 11 completamente dibujada primero . Para facilitar el proceso, OpenGL ofrece la posibilidad de trabajar con dos buffers. El principal es el que contiene los datos a desplegar en pantalla mientras que en el secundario se va dibujando la siguiente imagen a desplegar. Una vez se termine el proceso de dibujo, los datos de los dos buffers son intercambiados para así desplegar la imagen recientemente dibujada. Para conseguir el efecto de animación, la imagen de la escena actual es redibujada únicamente con un conjunto distinto de transformaciones. El dibujo sucesivo de escenas transformadas es lo que realmente consigue el efecto de animación en OpenGL. 1.5.. Operaciones Básicas de OpenGL. 12 En el nivel más alto de abstracción hay tres operaciones básicas : limpieza de la ventana, dibujo de objetos geométricos y dibujo de objetos tales como imágenes, mapas de bits y fuentes de caracteres. Para efectos de la librería gráfica a desarrollar y por ser esta la primera etapa, los temas que se abarcarán en el presente trabajo son los dos iniciales. El último tema le agrega complejidad al proyecto, lo cual se traduce en más tiempo y/o personas involucradas en el proyecto. Es un aspecto importante de OpenGL sin ninguna duda, pero puede ser postergado para futuras etapas de desarrollo.. Retomando el tema de operaciones básicas, la primera que todo programa (que desee trabajar con OpenGL) debe procesar es la de limpiar la ventana donde se realizará el dibujo de la escena. Esto en términos concretos se reduce a limpiar el área de memoria utilizada para dibujar la última imagen 11. Tomado de: Chapter 1 - OpenGL Programming Guide (Addison-Wesley Publishing Company) http://rush3d.com/reference/opengl-redbook-1.1/chapt er01.html 12. Tomado de: Chapter 2 - OpenGL Programming Guide (Addison-Wesley Publishing Company http://rush3d.com/reference/opengl-redbook-1.1/chapt er02.html. 18.

(22) desplegada. Si esto no se realiza la nueva imagen se sobrepondrá a la anterior, evitando que se produzcan los resultados deseados. Para realizar esta tarea en OpenGL basta con hacer 13 siguientes funciones : •. •. una llamada a las. glClearColor: establece el color al que será limpiado el buffer de color. En OpenGL esta función recibe cuatro valores del tipo GLclampf, pero por razones que se discutirán en un futuro la librería gráfica móvil acepta valores de tipo flotante. Cada uno de los valores corresponde al porcentaje de rojo, amarillo, verde y alfa que contendrá el color a utilizar para la limpieza del buffer de color [4]. glClear: limpia el buffer(s) especificado(s). En OpenGL hay cuatro buffers que pueden ser limpiados; el buffer de color, el buffer de plantillas, el buffer de profundidad y el buffer de acumulación. Debido al alcance planteado para el presente proyecto, el único buffer que realmente es limpiado en la librería gráfica móvil es el buffer de color. Esto no quiere decir que la función reciba distintos valores a aquella presente en OpenGL; acepta los mismos, la diferencia radica en el comportamiento y manera de operar de la función (hace caso omiso cuando se especifica una constante simbólica a la que la función reaccionaría limpiando los buffers distintos al de color). Si se desea limpiar el buffer de color con un valor distinto a aquel utilizado por defecto (color negro), se debe hacer una llamada primero a glClear (esto aplica igualmente para los otros tres buffers, con la diferencia de que la función a llamar es diferente y no son tratadas en este documento a razón de que se encuentran ausentes de la primera implementación de la librería gráfica móvil) [4].. La segunda operación básica a tratar en esta sección es el dibujo de los objetos geométricos que harán parte de la escena final. En OpenGL (al igual que en la librería gráfica móvil), el dibujar un objeto implica por una parte especificar las propiedades de color, sombreado, iluminación, etc. con las que será dibujado el objeto; una vez especificadas estas propiedades se puede continuar con la enumeración de los vértices que harán parte de la figura. Para esta primera etapa del proyecto la única propiedad de color que podrá ser especificada para los objetos es el color de los mismos. Esto se debe a que para esta etapa solo se implementará el modo de dibujo de polígonos como unión de líneas (no rellenados), lo que hace innecesario por el momento la incorporación de propiedades como iluminación y sombreado. Una vez leída la sección dedicada a la librería gráfica móvil el lector estará dotado de más herramientas para comprender de una mejor manera lo que en este párrafo se ha enunciado.. 13. Tomado de: Chapter 2 - OpenGL Programming Guide (Addison-Wesley Publishing Company http://rush3d.com/reference/opengl-redbook-1.1/chapt er02.html. 19.

(23) Para asignar el color de los objetos OpenGL ofrece la función glColor, la cuál contiene unas 16 variantes (8 de ellas reciben tres parámetros de diferentes tipos, mientras que las 8 restantes reciben 4). Aquellas funciones de tres parámetros reciben los porcentajes de color rojo, verde y a zul, valores que se deben encontrar entre el rango 0 y 1. El parámetro adicional que reciben aquellas de cuatro argumentos representa el valor alfa. Debido a que SuperWaba no permite especificar este valor al momento de asignar colores de dibujo (al menos este es el caso en su última versión, 4.5a), estas funciones no fueron implementadas en la librería gráfica móvil. Las funciones que si fueron implementadas en esta librería suman un total de cinco, ya que los tipos de datos sin signo tampoco son soportados por SuperWaba. Más acerca de esta plataforma en una siguiente sección. Una vez asignado el color con el que serán dibujados los objetos en la escena se puede proceder a describir la serie de puntos o vértices que harán parte de los mismos. OpenGL ofrece una función especial para esta tarea, glVertex; el total de sus variantes suma 24, pero aquellas implementadas para la librería gráfica móvil únicamente suman un total de 16. Aquellas excluidas deben esto a que reciben, además de los tres argumentos para cada una de las coordenadas x, y y z, un parámetro w que se denomina la coordenada euclidiana y que será estudiada en la sección dedicada al repaso de los conceptos gráficos utilizados para construir la librería gráfica móvil. Las funciones que sí fueron implementadas permiten la especificación de vértices tanto en dos como tres dimensiones. Más acerca de esto en la sección dedicada a la librería gráfica móvil. El dibujo de los objetos geométricos depende en gran parte de que es lo que se quiere dibujar; puntos, líneas y polígonos son las opciones disponibles en OpenGL y cualquier figura de mayor complejidad se debe armar a partir de estas primitivas. Antes de continuar es preciso hacer una aclaración y dejar claros algunos términos. Un punto para la librería gráfica no es infinitamente pequeño (definición matemática) sino representado como un píxel; una línea no es infinitamente delgada ni se extiende al infinito por ambos lados, es un conjunto de puntos que conforma un segmento de línea; un polígono en OpenGL debe ser simple o convexo, significando que para cualquier dos puntos que hagan parte del polígono la línea que los une debe hacer parte del mismo. Para dibujar un punto, una línea o un polígono basta con delimitar la zona de dibujo haciendo uso de las funciones glBegin y glEnd ofrecidas por OpenGL; entre estas dos funciones van los llamados a la función glVertex, la cual vimos en párrafos anteriores es la encargada de especificar los vértices que componen el objeto. glBegin necesita un parámetro que va a determinar el tipo de objeto a ser dibujado, una constante simbólica que bien puede ser una de las siguientes:. 20.

(24) • •. •. •. •. •. •. •. •. •. GL_POINTS: trata a cada vértice como un único punto. El vértice n define el punto n y se dibujan N puntos. GL_LINES: trata cada par de vértices como un segmento de línea independiente. Los vértices 2n-1 y 2n definen el segmento de línea n y se dibujan N/2 segmentos de línea. GL_LINE_STRIP: dibuja un conjunto de segmentos de línea interconectados desde el primer vértice hasta el último. Los vértices n y n+1 definen el segmento de línea n y se dibujan N-1 segmentos de línea. GL_LINE_LOOP: opera de la manera similar a GL_LINE_STRIP, con la diferencia de que cierra el circuíto (dibuja un segmento de línea que conecta al último vértice con el primero). Por lo anterior, N líneas son dibujadas. GL_TRIANGLES: trata a cada tripleta de vértices como un triángulo independiente. Los vértices 3n-2, 3n-1 y 3n definen el triángulo n y se dibujan N/3 triángulos. GL_TRIANGLE_STRIP: dibuja un grupo interconectado de triángulos. Se define un triángulo para cada vértice que contenga dos antecesores. Para n impar, los vértices n, n+1 y n+2 definen un triángulo; para n par, los vértices n+1, n, n+2 definen un triángulo. Independientemente de si n es par o impar, el número de triángulos dibujado es del orden de N-2. GL_TRIANGLE_FAN: dibuja un grupo interconectado de triángulos. Funciona de manera similar a GL_TRIANGLE_STRIP, con la diferencia de que en este caso no se hace distinción entre la paridad o imparidad del número de vértices especificados (se dibujan N/2 triángulos). GL_QUADS: trata a cada cuarteto de vértices como un cuadrilátero independiente. Los vértices 4n-3, 4n-2, 4n-1 y 4n definen un cuadrilátero y se dibujan N/4 cuadriláteros. GL_QUAD_STRIP: dibuja un grupo interconectado de cuadriláteros. Se define un cuadrilátero por cada pareja de vértices especificada después de una primera pareja. Los vértices 2n-1, 2n, 2n+2 y 2n+1 definen un cuadrilátero. GL_POLYGON: dibuja un polígono convexo. Todos los vértices especifican la frontera (borde) del polígono.. Se pueden especificar tantos vértices como se deseen para dibujar los objetos de la escena, y en el caso en que se especifique un número incompleto de vértices para alguno de los casos, el total real de figuras dibujadas será inferior al normal especificado por el caso. Para puntualizar más sobre este detalle, el número mínimo de vértices que se debe especificar para cada una de las figuras a dibujar es el siguiente: 1 para puntos, 2 para líneas, 3 para triángulos y polígonos y 4 para cuadriláteros. 1.6.. Transformaciones en OpenGL. 21.

(25) Toda aplicación gráfica en OpenGL debe de manera directa o indirecta tratar con algún tipo de transformaciones, ya sea aquellas relacionadas con el modelo (objetos de la escena), la vista en perspectiva, o simplemente las transformaciones de las coordenadas de los objetos relativas al mundo de la escena a aquellas directamente ligadas a la ventana que desplegará la misma. Este tema es verdaderamente importante y sutilmente diferente para OpenGL y la librería gráfica móvil. A continuación se detallará un poco más el concepto de transformaciones, puntualizando (cuando aplique) en las diferencias entre una y otra librería. En OpenGL el proceso que traduce las coordenadas de un vértice de cómo fueron originalmente especificadas a coordenadas de ventana es el 14 siguiente : 1. 2.. 3.. 4.. 5.. Se especifican las coordenadas de un vértice haciendo uso de la función glVertex. Haciendo uso de funciones de transformación de modelo (a ser listadas a continuación) se construye una matriz de modelo-vista que luego es aplicada a las coordenadas de cada uno de los vértices que componen los objetos de la escena. Haciendo uso de funciones de transformación especiales se define el campo visual para la escena y la manera en que serán proyectados cada uno de los objetos que componen la misma en pantalla. Estas otras funciones de transformación se agrupan en una matriz de proyección, la cual es aplicada a cada uno de los vértices que componen los objetos de la escena. En este punto se tienen unas coordenadas a las cuales se le ha aplicado tanto la matriz de modelo-vista como la matriz de proyección. Luego de esto se procede a hacer una transformación (vértice) que resulta en nuevos vértices proyectados de un mundo en 3 dimensiones a un mundo en 2 dimensiones. Esto da como resultado que por cada vértice se tienen unas nuevas coordenadas de dispositivo normalizadas. La manera en que OpenGL realiza esta conversión no es clara ni especificada, pero en una sección futura estudiaremos el algoritmo utilizado para librería gráfica móvil y con cierta seguridad podemos afirmar que es el mismo al utilizado por OpenGL. El último proceso realizado por OpenGL es el de convertir (por vértice) estas coordenadas normalizadas a coordenadas de ventana. En este paso es realmente donde se define que píxeles de la ventana se verán afectados para reflejar la escena (tridimensional) a dibujar en pantalla.. 14. Tomado de: Chapter 2 - OpenGL Programming Guide (Addison-Wesley Publishing Company) http://rush3d.com/reference/opengl-redbook-1.1/chapt er02.html. 22.

(26) La librería gráfica móvil a desarrollar en el presente trabajo realiza todas estas operaciones exceptuando la tercera. La razón de este comportamiento es sencilla de comprender, y aunque totalmente lógica, es importante que por compatibilidad de la librería con OpenGl este paso sea agregado en futuras versiones de la misma. OpenGL aplica las transformaciones de proyección para determinar que objetos serán o no mostrados en la escena. Las transformaciones de proyección definen el volumen visual o el campo visible por el observador de la escena, y al realizar estas comparaciones OpenGL ahorra trabajo al no tener que dibujar aquellos objetos que no son visibles según este tipo de transformaciones. La librería gráfica no realiza este paso debido a que dentro de sus funciones a implementar no se encuentran algunas como gluPerspective, glFrustrum o glOrtho; las dos primeras definen una vista con proyección en perspectiva, mientras que la útima defne una vista con proyección ortogonal. Este tipo de vistas será discutido en la sección dedicada a los conceptos gráficos, pero por el momento es suficiente con conocer que el propósito de estas funciones es definir una matriz de proyección que será aplicada a todos los vértices de los objetos de la escena para determinar cuales serán visibles y cuales no se dibujarán. El que la librería gráfica móvil no realice este paso no determina que todos los objetos independientemente de sus coordenadas serán visibles en la escena; las transformaciones de perspectiva y el paso a coordenadas de ventana compensan un poco la ausencia de una matriz de transformación en el sentido en que ayudan a controlar que objetos se encuentran visibles y cuales no. Las desventajas reales que mantiene esta versión de la librería con respecto a OpenGL son las siguientes: •. •. El campo visual de la escena no es dinámico y siempre será el rectángulo delimitante de las dimensiones de la ventana, con unos límites para el eje z fijados al momento del desarrollo de esta librería (es posible que esto no sea muy claro en estos momentos, pero de seguro se entenderá luego de haber leído la sección dedicada a la librería gráfica móvil). Todos los vértices de los objetos son dibujados indistintamente de si el objeto se encuentra visible o no. Esta es tal vez la desventaja más grande e impacta directamente la eficiencia de la librería (para escenas pequeñas no es un problema grave, pero para aquellas con un número grande de objetos puede convertirse esto en un dolor de cabeza). Por ra zones de eficiencia es importante entonces que para la siguiente versión se incorpore la matriz de proyección, ahorrando así esfuerzos innecesarios en el dibujo de vértices ocultos.. Las funciones ofrecidas por OpenGL para realizar transformaciones de modelo-vista y que fueron implementados en la librería gráfica son las siguientes:. 23.

(27) •. •. •. glTranslatef: realiza una traslación sobre los ejes x, y y z. Una traslación puede verse como un desplazamiento, el cual se hace a nivel de vértice. glRotatef: realiza una rotación sobre un eje especificado. Aunque esto es real para OpenGL, la librería gráfica solo permite rotaciones sobre los ejes bien definidos (x, y y z). glScalef: realiza una escalación por coordenada basada en el punto fijo (0, 0) o el origen del sistema de coordenadas. OpenGL permite escalar sobre cualquier punto fijo pero por consideraciones de tiempo esto por ahora no es posible.. Además de estas dos funciones hay otra más que sirve para asignar a la matriz de transformaciones de modelo-vista la matriz de identidad. No se detalla en este caso debido a que todavía no se ha detallado la manera en la que la librería agrupa este tipo de transformaciones para luego aplicárselas a los vértices que componen los objetos de la escena. La razón de agrupar las transformaciones va directamente ligada al grado de eficiencia que se quiere alcanzar la librería; en la sección de conceptos gráficos se detallará en profundidad este tema. Con esto se concluye el tema de OpenGL; el resto de anotaciones referentes a la librería gráfica estarán dirigidas a la librería gráfica móvil a desarrollar como proyecto de grado. 2.. Conceptos Gráficos. Muchas aplicaciones necesitan una manera de alterar o manipular los objetos de la escena, no simplemente colocarlos. Algunas otras necesitan cierto dinamismo; necesitan del movimiento de algunos de sus elementos, necesitan de animación. La forma para conseguir esto en cualquier librería gráfica es a través de las transformaciones geométricas. Una transformación geométrica es una operación que altera las descripciones de las 15 coordenadas de un objeto . Las transformaciones básicas son la traslación, rotación y escalamiento. Otras transformaciones como la reflexión y el recorte no fueron consideradas para esta versión de la librería gráfica móvil, debido a que el soporte que OpenGL ofrece para estas tampoco es muy claro. Además de haber diferentes tipos de transformaciones, su campo de acción también varía; ha y transformaciones que operan en mundos bidimensionales y tridimensionales. Primero se procederá con el estudio de aquellas dirigidas a objetos en dos dimensiones, extendiendo luego estos conceptos a objetos tridimensionales. Esto se debe a que tanto las transformaciones en dos dimensiones como en tres dimensiones siguen la misma filosofía (con 15. Gráficas por Computadora (Segunda Edición) – Donald Hearn, M. Pauline Baker Capítulo 5 – Transform aciones geométri cas bidimensionales. 24.

(28) algunas diferencias mínimas claro esta), y para efectos didácticos es más simple el entender y detallar como funcionan estas transformaciones sobre objetos de únicamente dos coordenadas. 2.1.. Traslación. Una traslación permite cambiar la posición de un objeto a lo largo de la trayectoria de una línea recta. La traslación (como cualquier transformación) se hace a nivel de cada uno de los vértices que componen el objeto. Para trasladar un punto (x,y) una distancia dt a la posición (x’, y’) basta con 16 agregar unas distancias de traslación : x’ = x + tx ,. y’ = y + ty. donde (tx, ty) se denomina el vector de traslación o vector de camb io. Modificando un poco la representación de estas ecuaciones para adaptarlas al modelo matricial, las nuevas ecuaciones de traslación quedarían de la siguiente manera: P = [x1] [x2]. P’ = [x’1] [x’2]. T = [t x] [t y]. y P’ = P + T. Esta forma de ecuación de traslación obliga a que a cada vértice se le sume el vector de traslación. Si las transformaciones permitidas por una librería gráfica fueran únicamente traslaciones, esta representación no tendría problema alguno. El inconveniente aparece cuando hay que tomar en cuenta transformaciones del estilo de rotación o escalamiento, y cuando el número de este tipo de transformaciones es considerable en un programa gráfico; en estos casos la manera a proceder es la de aplicar una por una las traslaciones a los vértices de los objetos, algo bastante ineficiente y hasta cierto punto inaceptable. Una ve z estudiado el tema de coordenadas homogéneas se replanteará esta ecuación para hacer más eficiente la aplicación de múltiples transformaciones sobre los vértices de los objetos que componen la escena. Una última aclaración antes de seguir con el siguiente tipo de transformaciones es la siguiente: el decir que la traslación se le aplica a cada uno de los vértices que componen el objeto no es del todo correcta; la traslación se aplica a aquellos vértices que delimitan al objeto. Luego de esto se procede a redibujar el objeto en la nueva posición. Este tipo de transformaciones son conocidas como transformaciones e cuerpos rígidos ya. 16. Gráficas por Computadora (Segunda Edición) – Donald Hearn, M. Pauline Baker Capítulo 5 – Transform aciones geométri cas bidimensionales. 25.

(29) que mueven el objeto sin deformarlo. Luego de haber estudiado la rotación se notará que este es otro tipo de transformación del mismo estilo. 2.2.. Rotación. Una rotación permite cambiar la posición de un objeto a lo largo de la 17 trayectoria de una circunferencia en el plano xy . Para generar una rotación (bidimensional) basta con especificar un ángulo de rotación Ø y la posición (xr, yr) del punto de rotación o punto pivote entorno al cual se gira el objeto. Para definir una rotación en sentido opuesto a las manecillas del reloj se debe especificar un ángulo de rotación positivo; lo contrario sucederá al especificar un ángulo negativo (o mayor a 180 grados). En dos dimensiones esta transformación también puede ser descrita como una rotación sobre un eje de rotación que es perpendicular al plano xy y pasa a través del punto pivote. Para simplificación de los cálculos, las ecuaciones presentadas a continuación asumen que el punto pivote se encuentra en el origen del sistema de coordenadas. Luego se generalizará la idea a puntos de pivote aleatorios. La siguiente ilustración ayudará a comprender las ecuaciones presentadas a continuación.. Figura 1. Al aplicar algunas reglas de trigonometría podemos derivar las ecuaciones que nos darán la rotación desde el punto (x,y) al punto (x’,y’) usando como punto pivote (0,0): x’ = rcos(ø + Ø) = rcosøcosØ – rsenøsenØ, y’ = rsen(ø + Ø) = rcosøsenØ + rsenøcosØ donde Ø es el ángulo de rotación, r es la distancia desde el punto pivote al punto a rotar y ø es el ángulo entre el segmento de distancia r y el eje x. Tomando las coordenadas polares del punto (x, y) podemos reescribir les ecuaciones de rotación de la siguiente manera: 17. Gráficas por Computadora (Segunda Edición) – Donald Hearn, M. Pauline Baker Capítulo 5 – Transform aciones geométri cas bidimensionales. 26.

(30) x = rcosø y = rsenø x’ = xcosØ – ysenØ y’ = xsenØ + ycosØ Utilizando la representación matricial, las ecuaciones de rotación quedan de la siguiente manera: P = [x1 ] [x2]. P’ = [x’1] [x’2]. R = [cosØ [senØ. -senØ] cosØ]. y P’ = R . P. Para generalizar el concepto a puntos de pivote arbitrarios utilizaremos la siguiente ilustración:. Figura 2. Siguiendo el mismo razonamiento trigonométrico, las nuevas ecuaciones de rotación quedan de la siguiente manera: x’ = xr + (x- xr)cosØ - (y- yr)senØ y’ = yr + (x- xr)senØ + (y- yr)cosØ La representación matricial puede adaptarse para incluir los nuevos valores que generalizan la ecuación de rotación para cualquier punto pivote. Debido al excedente de complejidad agregada con esta generalización, la librería gráfica móvil a desarrollar asume la rotación con respecto a un pivote ubicado en el origen del sistema de coordenadas. Al igual que una traslación, una rotación es una transformación de cuerpo rígido; mueve un objeto sin deformarlo.. 27.

(31) 2.3.. Escalamiento. 18 Una transformación de escalamiento altera el tamaño de un objeto . Para lograr esto, cada uno de los vértices del mismo debe ser multiplicado por un factor de escalamiento tanto en su coordenada x como en su coordenada y. Las primeras ecuaciones de escalamiento quedan entonces de la siguiente forma:. x’ = x*sx y’ = y*sy Adaptando estas ecuaciones a la representación matricial, podemos reformular las ecuaciones de escalación para presentarlas de esta manera a continuación: P = [x1 ] [x2]. P’ = [x’1] [x’2]. S = [sx [0. 0] sy]. y P’ = S . P. Para reducir el tamaño de un objeto basta con multiplicar las coordenadas del objeto por un factor de escalamiento menor a 1; lo contrario sucede si este mismo valor supera esta cantidad. Si el factor de escalamiento es igual a 1, el tamaño del objeto no es afectado. Antes de continuar es preciso detallas los distintos casos de escalamiento existentes; una escalamiento uniforme mantiene las proporciones relativas del objeto y se presenta cuando tanto sx como sy son iguales tanto en magnitud como en signo; una escalamiento diferencial se presenta cuando los factores de escalamiento para x y y tienen un valor distinto. La transformación de escalamiento es algo distinta a las dos anteriormente descritas. Además de modificar la posición del objeto, modifica el tamaño del mismo. El reducir el tamaño de un objeto implica también el acercarlo al origen del sistema de coordenadas. De igual manera, el agrandar un objeto implica el alejarlo del origen del sistema de coordenadas. El punto con respecto al cual se realiza la escalamiento se denomina punto fijo, y es posible tener un punto fijo diferente al origen del sistema de coordenadas. Al igual que la rotación, el generalizar esto para cualquier punto fijo aumenta la complejidad de la operación por lo cual la librería gráfica móvil a desarrollar no lo considera viable (OpenGL tampoco lo hace). Se presentan estas ecuaciones únicamente por completitud del estudio del tema: x’ = x f + (x – x f)sx y’ = y f + (y – y f)sy o 18. Gráficas por Computadora (Segunda Edición) – Donald Hearn, M. Pauline Baker Capítulo 5 – Transform aciones geométri cas bidimensionales. 28.

(32) x’ = x*sx + xf(1 – sx) y’ = y*sy + yf(1 – sy) donde (xf , yf) es un punto fijo cualquiera y xf(1 – s x), yf(1 – s y) son constantes para todos los puntos en el objeto.. 2.4.. Representación de Matriz y Coordenadas Homogéneas. Este tema es crucial y su implementación en una librería gráfica impacta directamente la eficiencia y rendimiento de la misma. Las coordenadas homogéneas ayudarán a reformular las ecuaciones matriciales de las transformaciones anteriormente discutidas. De esta manera se facilitará el procesamiento secuencial de múltiples transformaciones. La manera natural de proceder al momento de tratar con múltiples transformaciones es la de aplicar una por una cada transformación a los vértices de los objetos de la escena. Eso implica el cálculo de valores intermedios a partir de las coordenadas originales del vértice para llegar a las coordenadas transformadas del mismo. Un procedimiento más eficiente seria el de combinar primero todas las transformaciones para luego aplicarlas en conjunto a las coordenadas de cada vértice y así obtener e resultado final en un solo paso. Esto sería posible si todas las ecuaciones matriciales de transformación consistieran únicamente de multiplicaciones, pero desafortunadamente este no es el caso de la traslación. Una solución (y la más apropiada por el momento) para este problema en dos dimensiones es el de ampliar las representaciones matriciales de 2*2 a representaciones de 3*3, y ampliar el vector de coordenadas agregándole una más. Las coordenadas cartesianas (x,y) de los vértices pasan entonces a ser coordenadas homogéneas (xh ,yh ,h), donde x = xh/h,. y = yh/h. Esto obliga a que el parámetro homogéneo h sea diferente a 0. Con la introducción de coordenadas homogéneas tenemos infinitas posibilidades de representar un punto (x,y). Un caso especial es aquel donde el parámetro homogéneo es igual a 1; para este caso x es igual a xh. Este es de hecho el caso más común, aunque como veremos en un futuro, las formulaciones de transformaciones de vista tridimensionales necesitan un valor de h distinto de cero.. 29.

(33) Entendido el concepto de coordenadas homogéneas podemos proceder a 19 reformular las ecuaciones de traslación, rotación y escalamiento . Traslación P’ = [x’] [y’] [z’]. T(tx, t y) = [1 [0 [0. 0 1 0. tx ] t y] 1]. P = [x] [y] [1]. P’ = T(t x, t y) . P. P = [x] [y] [z]. . P’ = R(Ø) P. P = [x] [y] [z]. P’ = S(sx,s y) . P. Rotación P’ = [x’] [y’] [z’]. R(Ø) = [cosØ senØ 0] [senØ cosØ 0] [ 0 0 1]. Escalamiento P’ = [x’] [y’] [z’]. S(sx,s y) = [s x 0 0] [0 s y 0] [0 0 1]. Para comprobar la validez de las transformaciones compuestas se presentarán a continuación tres ejemplos de composiciones: dos traslaciones seguidas, dos rotaciones seguidas y dos escalaciones seguidas, cada ejemplo con sus resultados correspondientes. Una vez demostrado esto se utilizará la propiedad asociativa de la multiplicación de matrices para generalizar esto a composiciones de transformaciones de diferentes tipos. Composición de dos traslaciones seguidas T(tx1 , t y1) = [1 0 t x1] [0 1 t y1] [0 0 1 ] . T(tx1 , t y1) T(tx2, t y2) = [1 [0 [0. T(tx2, t y2) = [1 [0 [0 0 1 0. t x1 + t x2] t y1 + t y2] 1 ]. 0 1 0. t x2] t y2] 1]. = T(t x1 + x2 , t y1 + y2). lo que demuestra que dos traslaciones sucesivas son aditivas.. 19. Gráficas por Computadora (Segunda Edición) – Donald Hearn, M. Pauline Baker Capítulo 5 – Transform aciones geométri cas bidimensionales. 30.

(34) Composición de dos rotaciones seguidas R(Ø1) = [cosØ1 -senØ1 0] [senØ1 cosØ1 0] [ 0 0 1]. R(Ø2) = [cosØ2 -senØ2 [senØ2 cosØ2 [ 0 0. 0] 0] 1]. R(Ø1) . R(Ø2) = [cosØ1cosØ2 – senØ1senØ2 –senØ1cosØ2 - cosØ1senØ2 0] [senØ1cosØ2 + cosØ1senØ2 cosØ1cosØ2 – senØ1senØ2 0] [ 0 0 1]. Sea µ = cosØ1cosØ2 – senØ1senØ2 y ß = senØ1cosØ2 + cosØ1senØ2. . R(Ø1) R(Ø2) = [µ [ß [0. -ß 0] = R(Ø1 + Ø2) µ 0] 0 1]. lo que demuestra que dos rotaciones sucesivas son aditivas. Composición de dos escalaciones seguidas S(sx1,s y1) = [s x1 0 0] S(sx2,s y2) = [s x2 0 0] [0 s y2 0] [0 s y1 0] [0 0 1] [0 0 1] . 0] = S(sx1,s y1) S(sx2,s y2) = [s x1*s x2 0 [ 0 s y1*s y2 0 ] [ 0 0 1]. S(sx1* sx2,s y1* s y2). lo que demuestra que dos escalaciones sucesivas son aditivas. Para completar la demostración de la efectividad de la composición de transformaciones se utilizará la propiedad asociativa de la multiplicación de matrices. Esta propiedad se resume en lo siguiente: . . . . Siendo A, B y C matrices cualquiera, (A B) C = A (B C). Si A = T(t x1, t y1), B = R(Ø) y C = S(sx1 ,s y1) y habiendo demostrado que tanto las traslaciones como las rotaciones y escalaciones sucesivas son aditivas, se culmina la demostración de la composición de transformaciones (de igual o diferente tipo).. 2.5.. Transformaciones Geométricas Tridimensionales. Los métodos para las transformaciones geométricas y de modelado de objetos en tres dimensiones se extienden de los métodos bidimensionales al. 31.

(35) 20 . De las tres incluir las consideraciones para la coordenada z transformaciones vistas tal vez la transición menos directa de dos a tres dimensiones la sufre la rotación; en dos dimensiones la rotación siempre se realiza con respecto al eje z. En tres dimensiones no hay tal limitación y la transformación puede realizarse con respecto a cualquier eje arbitrario. La inclusión de la nueva coordenada impacta directamente las ecuaciones matriciales de las transformaciones. Las ecuaciones modificadas son presentadas a continuación.. Traslación P’ = [x’] [y’] [z’] [1 ]. T = [1 0 0 [0 1 0 [0 0 1 [0 0 0. t x] t y] tz] 1]. P = [x] [y] [z] [1]. y P’ = T.P. El cambio de la ecuación matricial únicamente radica en la inclusión de la nueva coordenada y la ampliación de una matriz 3*3 a una 4*4. Rotación Aunque la rotación puede darse con respecto a cualquier eje arbitrario, debido al grado de complejidad que esto le agrega al desarrollo de la librería gráfica móvil, esta posibilidad no fue incluida en la librería. Los casos que si considera la librería gráfica móvil consisten en aquellas rotaciones con respecto a los tres ejes bien definidos (eje x, y y z). Para cada caso hay una ecuación matricial diferente. El primer caso a tratar es la rotación sobre el eje z debido a que ya se detalló en los párrafos dedicados a la rotación en dos dimensiones. Rz(Ø) = [cosØ -senØ 0 [senØ cosØ 0 [ 0 0 1 [ 0 0 0. 0] 0] 0] 1]. Para obtener las siguientes ecuaciones matriciales de rotación basta con realizar una permutación cíclica de los parámetros de coordenadas x, y y z de la ecuación anteriormente enunciada; se deben realizar las siguientes sustituciones: x -> y -> z -> x Una vez realizadas estas sustituciones obtenemos las siguientes ecuaciones matriciales: 20. Gráficas por Computadora (Segunda Edición) – Donald Hearn, M. Pauline Baker Capítulo 11 – Transform aciones geométri cas y de modelado tridimensionales. 32.

(36) 0 0] Rx(Ø) = [1 0 [0 cosØ -senØ 0] [0 senØ cosØ 0] [0 0 0 1] y P’ = [x’] , P= [x] [y’] [y] [z’] [z] [1 ] [1]. Ry(Ø) = [ cosØ 0 senØ 0] [ 0 1 0 0] [-senØ 0 cosØ 0] [ 0 0 0 1] .. y P’ = Rz(Ø) P o . P’ = Rx(Ø) P o . P’ = Ry(Ø) P. Escalamiento P’ = [x’] [y’] [z’] [1 ]. S = [s x 0 0 0] [0 s y 0 0] [0 0 s z 0] [0 0 0 1 ]. P = [x] [y] [z] [1]. y P’ = S .P. El escalamiento, al igual que la traslación, no varía mucho en cuanto a su versión en dos dimensiones; únicamente se le debe agregar una coordenada más a los vértices y ampliar la matriz de transformación de 3*3 a 4*4. El concepto de transformaciones compuestas es igual indistintamente de si las transformaciones actúan sobre un mundo bidimensional o tridimensional, razón por la cual el tema no es retomado en esta sección. 2.6.. Métodos de Despliegue Tridimensional. A fin de obtener un despliegue de una escena tridimensional que se modeló en coordenadas mundiales, primero se debe establecer una referencia de 21 coordenadas para la “cámara” . Esta referencia de coordenadas define la posición y orientación para el plano de la película de la cámara, que es el plano que deseamos utilizar para desplegar la vista de los objetos de una escena. De esta manera se transfieren las descripciones de los objetos a las coordenadas de referencia de la cámara y se proyectan sobre el plano de despliegue que se selecciona. La librería gráfica móvil a desarrollar fija la posición y orientación de la cámara desde un principio. Esto se debe a que es la primera versión del proyecto y se le dio prioridad a las transformaciones de modelo vista (en 21. Gráficas por Computadora (Segunda Edición) – Donald Hearn, M. Pauline Baker Capítulo 9 – Conceptos tridimensionales. 33.

Referencias

Documento similar

Para ello, trabajaremos con una colección de cartas redactadas desde allí, impresa en Évora en 1598 y otros documentos jesuitas: el Sumario de las cosas de Japón (1583),

Sanz (Universidad Carlos III-IUNE): &#34;El papel de las fuentes de datos en los ranking nacionales de universidades&#34;.. Reuniones científicas 75 Los días 12 y 13 de noviembre

(Banco de España) Mancebo, Pascual (U. de Alicante) Marco, Mariluz (U. de València) Marhuenda, Francisco (U. de Alicante) Marhuenda, Joaquín (U. de Alicante) Marquerie,

En cuarto lugar, se establecen unos medios para la actuación de re- fuerzo de la Cohesión (conducción y coordinación de las políticas eco- nómicas nacionales, políticas y acciones

D) El equipamiento constitucional para la recepción de las Comisiones Reguladoras: a) La estructura de la administración nacional, b) La su- prema autoridad administrativa

b) El Tribunal Constitucional se encuadra dentro de una organiza- ción jurídico constitucional que asume la supremacía de los dere- chos fundamentales y que reconoce la separación

Ciaurriz quien, durante su primer arlo de estancia en Loyola 40 , catalogó sus fondos siguiendo la división previa a la que nos hemos referido; y si esta labor fue de

En este trabajo estudiamos la obra poética en español del escritor y profesor argelino Salah Négaoui, a través de la recuperación textual y análisis de Poemas la voz, texto pu-