Transformaciones en OpenGL

En algunos tutoriales anteriores de OpenGL se han mencionado de manera fragmentaria los conceptos de transformaciones:

  • En “Primeros Pasos en OpenGL” se mencionaba de manera general algunos conceptos relacionados con las transformaciones en OpenGL, específicamente la proyección. Es recomendable revisar y entender “Primeros Pasos en OpenGL” antes de aventurarse a leer el presente tutorial.
  • En los “Hola Mundo 3d en OpenGL” y “Hola Complicado Mundo OpenGL-win32” se utilizaron algunas transformaciones de proyección y viewport para ajustar la inicialización de la ventana, pero sin entrar mucho en detalle acerca de su funcionamiento.

Este tutorial explora los diferentes tipos de transformaciones en OpenGL, a saber:

  • Proyección: Trasforman una escena 3d “abstracta”, en una imagen plana que puede ser visualizada en una pantalla.
  • Viewport: Ajustan el producto de la proyección a las dimensiones de un rectángulo contenedor (ventana).
  • De vista: Que definen y afectan la posición desde la cual se visualizan las escenas tridimensionales.
  • Modelado: Sirven para manipular los objetos en la escena, permitiendo trasladarlos, rotarlos y deformarlos (escalarlos).
  • Modelo-Vista: Son la combinación de las dos transformaciones anteriores, que desde un punto de vista práctico son semejantes.

Pipeline parcial

Antes de empezar a detallar cada tipo de transformación 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 más interesantes son MODELVIEW y PROJECTION, las otras se verán en su momento.
  • Void glLoadMatrix{fd} (T m[16]); Recibe una matriz de 4×4 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:
    Matriz 1
    Ambas opciones pueden ser utilizada (m[16] o m[4][4]) , aunque la primera es mas eficiente, debido a que solo genera un puntero 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 operación. La operación resultante sería 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 operación y que reemplaza a A.
  • void glLoadTransposeMatrix{fd}( T m[16] ); Realiza una función similar a LoadMatrix(), con la diferencia que trabaja sobre una matriz en orden X así:
    Matriz 2
    que es evidentemente la transpuesta de la m que recibe LoadMatrix.
  • void glMultTransposeMatrix{fd}( T m[16] ); Misma funcionalidad que MultMatrix() , solo que actúa en base al la matriz en orden X, o sea la transpuesta.
  • void glLoadIdentity( void ); Remplaza la matriz actual por la matriz identidad de tamaño 4×4.

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 función que es útil en la manipulación 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 parámetros MODELVIEW_MATRIX y un apuntador a un arreglo de flotantes tamaño 16 se obtiene una copia de dicha matriz a través del arreglo.

1 2 3

Compartir esta entrada

DiggReddit
  • Juanxo

    Ola..disculpa la molestia pero..me podrias explicar mejor el sentido de glPushMatrix() y glPopMatrix()..y porque es necesario captarlo

  • http://black-byte.com/ jotatsu

    glPushMatrix() guarda la matriz de transformación actual en una pila y y glPopMatrix() la restaura. Para el caso de la matriz MODELVIEW para guardar diferentes transformaciones de los objetos, para el caso de PROYECTION salva la transformación actual del frustrum, TEXTURE guarda las coordenadas de la transformación de textura.

    En el caso practico sin embargo, para mover y transladar objetos cada uno debería tener su propia matriz de transformación, por lo que glPush y glPop son mas bien de aprendizaje.

  • Sergio

    Hola creo que es un gran tutorial, pero me gustaría poder echar un vistazo a los ejemplos, que ahora mismo no estan disponibles, sabes cuando podrás restaurarlos?

  • Jotatsu

    saludos Sergio.

    Los ejemplos estaràn disponibles de nuevo en el curso de esta semana. Estoy realizando algunas reparaciones por problemas con el host.

  • Lore

    excelente tutorial, felicitaciones