viernes, 23 de abril de 2010

Introducción a Motores 3D (parte 3)

Projection Transformation y Perspective Division

En el post anterior mencionaba un poco acerca de la Modelview Transformation. Como resultado de esta transformación se obtienen las coordenadas de vista, estas son las coordenadas desde el punto de vista del observador. El siguiente paso es la Projection Transformation y Perspective Division, donde se determina que objetos y/o partes de estos serán mostrados en la pantalla. Además hace un calculo del eje z ya que como nuestro monitor es en 2D debe hacer una transformación para representar objetos 3D, y así poder simular aquellas caras de los objetos que se encuentran más lejos del observador.





En la figura, los objetos contenidos dentro del plano a y b son los que se proyectarán en pantalla. Estos planos se determinan a través de la función glFrustum o glPerspective. También puede generarse una proyección paralela, con todos los objetos contenidos en un paralelogramo, esto se logra a través de la función glOrtho. Pero para producir proyecciones en perspectiva se utilizan las mencionadas primero.


Viewport Transformation

La última transformación por la que pasan cada uno de los puntos es la Viewport Transformation. Ésta básicamente consiste en transformar las coordenadas normalizadas de los puntos en coordenadas de la ventana donde se mostrarán. Se utiliza la función glViewport para indicarle a OpenGL los parámetros que deberá utilizar para realizar la transformación.

Un ejemplo de la configuración del OpenGL para estas transformaciones podría ser así:

const float ar = (float) width / (float) height;

glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-ar, ar, -1.0, 1.0, 2.0, 100.0);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity() ;

glViewport establece las medidas de la pantalla y glFrustum establece la perspectiva para la representación de los objetos. Nótese que se establece GL_PROJECTION como la matriz de trabajo para estas transformaciones, luego se cambia a GL_MODELVIEW donde más adelante en el programa se añadírían los puntos de los objetos como se mostró en el post anterior, utilizando la matriz de cada uno de éstos para colocarlos en la posición que les corresponde en el mundo 3D.

Conociendo estas transformaciones, y aprovechando que OpenGL nos facilita el cálculo de todas ellas; el programador puede concentrarse en cuestiones como el movimiento de la cámara, movimiento de los objetos, reglas del juego, etc. para crear su motor 3D.

Hay que tomar en cuenta también otro montón de cosas como ser la iluminación, sombras, efectos especiales, detección de colisiones, etc. algunas de las cuales requerirán de cálculos matemáticos complejos o del ingenio del programador para simularlos. Estas las expondré en los siguientes posts.