Llegó la hora de hablar de gráficos. Tanto si estás dando tus primeros pasos con 3D Studio, Blender o Maya, como si comienzas a ponerle las manos encima a un motor de juegos en 3D, tal vez te interese saber de dónde viene todo esto de los modelos, texturas, shaders y porqué es así de complicado. Ve desempolvando el libro de matemáticas de bachillerato, que lo vas a necesitar.
En este mundo de videojuegos en 3D, la cosa va de vectores, matrices y geometría espacial de la divertida. Sin embargo, no os preocupéis, que como no se me da especialmente bien, y maquetar fórmulas matemáticas en una web es una tortura que no le deseo a los redactores de indie-o-rama, voy a saltarme la parte más aburrida e intentar explicarlo a modo texto.
Un poco de geometría
El que esté muy pez en mates, necesitará algunos conceptos muy básicos para entender a grandes rasgos lo que contaré a continuación. Nuevamente, en internet y en cientos de libros hay muchísima más información para el que le pique la curiosidad y quiera profundizar. A menudo se habla de dos o tres dimensiones de un juego, que si «lógica 2D, pero gráficos 3D», que si «juego en tres dimensiones», etc. Las dimensiones son el número de valores con los que podemos describir una posición en un determinado espacio.
Por ejemplo, en Super Mario Bros. (Nintendo, 1985) basta con dos dimensiones para localizar cualquier punto en el mapeado: arriba-abajo (eje Y), e izquierda-derecha (eje X). Podemos decir que Mario está en el punto X=3, Y=5 y quedarnos tan contentos, que su ubicación está clara siempre que sepamos cual es el origen de coordenadas. Por esto, Super Mario Bros. es un juego 2D. En Minecraft (Markus ‘Notch’ Persson, 2009), que por el contrario es un juego 3D, necesitaremos tres valores para especificar una posición: el valor en los ejes X e Y, y una nueva dimensión adelante-atrás (eje Z). Nuestro personaje se puede mover en cualquier dirección comprendida en esas 3 dimensiones.
En geometría espacial, se representa cualquier punto del espacio con el conjunto de coordenadas en cada dimensión. Se utilizarán los valores en cada eje: (x,y,z) en tres dimensiones, por ejemplo (3,4,-7). Para aplicar transformaciones sobre puntos, siendo las más comunes traslación (desplazamientos), rotación (giros) o escala (cambios de tamaño, aumentando o disminuyendo la distancia al origen de coordenadas), se utilizan matrices. No pretendo a entrar al porqué de esto, ya que está dentro de la parte fea con muchas matemáticas, pero conviene saber qué son y para qué sirven las matrices: Una matriz debidamente operada sobre un punto (o un vector), nos dará otro punto (o vector) transformado.
Como muchos sabrán ya, un modelo 3D de los que se usan en juegos está formado esencialmente por puntos (vértices), y las uniones entre ellos. Al conjunto formado por los vértices y las aristas que los unen se le suele llamar malla gráfica. A esta malla es a la que se aplicarán transformaciones mediante matrices para lograr pintarla en la pantalla y animarla.
Del 2D al 3D o más bien al contrario
Entendido esto, la primera dificultad con la que lidiar a la hora de visualizar objetos tridimensionales en una pantalla, es que, aún a día de hoy, las pantallas son planas. En una pantalla sólo hay dos dimensiones, sin embargo nuestro mundo (al menos el que podemos percibir) es tridimensional. Así que hay que encontrar la manera de convertir tres coordenadas a sólo dos.
Lo primero que se nos podría ocurrir es prescindir directamente de una de esas dimensiones que nos sobran. Esto es lo que se conoce como una proyección ortográfica, en la que los objetos tridimensionales se aplanan, pero sin dar ninguna sensación de profundidad: no sabremos qué está más lejos ni más cerca. Para conseguir esa sensación necesitamos una proyección perspectiva. Desde un punto de vista artístico, las proyecciones son formas de representar un objeto en una superficie plana, y para ello hay una serie de técnicas muy útiles de escuadra y cartabón que los que estudiaron dibujo técnico en el colegio recordarán.
Sin embargo, desde un punto de vista matemático, lo que necesitaremos para realizar proyecciones son, por supuesto, matrices. La llamada matriz de proyección se encarga de esto principalmente. Esta matriz es la que transformará cada vértice y obtendrá coordenadas de pantalla, y con ella podemos controlar tanto el tipo de proyección como el campo de visión y la relación de aspecto.
Pero no basta sólo con eso. Cada modelo 3D que vayamos a utilizar en el juego tiene su propio sistema de referencia y su origen de coordenadas, que suele ser el centro del modelo. Cada vértice del modelo está definido con una posición relativa a este centro, por lo que si mezclamos varios modelos en una misma escena, así tal cual, todos saldrán colocados en la misma posición, atravesados unos con otros. Necesitamos transformar las coordenadas de los vértices, a un sistema de referencia común, concretamente, el sistema de referencia del juego. Utilizaremos otra matriz para ello: la matriz mundo. Esta matriz suele ser una combinación de las matrices de escala, rotación y traslación.
Sin embargo, tampoco es suficiente. Aun sabiendo proyectar puntos en 3D en una pantalla plana, y teniendo un sistema de referencia común, todavía falta otra transformación. Esta transformación es la que nos permite obtener distintos puntos de vista y mover la cámara. Es la llamada matriz vista.
Aplicando las matrices
Para formar la matriz mundo necesitaremos usar varias matrices de transformación, pero lo interesante es saber en qué orden. Los giros y las escalas se calculan desde el origen de coordenadas. Esto provoca que si aplicamos una matriz de rotación después de usar la matriz de traslación, nuestro modelo girará entorno al origen de coordenadas del mundo (y normalmente no es lo que queremos conseguir). Así, las rotaciones y escalas hay que usarlas antes de la matriz traslación, con lo que conseguiremos que se apliquen desde el origen de coordenadas del modelo. En cambio, para trasladar el modelo no tenemos ese problema. En definitiva, el orden adecuado es: primero escala, después rotación y, por último, traslación. El orden en que se aplican la matriz vista y de proyección también es importante: en primer hay que aplicar la matriz mundo, después la matriz vista, y por último la matriz de proyección.
En Resumen
Es bastante distinto trabajar con un entorno 3D que con uno 2D. Para crear un juego en 3D hay que lidiar con la geometría espacial tridimensional, y entender qué son las matrices y cómo se aplican para generar una imagen proyectada en una pantalla bidimensional. Afortunadamente, gracias a más de 20 años de trabajo y perfeccionamiento de las técnicas de informática gráfica, la mayoría de motores gráficos nos dan muchas herramientas hechas, y sólo en ocasiones tendremos que meternos al nivel de matrices si no nos complicamos la vida. Aun con todo ello, no es raro tener que enfrentarse a geometría espacial, matrices y otros trucos matemáticos espeluznantes como los cuaterniones, de vez en cuando. Hay que estar preparado para ensuciarse las manos.
Aún falta mucho por contar, en cualquier caso. De momento sabemos colocar puntos y modelos en un entorno 3D y la base de cómo transformar la geometría para pintarla en una pantalla, pero no he hablado nada sobre texturas, shaders, mapas, etc. conceptos muy interesantes que quedan para otro artículo.