Sunteți pe pagina 1din 6

Transformaciones en OpenGL

En este documento, se exploran los diferentes tipos de transformaciones en OpenGL, necesitamos saber:

Proyeccin: Trasforma una escena 3d abstracta, en una imagen plana que puede ser visualizada en una pantalla. Viewport: Ajusta el producto de la proyeccin a las dimensiones de un rectngulo contenedor (ventana). De vista: Que define y afecta la posicin desde la cual se visualizan las escenas tridimensionales. Modelado: Sirve para manipular los objetos en la escena, permitiendo trasladarlos, rotarlos y deformarlos (escalarlos). Modelo-Vista: Son la combinacin de las dos transformaciones anteriores, que desde un punto de vista prctico son semejantes.

Antes de empezar a detallar cada tipo de transformacin es bueno tener una idea de las funciones que permiten acceder directamente a las matrices que representan los estados de las transformaciones:

void glMatrixMode( enum mode ); Permite seleccionar la matriz sobre la cual se realizaran las operaciones, los posibles valores de mode son TEXTURE, MODELVIEW, COLOR o PROJECTION . Por ahora las ms interesantes son MODELVIEW y PROJECTION, las otras se vern en su momento. Void glLoadMatrix{fd} (T m[16]); Recibe una matriz de 44 que reemplaza la actual seleccionada. El arreglo es ordenado en forma de una matriz que tiene orden Y, a diferencia de las matrices convencionales que tienen orden X, lo que quiere decir que tiene la forma: m = [a1 ,a2 ,a3 ,a4 ,a5 ,a6 ,a7 ,a8 ,a9 ,a10, a11, a12, a13, a14, a15, a16] es interpretada internamente por OpenGL como:

Ambas opciones pueden ser utilizada (m[16] o m[4][4]) , aunque la primera es mas eficiente, debido a que solo genera un apuntador de acceso.

void glMultMatrix{fd}( T m[16] ); Multiplica la matriz actual por la matriz m[16] y reemplaza la matriz actual con el resultado de la operacin. La operacin resultante sera algo as como A = A M , donde A es la matriz actual, M es la matriz suministrada y A es la nueva matriz que resulta de la operacin y que reemplaza a A. void glLoadTransposeMatrix{fd}( T m[16] ); Realiza una funcin similar a LoadMatrix(), con la diferencia que trabaja sobre una matriz en orden X as:

que es evidentemente la transpuesta de la m que recibe LoadMatrix.

void glMultTransposeMatrix{fd}( T m[16] ); Misma funcionalidad que MultMatrix() , solo que acta en base al la matriz en orden X, o sea la transpuesta. void glLoadIdentity( void ); Remplaza la matriz actual por la matriz identidad de tamao 44.

Estas operaciones afectan directamente las matrices mencionadas anteriormente, debido a que las operaciones de alto nivel (trasladar, rotar, escalar) que existen mas adelante se concatenan, es decir su efecto se acumula sobre matriz actual, existen dos operaciones que permiten guardar la matriz actual en una pila y restaurarla cuando sea necesario, estas son:

void glPushMatrix( void ); Coloca una copia de la matriz actual en la parte superior de la pila correspondiente. void glPopMatrix( void ); Saca el elemento superior de la pila, que pasa a reemplazar a la matriz actual.

Estas dos operaciones son muy utilizadas, debido a que permiten realizar transformaciones sobre objetos diferentes, manteniendo algunas de las anteriores sin modificar. Hay una ltima funcin que es til en la manipulacin de matrices y otros aspectos de OpenGL:

void glGetFloatv(enum value, float *data); Permite obtener una copia de aquello que se indica en value. Por ejemplo si se pasan como parmetros MODELVIEW_MATRIX y un apuntador a un arreglo de flotantes tamao 16 se obtiene una copia de dicha matriz a travs del arreglo.

Proyeccin
OpenGL maneja 2 tipos de proyeccin, en perspectiva y ortogrfica, donde la primera corresponde a la visin realista de la escena, mientras que la segunda es una plana que no deforma las dimensiones de los objetos dependiendo de su distancia a la cmara. Ortogrfica: Para ajustar la proyeccin ortogrfica se utiliza el siguiente grupo de funciones: glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far); Esta funcin permite controlar los parmetros del volumen de vista izquierdo, derecho, abajo, arriba, cerca y lejos. Hay que recordar que debido a que no se posee percepcin de profundidad en este modo el valor del volumen deber corresponder en la mayora de los casos a un volumen suficientemente grande para contener los objetos de la escena. gluOrtho2D(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top); Esta funcin es simplemente una forma de la anterior, en donde se ha despreciado el valor de Z asignando los valores near = -1 y far = 1, generalmente se utiliza para escenas planas, en las que los objetos carecen de profundidad. Perspectiva: Existen dos manera de manejar la proyeccin en perspectiva, a travs de de una funcin gl o mediante la librera glu (una tercera puede ser realizar los clculos de la matriz manualmente. En el primer caso: glFrustrum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far) Esta funcin crea una matriz y la multiplica por la matriz de proyeccin actual, la matriz tiene la forma:

Estos no son datos fcilmente digeribles por muchos, as que glu ofrece una versin alternativa, mucho ms fcil de entender: void gluPerspective(GLdouble fov, GLdouble aspect, GLdouble near, GLdouble far); Donde fov se refiere al Field of View: el ngulo medido en la direccin Y dado en grados que es visible al usuario, el aspect que es una razn entre el alto y el ancho de la ventana y los otros dos valores corresponden a la distancia con respecto al plano mas cercano y mas lejano de proyeccin, tomando la cmara (0,0,0) como el punto de partida. Los valores usuales para estas variables de inicializacin son fov = 45, aspect= ancho_ventana/alto_ventana, near = 1.0 y far=100.0 o el valor que sea para estos dos ltimos, segn las necesidades (ambos tienen que ser positivos). Las modificaciones a las matrices de perspectiva por parte de estas funciones se realizan una vez durante la creacin de una aplicacin, mientras que las siguientes funciones se utilizan rutinariamente en la creacin de grficos. Transformaciones ModelView Una tarea muy comn en la creacin de grficos 2d, 3d y videojuegos es la de mover objetos para crear cierta animacin. La primera idea que se nos viene a la cabeza en el caso de OpenGL es que todo modelo est formado por primitivas, toda primitiva por puntos y finalmente todo punto por una tripleta de coordenadas XYZ, as que si se cambian las coordenadas todo de ah hacia arriba se mueve. Despus de un tiempo tal vez se requieran realizar tareas un poco mas complicadas como rotar el objeto alrededor de su centro, o alrededor de la posicin donde se encuentra con respecto al sistema coordenado. Esta tarea no es tan simple y requiere algo de conocimiento matemtico para hacerse, debido a que probablemente implique la implementacin de un sistema para almacenar y operar matrices, implementacin de coordenadas homogneas, etc. OpenGL provee de estos sistemas y utiliza algunas

simples funciones para su acceso, contando con tres operaciones bsicas: mover, rotar y escalar un conjunto de vrtices. void glRotate[fd](GLfloat angle, GLfloat x, GLfloat y, GLfloat z); Realiza una rotacin del espacio coordenado por una medida de (angle) tomados en grados a lo largo del vector determinado por (x,y,z). Es recomendable que (x,y,z) representen un vector normalizado (o sea magnitud(x,y,z) = 1), debido a que si no es as OpenGL intentar normalizarlo. La rotacin se lleva siguiendo la regla de la mano derecha, teniendo en cuenta que el vector (x,y,z) apunta con el pulgar hacia adentro (hacia uno). void glTranslate[fd](GLfloat x, GLfloat y, GLfloat z); Esta funcin traslada el espacio coordenado en x, y, z unidades sobre sus respectivos ejes coordenados X, Y, Z. void glScalef(GLfloat x, GLfloat y, GLfloat z); Cambia la proporcin de los objetos respecto a los ejes coordenados, lo que es equivalente a decir que los estira o encoge una cantidad determinada por los parmetros de la funcin x,y,z. Hay que tener en cuenta las siguientes caractersticas a la hora de utilizar estas funciones:

Estas tres operaciones afectan la matriz actual seleccionada, bien sea MODELVIEW o PROJECTION, generalmente para propsitos de rotar objetos dentro de la escena se utiliza la matriz MODELVIEW. El eje coordenado de referencia para las operaciones tanto en MODELVIEW como en PROJECTION se denomina eye coordinates, que traduce coordenadas de ojo o mejor vista. Este es un sistema inamovible y en ausencia de cualquier transformacin, la cmara est situada en (0,0,0) apuntando hacia la direccin Z negativa, con el vector arriba en el sentido Y positivo. Cada operacin que afecta la matriz MODELVIEW crea otro sistema coordenado para los objetos que se dibujen despus de realizada la trasformacin, dicho sistema difiere del bsico, es decir de las llamadas coordenadas de vista (eye coordinates) dependiendo de todo el conjunto de transformaciones realizadas desde el momento en que la matriz MODELVIEW dejo de ser la identidad. Una consecuencia de lo anterior es que las operaciones no son conmutativas, es decir que un llamado de glRotatef(), seguido de uno de glTranslatef() produce un efecto diferente a llamar las operaciones en orden inverso. Esto se ve mejor ilustrado en el grfico:

Es importante aprender a utilizar correctamente glPushMatrix(), glPopMatrix() y otras operaciones que permitan salvar y restaurar estados de matriz, debido a que permiten realizar translaciones y rotaciones especificas para un cierto objeto, sin alterar los otros.