Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Este tutorial pretende introducir al alumno en el mundo de OpenGL. Para ello da una primera visin superficial de su uso, dejando al alumno la opcin de profundizar ms en su aprendizaje, ya que OpenGL es un conjunto de libreras muy potente en el desarrollo de grficos por computador. Este tutorial tambin pretende conseguir que el alumno no se aburra con la teora matemtica de los grficos por computador, mostrndole una forma sencilla de poner en prctica sus conocimientos desde el primer momento. Para ello se introducir al alumno paso a paso en el complejo mundo de OpenGL, desde la simplicidad del programa que solo muestra una lnea por pantalla, hasta la aplicacin que permite interactuar con el usuario. Esto se logra gracias a la sucesin de aplicaciones ejemplo, en las que la dificultad ira en incremento, mostrndose cada vez algunas de las operaciones de OpenGL. Se utilizarn las libreras de OpenGL, as como sus extensiones, que son las GLaux, GLU y GLUT.
Qu es OpenGL ?
OpenGL se define estrictamente como "una interfaz software para grficos por hardware" [Wrigth & Sweet, 1997] Pero, qu es OpenGL realmente? OpenGL no es un lenguaje de programacin; Se puede decir que OpenGL es un API (Application Programming Interface) para desarrollo de aplicaciones 3D. En realidad es ms que un simple Interfaz. Son unas definiciones estndar para la definicin, gestin y manipulacin de grficos 3D. Cuando se dice que una aplicacin esta basada en OpenGL, o que es una aplicacin OpenGL, quiere decir que est escrita en un lenguaje de programacin que hace llamadas a una o ms de las libreras de OpenGL. Para que puedo usar OpenGL? : OpenGL puede ser usado para todo tipo de aplicaciones que necesiten visualizacin 3D en tiempo real de alto rendimiento y calidad, en esto estn incluido los videojuegos, CAD, aplicaciones cientficas, mdicas, militares, simuladores, etc.
Qu es OpenGL ?
OpenGL fue definido por SGI (Silicon Graphics Inc.) dirigido a sus mquinas de desarrollo 3D a partir de un lenguaje llamado GL que ya posean. Pero esta vez lo definieron para que fuera lo ms abierto posible y portable a cualquier plataforma (de ah lo de Open). Lo presentaron al pblico en la misma presentacin en la que Microsoft present Windows NT 3.5 all por el ao 1992. En un primer momento solamente las mquinas de SGI eran capaces de soportar estas especificaciones, ya que necesita de un hardware potente y rpido, sobre todo en lo referente al hardware de presentacin. No obstante Microsoft y SGI se pusieron a trabajar para efectuar un desarrollo para Windows NT que posteriormente fue trasladado a Windows 95. Y gracias, sobre todo, a las tarjetas grficas aceleradores 3D se consiguen unos resultados excelentes. Actualmente OpenGL est soportado de forma automtica en todas las versiones Win32 con excepcin de Windows CE.
Tipos de datos OpenGL Glbyte Glshort Glint, Glsizei Glfloat, Glclampf Gldouble, Glclampd GLubyte, Glboolean Glushort GLuint, Glenum, Glbitfield
Definicin en C char con signo short long float double unsigned char unsigned short unsigned long
Constantes
OpenGL y sus libreras auxiliares nombran sus constantes siempre en maysculas, ponindoles un prefijo, el mismo que en las funciones, que indica en que librera esta definida. Ejemplos de constantes: GLUT_RGB GL_POINTS GL_LINE_STRIP GL_TRIANGLE_FAN GL_POLYGON GLUT_KEY_INSERT GL_LINES GL_TRIANGLES GL_QUADS GLUT_STENCIL GL_LINE_LOOP GL_TRIANGLE_STRIP GL_QUAD_STRIP
Tipografa
La implementacin de texto en Glut se realiza mediante las siguientes funciones. glutBitmapCharacter(void *font, int character); glutBitmapWidth(void *font, int character); glutStrokeCharacter(void *font, int character); glutStrokeWidth(void *font, int character); glutBitmapLength(void *font, const unsigned char *string); glutStrokeLength(void *font, const unsigned char *string); Las dos ltimas solo disponibles para versiones superiores a la 4.0
Tipografa
Los siguientes estilos de letras estn definidos por la funcin glutBitmapCharacter, en la implementacin de sta funcin se define el estilo de fuente utilizada.
Tipos de Proyeccin
Definicin y colocacin de la cmara Una vez hemos definido toda nuestra escena en coordenadas mundo, tenemos que hacerle la foto. Para ello, tenemos que hacer dos cosas: colocar la cmara en el mundo (o sea, en la escena) y definir el tipo de proyeccin que realizar la cmara. Posicin de la cmara Tenemos que definir no slo la posicin de la cmara (o donde est), sino tambin hacia dnde mira y con qu orientacin (no es lo mismo mirar con la cara inclinada o recta aunque veamos lo mismo).
Tipos de Proyeccin
Para hacer esto, basta con modificar la matriz ModelView para mover toda la escena de manera que parezca que hemos movido la cmara. El problema de este sistema es que tenemos que pensar bastante las transformaciones a aplicar. Es por ello que la librera GLU viene al rescate con la funcin gluLookAt. Su sintaxis es la siguiente: void gluLookAt( eyeX, eyeY, eyeZ, cenX, cenY, cenZ, vp_X, vp_Y, vp_Z); donde eye corresponde a la posicin de la cmara, cen corresponde al punto hacia donde mira la cmara y vp es un vector que define la orientacin de la cmara. No podemos llamar a gluLookAt en cualquier momento, puesto que tiene postmultiplicar la matriz ModelView (por tanto, conviene llamarla lo primero de todo). El vector vp no puede ser paralelo al vector formado por eye y cen, es ms, debera serle perpendicular. Si no, el resultado es impredecible. A la vez de definir la posicin y orientacin de la cmara, hay que definir el tipo de foto que hace, un poco como si seleccionsemos el objetivo. Esto es lo que nos va a definir la forma del volumen de visualizacin. La primera eleccin que tenemos que hacer es si queremos una proyeccin ortogonal o perspectiva. Dependiendo del tipo de aplicacin, utilizaremos una u otra.
Tipos de Proyeccin
Tipos de Proyeccin
Una vez definida la posicin y orientacin de la cmara, hay que definir el tipo de foto que hace, un poco como si seleccionsemos el objetivo. Esto es lo que nos va a definir la forma del volumen de visualizacin. En OpenGL, para definir la proyeccin, modificaremos la matriz Projection. Para hacer esto, pues, tendremos que hacer una llamada a glMatrixMode(GL_PROJECTION), para indicarle que vamos a modificar esta matriz. A partir de ese momento, todas las funciones de transformacin (glRotatef, glTranslatef, glScalef, etc) y las de pila (glPushMatrix y glPopMatrix) se aplican sobre estas matriz.
Ortogonalidad
Del griego orthos (recto) y gona (ngulo) El trmino ortogonalidad (en las matemticas) es una generalizacin de la nocin geomtrica de perpendicularidad. En el espacio eucldeo convencional el trmino ortogonal y el trmino perpendicular son sinnimos. Sin embargo, en espacios de dimensin finita y en geometras no eucldeas el concepto de ortogonalidad generaliza al de perpendicularidad. En la figura se han obtenido las proyecciones del cuerpo sobre tres planos perpendiculares dos a dos. El alzado corresponde a la vista de frente del cuerpo, el perfil a la vista de lado y la planta a la vista desde arriba.
Proyecciones ortogonales de un cuerpo en el plano
Proyeccin Ortogonal
Para el caso de la proyeccin ortogonal la analoga de la cmara no es tan evidente, porque en realidad estamos definiendo una caja, o volumen de visualizacin alrededor del eye de la cmara (esto es, podemos ver detrs) Para hacer esto, llamamos a glOrtho(left, right, bottom, top, near, far)
Como se aprecia en la figura, la foto obtenida incluye tanto la tetera como el toroide, puesto que el volumen de visualizacin tiene un near negativo (detrs de la cmara) y por tanto el volumen de visualizacin lo incluir.
Proyeccin Ortogonal
Esto sera equivalente a tener la cmara situada de la siguiente manera:
En este caso, la imagen sera la misma, pero near y far seran ambos positivos, puesto que el volumen se est definiendo por delante de la cmara. Si near y far fueran los valores de la figura anterior, entonces seguramente slo aparecera en la imagen el toroide, puesto que el volumen de visualizacin estara centrado en la cmara
Proyeccin en Perspectiva
El concepto es parecido a la proyeccin ortogonal; pero los puntos de la escena se proyectan sobre el plano de proyeccin (la pantalla) siguiendo una lnea que pasa por un punto detrs de este plano, el punto de vista (donde estamos situados para ver la escena).
A OpenGL se le puede decir que vamos a usar esta proyeccin de dos formas:
glFulstrum
glFrustum(xwmin, xwmax, ywmin, ywmax, pcerca,plejos);
gluPerpespective
gluPerpective(apertura, aspect, pcerca, plejos); apertura: corresponde al ngulo marcado en el grfico con un mximo de 180. aspect: ser la relacin entre largo y alto del plano de corte cercano (largo/alto). pcerca: sera la distancia mnima al punto de vista a partir de la cual se pintaran los ojetos. plejos: ser la distancia mxima al punto de vista. A partir de esta distancia no se pintaran los objetos.
Coordenadas Homogneas
Veremos en muchas ocasiones que un punto en tres dimensiones se representa por cuatro coordenadas. Por lo que el punto (3,2,5) se representar como (3,2,5,1). Sencillamente le aadimos un 1 como cuarta coordenada. Para que cuando OpenGL lo multiplique por una matriz de 4x4 para rotarlo, moverlo, escalarlo y calcular en que posicin de la pantalla hay que dibujarlo, no tengamos problemas. En realidad OpenGL aade este cuarto 1 internamente si usamos tres coordenadas con una funcin como glVertex3f(). OpenGL y todos los motores grficos usan matrices para modificar las coordenadas de los puntos de los objetos que van a dibujar porque es el mtodo ms fcil de implementar y ms rpido para un ordenador y permite muchas cosas.
Coordenadas Homogneas
En OpenGL hay dos matrices principales que determinan como se pintara un punto en pantalla. La primera es la MODELVIEW que transforma los puntos en el espacio tridimensional, los traslada, los rota y los escala. Se le dice a OpenGL que glMatrixMode(GL_MODELVIEW); es la que vas a modificar con la funcin
Los ms habituales contenidos de esta matriz son: La matriz identidad: Es la que no transforma el punto. si multiplicas un punto por esta matriz da el mismo punto. Se le dice a OpenGL que es la que queremos con la funcin glLoadIdentity(); En OpenGL la matriz identidad es la que se aplica por default si no se le dice lo contrario.
Coordenadas Homogneas
La matriz para mover un objeto: En las posiciones de la X, Y y Z se pone la distancia que queremos mover el objeto en cada eje (positivo o negativo). La funcin para cargar esta matriz es glTranslatef(x,y,z); La matriz para escalar un objeto:
Escala con un factor por cada eje. La funcin para hacerlo es glScalef(x,y,z); Las matrices para rotar un objeto dependen del eje de rotacin. Las ms comunes son alrededor de cada eje de coordenadas. La funcin para hacerlo es glRotatef(X,Y,Z);
Coordenadas Homogneas
Si queremos rotar un objeto y moverlo tendremos que multiplicar las matrices correspondientes y obtendremos una matriz con los datos necesarios para que si la multiplicamos por los puntos de nuestro objeto, los rote y los mueva. Pero cuidado, las matrices A y B multiplicadas no son igual que las matrices B y A multiplicadas, el orden en que multiplicamos cambia el resultado. Cuando usamos glTranslate, glScale o glRotate, en realidad estamos multiplicando la actual MODELVIEW por la de la correspondiente transformacin. Ejemplo: - Cargamos la matriz identidad para asegurarnos de donde empezamos: glLoadIdentity(); - Decimos a OpenGL que lo siguiente a pintar va movido de sitio: glTranslatef(0,0,-10); - Lo mismo pero girado alrededor del eje y: glRotatef(30,0,1,0); - Ahora pintamos el objeto: glBegin(...); glVertex3f(...); ... glEnd(); - Podriamos cargar otra vez la matriz identidad para pintar despues otros objetos en otros lugares: glLoadIdentity(); - Y seguimos moviendo, girando, escalando y pintando mas cosas ...
Coordenadas Homogneas
La segunda matriz es la PROJECTION, y es la encargada de definir la proyeccin que vamos a usar. OpenGL antes de pintar un punto en la pantalla, lo multiplica primero por la matriz MODELVIEW y luego por la PROJECTION. A OpenGL se le dice que vas glMatrixMode(GL_PROJECTION); a modificar esta matriz con la funcin
Esta matriz se modifica cuando vas a definir el tipo de proyeccin que vas a usar con las funciones glOrtho(), glFulstrum() y gluPerspective(). Por fin toca modificar nuestro programa y lo primero que cambiaremos ser la funcin glOrtho( ), ya que es la que defina la proyeccin ortogonal, y la cambiaremos por la funcin gluPerspective( ) correspondiente.