Hardware
El API
de ogl está pensado para trabajar bajo el respaldo de un hardware capaz de
realizar las operaciones necesarias para el renderizado, pero si no se dispone
de ese hardware, estas operaciones se calcularan por medio de un software
contra la CPU del sistema.
Windows
En
principio, cualquier versión de windows viene con las librerías necesarias para
ejecutar cualquier aplicación que utilice OpenGL. Para el desarrollo de las
mismas, el Microsoft Visual Studio, y en particular Visual C++ trae también
todo lo necesario.
Linux
Para
visualizar aplicaciones OpenGL en XFree86 necesitarás instalar un paquete para
el soporte de las librerías Mesa (que es el equivalente en software libre de
OpenGL) y de las utilidades GLU y GLUT. Para realizar desarrollo necesitarás, a
mayores, los paquetes equivalentes en modo dev.
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.
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.
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
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í: que
es evidentemente la transpuesta de la m que recibe LoadMatrix.
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.
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.
Proyección
Como ya
se ha visto en tutoriales anteriores, OpenGL maneja 2 tipos de proyección, en
perspectiva y ortográfica, donde la primera corresponde a la visión “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 cámara.
Ortográfica:
Para ajustar la proyección ortográfica se utiliza el siguiente grupo de
funciones:
glOrtho(GLdouble left, GLdouble right, GLdouble
bottom, GLdouble top, GLdouble near, GLdouble far);
Esta
función permite controlar los parámetros del volumen de vista izquierdo,
derecho, abajo, arriba, cerca y lejos. Hay que recordar que debido a que no se
posee percepción de profundidad en este modo el valor del volumen deberá
corresponder en la mayoría 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
función 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 proyección en perspectiva, a través de de una
función gl o mediante la librería glu (una tercera puede ser realizar los
cálculos de la matriz “manualmente”.
Transformaciones
ModelView
Una
tarea muy común en la creación de gráficos 2d, 3d y videojuegos es la de mover
objetos par crear cierta animación. La primera idea que se nos viene a la
cabeza en el caso de OpeGL 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.
Coordenadas
oculares
Las
coordenadas oculares se sitúan en el punto de vista del observador, sin
importar las transformaciones que tengan lugar. Por tanto, estas coordenadas
representan un sistema virtual de coordenadas fijo usado como marco de
referencia común.
Transformaciones
Las
transformaciones son las que hacen posible la proyección de coordenadas 3D
sobre superficies 2D. También son las encargadas de mover, rotar y escalar
objetos. En realidad, estas transformaciones no se aplican a los modelos en sí,
si no al sistema de coordenadas, de forma que si se quiere rotar un objeto, no
lo se le rota, sino que se rota el eje sobre el que se sitúa.
El
modelador
En esta
sección se recogen las transformaciones del observador y del modelado puesto
que, como se verá en el apartado 4.2.1.3, constituyen, al fin y al cabo, la
misma transformación.
Transformaciones
del observador
La
transformación del observador es la primera que se aplica a la escena, y se usa
para determinar el punto más ventajoso de la escena. Por defecto, el punto de
vista está en el origen (0,0,0) mirando en dirección negativa del eje z. La
transformación del observador permite colocar y apuntar la cámara donde y hacia
donde se quiera. Todas las transformaciones posteriores tienen lugar basadas en
el nuevo sistema de coordenadas modificado.
Transformaciones
del modelo
Estas
transformaciones se usan para situar, rotar y escalar los objetos de la escena.
La apariencia final de los objetos depende en gran medida del orden con el que
se hayan aplicado las transformaciones.
Transformaciones
de la proyección
La transformación de proyección se aplica a la
orientación final del modelador. Esta proyección define el volumen de
visualización y establece los planos de trabajo.
Transformaciones
de la vista
En el momento en que se ha terminado todo el
proceso de transformaciones, solo queda un último paso: proyectar lo que hemos
dibujado en 3D al 2D de la pantalla, en la ventana en la que estamos
trabajando.
Matrices
Las matemáticas que hay tras estas
transformaciones se simplifican gracias a las matrices. Cada una de las
transformaciones de las que se acaba de hablar puede conseguirse multiplicando
una matriz que contenga los vértices por una matriz que describa la transformación.
Por tanto todas las transformaciones ejecutables con ogl pueden describirse
como la multiplicación de dos o más matrices.
El canal
de transformaciones
Para poder llevar a cabo todas las
transformaciones de las que se acaba de hablar, deben modificarse dos matrices:
la matriz del Modelador y la matriz de Proyección. OpenGL proporciona muchas
funciones de alto nivel que hacen muy sencillo la construcción de matrices para
transformaciones. Éstas se aplican sobre la matriz que este activa en ese
instante. Para activar una de las dos matrices utilizamos la función glMatrixMode.
La
matriz del modelador
La
matriz del modelador es una matriz 4x4 que representa el sistema de coordenadas
transformado que se está usando para colocar y orientar los objetos. Si se
multiplica la matriz del vértice (de tamaño 1x4) por ésta se obtiene otra
matriz 1x4 con los vértices transformados sobre ese sistema de coordenadas.
Definición:
Producto escalar en cualquier espacio. Espacio euclídeo.
Cualquier
operación en un espacio vectorial que cumpla las anteriores propiedades, diremos que es un producto escalar (aunque no se
trate del producto escalar usual).
Llamaremos
espacio euclídeo a un espacio vectorial dotado de un producto escalar.
Conceptos
geométricos obtenidos del producto escalar.
Por
analogía con lo que ocurre en el plano o el espacio con el producto escalar
usual, podemos definir los siguientes
conceptos, siempre referidos a un cierto producto escalar.
Nos
situamos en V, un espacio euclídeo.
.
Vectores ortogonales.
Dos
vectores u, v son ortogonales si su producto escalar es cero: u · v = 0. Se denota u⊥ v.
Diremos
que un conjunto de vectores es un conjunto ortogonal si cada uno de ellos
es ortogonal a todos los demás.
• Notar que si dos vectores u, v son ortogonales
entonces también lo son sus múltiplos α u
y β v (α, β escalares).
Norma o
módulo de un vector.
La norma
o módulo de un vector es | v |= v · v
La noción corresponde, intuitivamente, a
la “longitud” del vector. También se puede denotar || v || .
Distancia
entre dos vectores.
La
distancia entre u y v es la norma del vector diferencia entre ambos.
dist (u,
v) = | u – v |
Ángulo
entre dos vectores.
Es
sabido que para el producto escalar usual de
ℜ²
se tiene que u · v = | u | | v | cos α ,
donde α
es el ángulo que forman ambos vectores. Por tanto, para generalizar la
noción de ángulo a cualquier espacio euclídeo.