You are on page 1of 7

Universidad Nacional Mayor de San Marcos Facultad de Ingeniería de Sistemas e Informática E.A.P.

Ingeniería de Sistemas e Informática Departamento Académico de Ciencias de la Computación Laboratorio de Computación Grafica 2011 II

Listas de Visualización en OpenGL

Laboratorio 07

Listas de Visualización en OpenGL
Las Display List permiten una programación más transparente.

Objetivo: El objetivo de esta práctica, es que el alumno conozca y sepa cómo aplicar los principales comandos de manejo de listas de visualización en OpenGL, esto es, con la intención de estructurar el diseño de los objetos geométricos, además de hacer más legible el código y por supuesto de obtener un menor tiempo de respuesta en la aplicación. Duración de la Práctica: 2 Horas. Lugar de realización: Laboratorio de cómputo. El conocimiento requerido para realizar esta práctica es de haber asimilado los conceptos básicos de Visual C++ y OpenGL. El desarrollo tendrá la siguiente estructura de temas: 1. 2. 3. 4. Listas de visualización Programa ejemplo con OpenGL Ejercicios propuestos Referencias

Mg. Johnny R. Avendaño Q.

Pag. No. 1

glVertex2f(x.i++){ x=radio*cos(i*2*pi/1000). se lleva a cabo mucho computo numérico.y). glEnd(). glBegin(GL_POLYGON) for(i=0. } glEnd(). coordenada[i][1]). LISTAS DE VISUALIZACIÓN Usualmente en cada escena es necesario mostrar un mismo objeto geométrico bajo ciertas condiciones propias del guión. Glfloat x. obviamente bajo otro esquema de trabajo. almacenar primero las coordenadas en un tabla (puede ser un arreglo) y luego usarla cada vez que se necesite renderizar el dibujo. } Se puede hacer las pruebas necesarias incrementando la variable i. y no será necesario calcular las coordenadas como era el caso anterior.i++){ coordenada[i][0]=radio*cos(i*2*pi/1000).i++) glVertex2f(coordenada[i][0]. a esto hay que sumarle la posibilidad de que se involucre riqueza visual. static Glfloat coordenada[1000][2] for(i=0. esto usualmente puede hacer mas lento la aplicación gráfica.radio=5. Esto es en esencia.y. } Esta técnica se vuelve ineficiente debido a los cálculos trigonométricos necesarios cada vez que se pida renderizar el círculo.i<1000. Mg. Pag. coordenada[i][1]=radio*sin(i*2*pi/1000). Una forma de evitar esto es. No. 2 .P. Avendaño Q. /* mas codigo … */ glEndList(). Para hacer uso de una Lista de Visualización. Por ejemplo: Glint i. Johnny R. y=radio*sin(i*2*pi/1000). Un ejemplo simple es el código siguiente: Void dibujar_circulo(Glfloat radio) { Glint i.Universidad Nacional Mayor de San Marcos Facultad de Ingeniería de Sistemas e Informática E. } // Extracción y encapsulamiento de los datos // Ya no es necesario calcularlos Void dibujar_circulo(void) { glBegin(GL_POLYGON) for(i=0.A. es decir. debemos utilizar la función: glNewList(miLista. Ingeniería de Sistemas e Informática Departamento Académico de Ciencias de la Computación Laboratorio de Computación Grafica 2011 II Listas de Visualización en OpenGL 1. observe que ahora sólo se accederá a la tabla de datos (al arreglo) cada vez de que desee renderizar el círculo. parametroLista).i<1000.i<1000. Glfloat x. cuando se pretende usar una Lista de Visualización.y.

Todo el código que se encuentra entre estas dos órdenes pasa a ser parte de la lista definida por glNewList mencionada líneas arriba. Si usted precisa de trabajar con múltiples listas. almacenar y ejecutar de una vez. No. Ahora cada vez que necesitemos esta lista. A continuación veamos la respectiva codificación usando una lista de visualización para el ejemplo anterior del círculo: #define miListaCirculo 1 void construye_circulo(Glfloat radio) { Glint I.0.i++){ x=radio*cos(i*2*pi/1000).y. Ingeniería de Sistemas e Informática Departamento Académico de Ciencias de la Computación Laboratorio de Computación Grafica 2011 II Listas de Visualización en OpenGL Donde:  miLista: es un entero que sirve para indexar una o más listas. la invocaremos o llamaremos con el comando: glCallList(miLista).  parametroLista: puede ser:  GL_COMPILE: que le indica a OpenGL que solamente compile y almacene la lista. en la cual se renderiza una lista llamando a otras para mostrar un objeto mayor: glNewList(listIndex.0.P.0.0. Pag. glNewList(miListaCirculo. glCallList(rueda). glCallList(rueda).0). glTranslatef(3. a continuación se muestra un código empleando listas de visualización.GL_COMPILE).y).0. } Nuestro ejemplo es muy modesto pero trata de ser lo más claro y didáctico posible. glCallList(timon). y=radio*sin(i*2*pi/1000). glEndList().GL_COMPILE). glBegin(GL_POLYGON) for(i=0. } glEnd(). Por ejemplo.  GL_COMPILE_AND_EXECUTE: le indica a OpenGL que tiene que compilar.A. Mg.0. Johnny R. esta identificación será única.0. glEndList(). para ello se sugiere consultar el texto OpenGL Programming Guide – The Red Book.0). Glfloat x. glCallList(asiento). glTranslatef(1.i<1000. estas pueden ser indexadas o también se puede usar listas de visualización jerárquicas.0. glVertex2f(x. 3 . probaremos una de sus tantas ventajas al implementar el taller de esta clase. Avendaño Q.Universidad Nacional Mayor de San Marcos Facultad de Ingeniería de Sistemas e Informática E.

sobre el código usual para completar un giro sobre uno de los ejes coordenados. glEndList(). Ingeniería de Sistemas e Informática Departamento Académico de Ciencias de la Computación Laboratorio de Computación Grafica 2011 II Listas de Visualización en OpenGL El siguiente ejemplo muestra de manera simple cómo construir un polígono (triangulo) en función de sus vértices: glNewList(1. glVertex3f(v2). obtuve una razón de 1.75 mas rápido usando listas de visualización. diseñado con Listas de Visualización.GL_COMPILE). usted tendrá una idea del potencial de esta técnica (listas de visualización) para sus posteriores desarrollos de aplicaciones más complejas. diseñado sin listas de visualización. 2. 2. Además de controlar las rotaciones con respecto a los 3 ejes coordenados sobre cada toroide. glCallList(1). glEnd().GL_COMPILE). Figura No. empleando glut. Johnny R. Para este efecto. glNewList(2. glEndList(). y = R sen α ) r cos β ) ( ) ( + ( sen α z = R sen β ) ( Mg.A.GL_COMPILE).P. 1. glEndList(). Avendaño Q. glNewList(4. Un toroide. Un toroide. Representación alámbrica del toro Recuerde que las ecuaciones del Toro (véase la figura anexa) son como sigue: x = R cos( ) r cos β ) α + ( cos( )R > r α . glVertex3f(v1). PROGRAMA EJEMPLO CON OPENGL Implemente un programa sobre el Laboratorio # 03 y el Laboratorio # 05 (transformaciones geométricas y menús jerárquicos). glEndList(). glCallList(2).Universidad Nacional Mayor de San Marcos Facultad de Ingeniería de Sistemas e Informática E. Pag. Un toroide (ver final de la guía). 3. Con esto.GL_COMPILE). glNewList(3. Sobre cada ítem deberá agregar el respectivo submenú para modificar el número de lados que lados con se aproxima la circunferencia de radio menor y mayor. en esta implementación el usuario podrá escoger desde el menú desplegable: 1. glCallList(3). glBegin(GL_POLYGON). pero recuerde que esto también depende del performance de su PC. glVertex3f(v3). 4 . No.

No. El toroide con 7 lados y con 20 lados respectivamente El Toroide (texto extraído de Wikipedia): “Un toro es la superficie de revolución engendrada por una circunferencia que gira alrededor de una recta fija de su plano. Johnny R. Avendaño Q. Pag. Ingeniería de Sistemas e Informática Departamento Académico de Ciencias de la Computación Laboratorio de Computación Grafica 2011 II Listas de Visualización en OpenGL Donde α y β pertenecen al intervalo [0. El toroide es una (los resultados de un programa basado en superficie cerrada OpenGL) el toro representado mediante un mallado poligonal de 7 lados para cada arco en la figura adyacente a la izquierda. “El toro genera un hueco en su interior. En la figura Nº 2 nos sugiere. lo cual es cierto. La palabra toro proviene del vocablo en latín torus. apropiando la forma semejante a un neumático recargado. describen cualquier punto sobre la superficie del Toro. que no es más que un objeto tridimensional parecido a la cámara de aire que son empleadas en el interior de los neumáticos de los automóviles. así las ecuaciones mostradas arriba. 3. que no la corta. 2. en la figura Nº 3 se muestra Figura No.P. 5 . el cual en castellano significa "bulto".Universidad Nacional Mayor de San Marcos Facultad de Ingeniería de Sistemas e Informática E. Mg. y 20 lados para la figura adyacente a la derecha: Figura No. Un toro sólido (vollringe) es un objeto tridimensional construido 2 1 mediante el producto cartesiano de un disco y un círculo: D xS ”.A. o a una dona o rosquilla”. que el toroide (o Toro) es una superficie y no un volumen. ya sea "volumen o tamaño de una cosa" o "elevación de una superficie causada por una protuberancia".2π] En la figura Nº 1 se muestra el toroide. A continuación.

6 A . } } glEnd(). x. estas pirámides y cubos tendrían sus propias características que se definirán en los siguientes talleres. Las 3 ruedas están girando sobre los puntos A. La ubicación geométrica será escogida o indicada en el programa según sea su criterio. puede fijar según su conveniencia. Anexo: Código propuesto por D. Silicon Graphics. k >= 0.1*cos(s*twopi/numc))*cos(t*twopi/numt).P. y = (1+. t. Ingeniería de Sistemas e Informática Departamento Académico de Ciencias de la Computación Laboratorio de Computación Grafica 2011 II Listas de Visualización en OpenGL 3. int numt) { int i.1997. j++) { for (k = 1. B y C en el sentido anti horario. k. EJERCICIOS PROPUESTOS Ejercicio 01: Emplee listas de visualización y menús jerárquicos para agregar o quitar uno o más toroides de una misma ventana grafica. Copyright (c) 1993 .5. además podrá modificar los colores desde el menú desplegable. i < numc.1*cos(s*twopi/numc))*sin(t*twopi/numt). Debe considerar las velocidades angulares para cada rueda de tal forma que los giros sean coherentes.A. for (i = 0.Universidad Nacional Mayor de San Marcos Facultad de Ingeniería de Sistemas e Informática E. k--) { s = (i + k) % numc + 0. j. y. de preferencia de colores diferentes. x = (1+.1 * sin(s * twopi / numc). lo que se quiere es simular un centro arqueológico. Shreiner. Mg. twopi = 2 * PI_. Estas tres ruedas serán diseñadas empleando toroides (en 3D). i++) { glBegin(GL_QUAD_STRIP). Ejercicio 02: Emplee listas de visualización para definir los objetos en forma de pirámides y cubos. z). No. Pag. Johnny R. Así. } } Ejercicio 03: Diseñe una aplicación empleando exclusivamente listas de visualización para el siguiente conjunto de ruedas en la figura adjunta. static void torus(int numc. twopi. C B La faja (de color rojo) tiene una longitud constante. for (j = 0. Inc. la cual tendrá como base un plano (que hará la vez de terreno). z = . Avendaño Q. que Ud. Además emplee según su criterio la elaboración de otras construcciones en función de las anteriores. La rueda en el punto C tiene la mitad del diámetro de las otras ruedas restantes. j <= numt. y. empleando menús jerárquicos Usted podrá activar o desactivar tales objetos de la escena. glVertex3f(x. z. double s. t = j % numt.

Feiner and J. Principles and Practice (Second Edition). Inc 1996 4. Hughes Computer Graphics. 2. S.A. Kilgard. Sweet. R. No. Wikipedia. 1990. Inc 1998. Mark J. A.wikipedia. 5. The OpenGL Utility Toolkit (GLUT) Programming Interface (API Version 3). Avendaño Q. Pag. OpenGL Superbible. Mark Segal & Kurt Akeley. Addison-Wesley.Universidad Nacional Mayor de San Marcos Facultad de Ingeniería de Sistemas e Informática E. La representación es 3D con alguna rotación incluida (mínimo un eje). mientras que faja será representada por una línea gruesa. (enlace) http://es. Waite Group. la enciclopedia libre. Ejercicio 04: Encapsule una curva de Bézier empleando Listas de Visualización.. Ejercicio 05: Emplee Listas de Visualización para invocar la cápsula convexa así como desactivarla (haga uso de los menús jerárquicos según su criterio). REFERENCIAS 1. 4.F. Wright and M. Johnny R.P.org/wiki/ Mg. Las ruedas serán representadas con un toroide. Silicon Graphics. Considere las medidas apropiadas según su buen criterio. Inc 1999. 7 . además incorpore el algoritmo de Casteljau para diseñar la curva de Bézier.2). También puede activar o desactivar el movimiento de los puntos de control con ayuda del mouse.van Dam. 3.K. Ingeniería de Sistemas e Informática Departamento Académico de Ciencias de la Computación Laboratorio de Computación Grafica 2011 II Listas de Visualización en OpenGL Es opcional el uso de menús jerárquicos para activar las propiedades de este sistema de ruedas.Foley J. D. The OpenGL Graphics System: A Specification (Version 1. Silicon Graphics.