1. INTRODUCCIÓN A OPENGL: DIBUJANDO UNA TORTUGA CON OPENGL

Documentos relacionados
TECNUNLOGO: UN LOGO EN TRES DIMENSIONES

3.- Vista Tridimensional.

glclearcolor (1.0, 0.0, 0.0, 0.0); glclear(gl_color_buffer_bit GL_DEPTH_BUFFER_BIT);

8 3D MODELER. Las vistas son: - Vista Y-Z: vista del alzado del dibujo. - Vista X-Z: vista del perfil del símbolo. Las Vistas

6. TIPOS DE FUENTES DE LUZ

Práctica 2 Sólidos Articulados (Asignación 2 de Marzo; Entrega 23 de Marzo a las 23:59)

Modulo 1 El lenguaje Java

11. Algunas clases estándar de Java (II)

Manual de usuario para Android de la aplicación PORTAFIRMAS MÓVIL

NORMA (SEPA) 22/11/2013

Para ingresar a la aplicación Microsoft PowerPoint 97, los pasos que se deben seguir pueden ser los siguientes:

Elementos de Microsoft Word

Recursos de Aprendizaje

CÓMO CREAR NUESTRO CATÁLOGO

PRISMA OBLICUO > REPRESENTACIÓN Y DESARROLLO POR EL MÉTODO DE LA SECCIÓN NORMAL

Transformaciones con OpenGL

Introduccion al Lenguaje C. Omar Andrés Zapata Mesa Grupo de Fenomenología de Interacciones Fundamentales, (Gfif) Universidad de Antioquia

Reservas - Rooming List

La ventana de Microsoft Excel

Que es Velneo vdataclient V7?

MANUAL DE USUARIO DE LA HERAMIENTA CONFIGURACION DE PRESUPUESTOS PARA DISTRIBUIDORES

Dpto. Lenguajes y Ciencias de la Computación E.T.S.I. Telecomunicación. Laboratorio de Programación Introducción a Allegro con Dev-C++

Creado dentro de la línea de sistemas operativos producida por Microsoft Corporation.

Figura 1 Abrir nueva hoja de cálculo

INSTITUTO POLITÉCNICO NACIONAL ESCUELA SUPERIOR DE INGENIERÍA MECÁNICA Y ELÉCTRICA UNIDAD CULHUACÁN INTEGRANTES

Introducción al diseño híbrido con ZW3D

Traslaciones, Homotecias, Giros y Simetrías

WinHIPE: edición, compilación y ejecución de programas; y generación de animaciones web. Manual de usuario.

Práctica 2: Simón dice

Planilla de cálculo. Módulo II - OpenOffice.org Calc

Capítulo 8 Ficheros de Configuración

Introducción a la programación orientada a objetos

Índice. Esta Guía rápida del usuario le ayudará a empezar a utilizar IRISPen TM Executive 7.

INTRODUCCIÓN A OpenGL

Filtro de Contenidos: Manual de Usuario. CONSEJERÍA DE EDUCACIÓN Agencia Pública Andaluza de Educación Servicio Integral de Atención Digital

Retrospect 9 para Mac Anexo de la Guía del usuario

MANEJANDO FICHEROS Y CARPETAS

OBTENER DATOS EXTERNOS

e-conocimiento Manual de uso

Operación de Microsoft Word

1 MANUAL DE INSTALACIÓN

ENTORNO DE TRABAJO DE WORD 2007

_ Antología de Física I. Unidad II Vectores. Elaboró: Ing. Víctor H. Alcalá-Octaviano

Sean los vectores a = (4, -2, 3) y b = (3, 2, 1), y sean las operaciones siguientes: ( 3, 2,1) ( 33, 22,11)

El proceso de edición digital en Artelope y CTCE

Manual Impress Impress Impress Impress Impress Draw Impress Impress

Ejercicio 1. Desarrollar un pequeño juego para practicar mecanografía.

HERRAMIENTAS DE PHOTOSHOP

ISTP CIDET COMPUTACION E INFORMATICA ARREGLOS EN JAVA

Tutorial de Introducción a la Informática Tema 0 Windows. Windows. 1. Objetivos

MANUAL DE AYUDA HERRAMIENTA DE APROVISIONAMIENTO

MANUAL DE AYUDA MÓDULO GOTELGEST.NET PREVENTA/AUTOVENTA

Microsoft Office XP Excel XP (I)

Uso del programa CALC

RAPID TYPING. Qué es?

TEMA 2. HERRAMIENTAS DE GeoGebra

Práctica 1. Introducción al SIEMENS 80C167

GUÍA BÁSICA DE USO DEL SISTEMA RED

Guía de uso de Moodle para participantes

Ayuda para la instalación Componente Firma Digital INDICE. 1 Configuración previa Configuración Internet Explorer para ActiveX...

SOLUCION EXAMEN junio 2006

PROGRAMACIÓN ORIENTADA A OBJETOS

Soporte lógico de computadoras

GUÍA RÁPIDA DE TRABAJOS CON ARCHIVOS.

EDICIÓN Y FORMATO (II)

Operación de Microsoft Excel. Guía del Usuario Página 79. Centro de Capacitación en Informática

CONTROL Y PROGRAMACIÓN DE ROBOTS

Mini Manual de OpenGL Por Daniel Barrero - 11/6/2002

Manual de usuario. Modulo Configurador V.1.0.1

Introducción al tipo de dato ARRAY

INFORMACIÓN PARA LA INSTALACIÓN DE CERTIFICADOS

Índice general de materias LECCIÓN 7 74

PRÁCTICA DE LABORATORIO 3 Tipo Abstrato de Dato

1. Teclado tradicional, principal o alfanumérico

Tema: Sobrecarga de Operadores.

Informática Aplicada a la Gestión de Empresas (IAGE) Parte III Excel e Internet Tema 2

VAST: Manual de usuario. Autores: Francisco J. Almeida-Martínez Jaime Urquiza-Fuentes

MACROS Y FORMULARIOS

SISTEMAS OPERATIVOS AVANZADOS

TIPOS DE RESTRICCIONES

Tema 6. Reutilización de código. Programación Programación - Tema 6: Reutilización de código

Teclado sobre una PDA para Personas con Parálisis Cerebral

CASO PRÁCTICO DISTRIBUCIÓN DE COSTES

Sea el siguiente programa de nombre "c0p1" para copiar archivos (por simplicidad se ha eliminado todo control de errores): Se pide:

Manual de usuario de Solmicro BI. Página 1

Para crear formularios se utiliza la barra de herramientas Formulario, que se activa a través del comando Ver barra de herramientas.

Unidad III El lenguaje de programación C

Figura 4.1 Clasificación de los lenguajes de bases de datos

Para ingresar a la aplicación Microsoft Word 97, los pasos que se deben seguir pueden ser los siguientes:

Ingreso al Sistema Administrador

Este programa mueve cada motor de forma independiente, y cuando termina una línea pasa a la siguiente.

15. ANEXO # 5 GAMEPLAYOBJECT

Muchos programas de aplicación contienen herramientas para proteger la información, por ejemplo, Microsoft Word que te permite:

Instructivo de Microsoft Excel 2003

Unidad: Representación gráfica del movimiento

MATEMÁTICAS CON LA HOJA DE CÁLCULO

INTRODUCCIÓN AL TIPO COMPUESTO CADENA CONTENIDOS

OPERADORES LÓGICOS Y DE COMPARACIÓN EN PHP. PRIORIDADES. EJEMPLOS. EJERCICIOS RESUELTOS. (CU00818B)

Capítulo 2. Cuestiones previas

Navegación en SAP ECC. Junio 2012

Transcripción:

1. INTRODUCCIÓN A OPENGL: DIBUJANDO UNA TORTUGA CON OPENGL 1.1 QUÉ ES OPENGL? Qué es OpenGL? OpenGL es una interfaz software de harware gráfico, es decir define las funciones que se pueden utilizar en una aplicación para acceder a las prestaciones de un dispositivo gráfico. Es un motor 3D cuyas rutinas están integradas en tarjetas gráficas 3D. Fue desarrollado por Sillicon Graphics, Inc. (SGI) con el afán de hacer un estándar de representación en 3D. Es compatible con prácticamente cualquier plataforma harware asi como con muchos lenguajes de programación (C, C++, Visual Basic, Visual Fortran, Java). 1.2 ABRIENDO UNA VENTANA CON OPENGL El objetivo de este primer ejercicio es abrir una ventana con OpenGL. Se describe como realizar el proceso en Visual C++, para otros entornos el proceso es similar. Para ello es necesario abrir un nuevo proyecto en Visual C++ del tipo Console Application. Para poder ejecutar las librerias GLUT de OpenGL es necesario incluir en los siguientes lugares, si no se encuentran ya, los ficheros que se indican (se pueden obtener en el web de la asignatura en: http://www.tecnun.es/asignaturas/grafcomp/opengl/files/): - glut32.dll se debe situar en windows\system(32) - glut32.lib se debe situar en DevStudio\Vc\lib - glut.h se debe situar en DevStudio\Vc\include\gl También es necesario incluir las librerías opengl32.lib, glu32.lib y glut32.lib en la lista de librerías del proyecto, en el caso de Visual C++ se accede en Project > Settings > Link > Object/Library Modules. Se añade un fichero de tipo texto y nombre tecnunlogo.c, mediante File > New /Text File. En esta práctica se va a trabajar en un único archivo con extensión llamado tecnunlogo.c cuyo código es el siguiente: #include <GL/glut.h> int main(int argc, char** argv) { glutinit(&argc, argv); glutinitdisplaymode(glut_rgb GLUT_DEPTH GLUT_DOUBLE); glutinitwindowsize(512, 512); glutinitwindowposition(20, 20); glutcreatewindow("tecnunlogo"); glutdisplayfunc(display); glutmainloop(); return 0;

Para poder utilizar las librerías OpenGL y GL Utility Toolkit (GLUT) es necesario incluir el archivo glut.h como se muestra en la primera línea de código. En la función main(), glutinit() es la función que inicializa la librería GLUT y negocia con el sistema de ventanas la apertura de una nueva ventana. Sus parámetros deben ser los mismos que los de la función main() sin modificar. A continuación, glutinitdisplaymode() define el modo en el que se debe dibujar la ventana. Sus parámetros, como en muchas de las funciones OpenGL, se definen con flags o máscaras de bits. En este caso, GLUT_RGB indica el tipo de modelo de color con el que se dibujará (Red-Green-Blue), GLUT_DEPTH indica que se debe incluir un buffer de profundidad y GLUT_DOUBLE que se debe utilizar un doble buffer. Antes de crear una ventana, es necesario definir sus propiedades. Con la función glutinitwindowsize() se define el tamaño de la ventana en píxeles (anchura y altura) y con la función glutinitwindowposition(), la distancia horizontal y vertical con respecto de la esquina superior izquierda del monitor donde la ventana deberá aparecer. Finalmente, con la función glutcreatewindow() se crea propiamente la ventana, y el string que se pasa como argumento, es utilizado como nombre de la nueva ventana. Ahora que la ventana ha sido creada, es necesario mostrarla. Para ello la función main llama a la función glutdisplayfunc(). Esta función es la más importante de las funciones callback. Gracias a la definición de las funciones callback, GLUT hace posible una dinámica de programación de aplicaciones OpenGL. Una función callback será llamada por GLUT para hacer alguna operación especifica cada vez que se produzca un evento. En este caso, glutdisplayfunc(display), define que la función display que es pasada como argumento sea ejecutada cada vez que GLUT determine que la ventana debe ser dibujada (la primera vez que se muestra la ventana) o redibujada (cuando se maximiza, cuando se superponen varias ventanas, etc). La ultima función que es llamada en el main es glutmainloop(). Esta función se encarga de pasar el control del flujo del programa a la GLUT, de manera que cada vez que ocurra un evento sean llamadas las funciones definidas como callbacks hasta que el la ventana se cierre. La función display(), definida como función callback para dibujar o redubujar la ventana cada vez que sea necesario, esta también contenida en el archivo tecnunlogo.c. Como todas las funciones callback que serán utilizadas, display() es del tipo void. Como este ejercicio es bastante simple y no se va a dibujar ninguna figura en la ventana, el contenido de la función es bastante sencillo. En ella solo se van a definir las funciones que siempre deben aparecer en cualquier función display callback. void display(void) { glclearcolor(1.0, 1.0, 1.0, 0.0); glclear(gl_color_buffer_bit GL_DEPTH_BUFFER_BIT); glutswapbuffers(); La función display() se debe incluir antes de la función main() para que no se produzca un error al compilar cuando se utiliza en la función main(). La función glclearcolor() establece el color de fono de la ventana, que es con el que se borra la ventana. A continuación se llama, antes de dibujar cualquier cosa, a la función glclear(). Esta función se encarga de borrar el fondo de la ventana.

Acepta como argumento el buffer específico que se desea borrar, en este caso el GL_COLOR_BUFFER_BIT y el GL_DEPTH_BUFFER_BIT. La función glswapbuffers() se encarga de intercambiar el buffer posterior con el buffer anterior y es necesaria porque se ha definido que se trabaja con doble buffer. Cuando se dibuja cualquier figura, esta es dibujada en el buffer posterior (el que está atrás) y cuando el dibujo está terminado los dos buffers se intercambian. El resultado de ejecutar este proyecto es el que se muestra en la figura 1: 1.3 DIBUJANDO UN TOROIDE EN LA VENTANA El objetivo de este ejercicio es dibujar, en la ventana del ejercicio anterior, un toroide con un cubo inscrito en su interior. Para ello será necesario incluir algunas operaciones más en la función display(): void display(void) { glclearcolor(1.0, 1.0, 1.0, 0.0); glclear(gl_color_buffer_bit GL_DEPTH_BUFFER_BIT); glcolor3f(1.0,0.0,0.0); glutwiretorus(0.25,0.75, 28, 28); glcolor3f(0.0,0.0,1.0) ; glutwirecube(.60) ; glutswapbuffers(); En este ejemplo serán introducidas tres nuevas funciones GL (una función OpenGL y dos funciones GLUT). La función OpenGL glcolor3f() establece el color actual con el que se va a dibujar una figura. El color será el mismo hasta que se cambie el estado de esta variable con la función glcolor3f nuevamente. Esto es lo que se quiere decir cuando se habla de OpenGL como una maquina de estados. Todas las funciones de OpenGL comienzan con el prefijo gl y en muchas (como es el caso de glcolor3f) aparece un sufijo compuesto por un número y una letra. El número simboliza el numero de parámetros que se debe pasar a la función y la letra, el tipo de estos parámetros. En este caso, se deben pasar 3 parámetros de tipo float. Al estar trabajando en un modelo de color de tipo RGB (Red-Green-Blue), cada uno de estos parámetros representa el valor de cada color respectivamente. La función GLUT glutwiretorus(0.25, 0.75, 28, 28) dibuja un toroide de frame de hilos cuyo radio interno es el double 0,25; radio externo el double 0,75; el primer entero 28 representa el numero de lados que se puede observar en cada sección radial y el segundo entero 28 el numero de divisiones radiales del toroide. La función GLUT glutwirecube(0.60) dibuja un cubo cuyo tamaño queda determinado por su único parámetro de valor float. El resultado es el que se muestra en la figura: Figura 1 Ventana inicial Dibujar los ejes del sistema de coordenadas de la ventana utlilizando los colores rojo, verde y azul (RGB) para los ejes x, y, z correspondientemente.

Dibujar en la ventana las diferentes primitivas de GLUT (se pueden encontrar en el tutorial de OpenGL en el web de la asignatura). 1.4 DEFINIENDO EL ÁREA DE PROYECCION INICIAL Una vez que se ha dibujado un objeto en la ventana es necesario definir el área de proyección inicial que se desea de la figura en la ventana. Para ello se debe manipular el área de proyección por medio de la función Figura 2 Ventana con toroide y cubo callback glutreshapefunc(). Esta función callback especifica cuál función será llamada cada vez que la ventana sea redimensionada o movida, pero también es utilizada para definir inicialmente el área de proyección de la figura en la ventana. Muchas de las funciones que OpenGL pone a disposición para definir la proyección están basadas en matrices de transformación que, aplicadas sobre el sistema de coordenadas de la ventana, definen el punto desde donde será observada la figura. Estas matrices y sus transformaciones se explicarán con más detenimiento en el siguiente capitulo. Antes de explicar el código de este ejercicio es conveniente recordar la disposición del sistema de coordenadas de OpenGL, en el que el eje vertical es el Y y el eje de visión por defecto es el Z. Y+ Y+ Z+ X+ X+ Z+ Observador Figura 3 Sistema de Coordenadas de OpenGL La función glutreshapefunc(reshape) debe ser incluida en el código de la función main(): glutreshapefunc(reshape); A continuación se define la funcion reshape(): void reshape(int width, int height) { glviewport(0, 0, width, height); glmatrixmode(gl_projection); glloadidentity(); gluperspective(60.0, (GLfloat)height / (GLfloat)width, 1.0, 128.0); glmatrixmode(gl_modelview); glloadidentity();

glulookat(0.0, 1.0, 3.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); De nuevo, como toda función callback, la función reshape() es del tipo void. Se le pasan como argumentos el ancho y el alto de la ventana después del reescalado. La función glviewport define la porción de ventana donde OpenGL podrá dibujar. Sus parámetros son: primero la distancia horizontal y vertical de la esquina superior izquierda del cuadro donde OpenGL puede dibujar con respecto a la ventana; segundo, el ancho y alto de la ventana. A continuación, glmatrixmode() especifica la matriz de transformación sobre la que se van a realizar las operaciones siguientes (de nuevo, recordar que OpenGL es una maquina de estados). Los tres tipos de matrices que existen son: matriz de proyección (GL_PROJECTION), matriz de modelado (GL_MODELVIEW) y matriz de textura (GL_TEXTURE). En este caso, glmatrixmode(gl_projection) afecta la perspectiva de la proyección. La función glloadidentity() carga como matriz de proyección la matriz identidad. Esto es como inicializar a uno los valores de dicha matriz. gluperspective() opera sobre la matriz de proyección y define el ángulo del campo de visión en sentido vertical (en grados), la relación entre la altura y la anchura de la figura (aspecto), el plano más cercano a la cámara y el plano más lejano de la cámara, respectivamente. Estos dos últimos son los planos de corte, que son los que se encargan de acotar el volumen de visualización por delante y por detrás de la figura. Todo lo que esté por delante del plano más cercano y todo lo que esté detrás del plano más lejano no será representado en la ventana. Ahora, glmatrixmode(gl_modelview) define que las operaciones que se realicen a continuación afectarán a la matriz de modelado. Nuevamente se carga la matriz identidad por medio de la función glloadidentity. A continuación, glulookat() define la transformación sobre la vista inicial. Esta función junto con gluperspective() se explican con detalle en el capítulo 3, pero aquí se hacer una rápida descripción. La función glulookat() tiene 9 parámetros: los primeros tres representan la distancia en x, y, z de los ojos del observador; los siguientes tres, las coordenadas x, y, z del punto de referencia a observar y los últimos tres, la dirección del upvector. Modificar la función glview port de manera que al alargar la ventana la figura no se deforme. Se logra haciendo que el viewport sea siempre cuadrada, de dimensión el menor de los valores de la altura y la anchura. El valor de la relación entre la altura y la anchura para la función gluperspective() es ahora siempre 1. Probar diferentes vistas iniciales con la función glulookat. 1.5 INTERACTUANDOCON EL TECLADO El objetivo de este ejercicio es añadir la posibilidad de interactuar desde el teclado del ordenador con la figura representada en la ventana. De nuevo utilizaremos una función callback para este propósito, ya que es la GLUT, por medio de este tipo de funciones, quien gestiona cualquier tipo de evento. Es necesario incluir en el main del programa la función callback glutkeyboardfunc(keyboard): glutkeyboardfunc(keyboard);

La función keyboard() que es pasada como parámetro será llamada cada vez que ocurra un evento en el teclado. Se define a continuación la función keyboard(): void keyboard(char key, int x, int y) { switch (key) { case h : printf("help\n\n"); printf("c printf("q/escape case c : if (glisenabled(gl_cull_face)) gldisable(gl_cull_face); else glenable(gl_cull_face); case 1 : glrotatef(1.0,1.,0.,0.); case 2 : glrotatef(1.0,0.,1.,0.); case q : case 27: exit(0); glutpostredisplay(); - Toggle culling\n"); - Quit\n\n"); Un bucle switch-case se encarga de identificar que tecla ha sido pulsada. Si la tecla presionada es la h, se escribirán en la pantalla de la consola las indicaciones del funcionamiento del programa. Con las funciones glenable(gl_cull_face) y gldisable(gl_cull_face) se muestran o se ocultan las líneas de las caras traseras de la figura. Si la tecla es la c y las líneas traseras están activadas, entonces se desactivan. En caso contrario, se activan. La tecla 1 hará que la figura rote por medio de la función glrotatef() cuyos parámetros corresponden al ángulo a rotar y a los componentes x, y, z del eje sobre el que va a rotar la figura. Se habla en todo momento que es la figura quien va a rotar porque es la matriz de modelado la ultima que fue cargada. La tecla 2 hará que la figura rote en el eje y. Esta función y su efecto en la matriz de modelado se trata en el siguietne capítulo. Finalmente, la tecla q produce la finalización del programa. En la figura 4 se muestra el efecto de rotar la figura con las teclas 1 y 2. Es importante observar que al final de la función keyboard() esta Figura 4 Ventana con respuesta al teclado

Figura 6 Tortuga con WireSphere s la llamada a la función GLUT glutpostredisplay(). Esta función da la indicación a la GLUT que es necesario redibujar la ventana. Si no se incluyera esta rutina, OpenGL no sabría que tiene que redibujar la ventana cuando se ha presionado una tecla. Introducir un comando nuevo de manera que al apretar la tecla a (axis), se muestren los ejes de la figura si están desactivados, o se desactiven si están activados. Introducir otro comando de manera que con las teclas u, d, r y l (up, down, right, left) se tralade la cámara manipulando la función glulookat. 1.6 REPRESENTANDO UNA TORTUGA La función glbegin comienza una secuencia de vértices con los que es posible dibujar polígonos. De esta manera, definiendo puntos, OpenGL da la oportunidad de construir nuevos elementos a base de líneas y polígonos. El parámetro de glbegin es el tipo de primitiva que se va a definir (triangle, poligon, etc.) Los vértices (puntos en un espacio 3D) se definen en OpenGL con la función glvertex3f() o glvertex3d(). Realizar la función draw Turtle() que dibujar por medio de la función glbegin() una tortuga. Los puntos de la tortuga se almacenan en dos vectores x[] y z[], y despues se llama a la función glvertex3d() dentro de un bucle que recorre las coordenadas de estos vectores. Al ser la tortuga simétrica sólo es necesario definir la mitad y volver a recorrer los puntos en orden inverso. La función draw Turtle() será llamada desde la función display(). Vector de coordenadas x: double x[] = {0.0, 0.1,...; Bucle for: for (i=0; i < npoints; i++){ Comparar la utilización de glbegin(gl_line_loop); y glbegin(gl_polygon); En la figura 5 se muestra el resultado con GL_LINE_LOOP Realizar la función draw SphereTurtle() que dibuja una tortuga mediante la primitiva de la función glutwiresphere(). Esta función tiene como argumentos el radio y la precisión en latitud y longitud. En la figura 6 se muestra el resultado utilizando 6 esferas. La precisión utilizada en ambos ejes es de 10. Figura 5 Tortuga con GL_LINE_LOOP