En esta entrada vamos a ver que las transformaciones se pueden considerar como sistemas de coordenadas definidos respecto a un sistema de coordenadas global, y veremos la ventaja de comprender esta dualidad en el ámbito de los gráficos por ordenador.
Empecemos por una simple analogía. Cuando decimos que algo mide dos metros, lo que estamos haciendo es comparar respecto a un sistema de referencia bien conocido: el metro. Estamos diciendo, implícitamente, que esa cosa que mide dos metros mide dos veces lo que mide un metro.
Algo similar ocurre con los sistemas de coordenadas. En un juego (o en una aplicación gráfica cualquiera) existe un sistema de coordenadas estándar, global, también llamado el sistema de coordenadas del mundo, y que en este caso representa nuestro metro. En un juego 3D, este sistema de coordenadas está formado por tres vectores: (1, 0, 0), (0, 1, 0) y (0, 0, 1). En un juego en 2D, sólo tendríamos los dos primeros vectores. Lo importante es que cualquier otro sistema de coordenadas, los dos metros, se expresa en función de este sistema estándar.
Cuando importamos un objeto 3D en un motor gráfico, generalmente se posiciona automáticamente en el origen del sistema de coordenadas estándar, el punto (0, 0, 0). Ese objeto 3D, sin embargo, tiene su propio sistema de coordenadas local que se utilizó durante el modelado del mismo en una aplicación externa como Blender o Maya. De hecho, al importar el objeto lo que se hace es posicionar el origen del sistema de coordenadas local del objeto en el origen de coordenadas del mundo.
En la imagen de arriba, vemos que el objeto está en el origen del sistema de coordenadas del mundo, y vemos también el sistema de coordenadas local en línea más gruesa y roja.
Supongamos ahora que movemos el objeto una unidad arriba y a la derecha, y que lo giramos cuarenta y cinco grados en sentido antihorario respecto al eje Z. Esto se puede conseguir pos-multiplicando cada vértice del objeto por la siguiente matriz de transformación:
\(M=\begin{pmatrix}
\cos 45 & -\sin 45 & 0 & 1 \\
\sin 45 & \cos 45 & 0 & 1 \\
0 & 0 & 1 & 0 \\
0 & 0 & 0 & 1
\end{pmatrix}\)
Normalmente, lo que visualizamos cuando hacemos esto es que movemos y giramos el objeto en las coordenadas del mundo, tal y como se muestra en la imagen de abajo:
Pero otra forma de visualizarlo es que la transformación en sí misma (codificada en una matriz) representa un sistema de coordenadas local. De esta forma la primera columna representa el eje X, la segunda el eje Y y la tercera el eje Z de dicho sistema de coordenadas(1)Es así porque estamos usando la convención column major; si usáramos la convención row major los ejes de coordenadas estarían formados por las tres primeras filas. Para entender mejor esto te recomiendo que leas esta entrada.. La última columna es el desplazamiento respecto al origen de coordenadas del mundo.
Visualizándolo de esta forma, lo que estamos modificando no es el objeto en sí, sino su sistema de coordenadas local, el cual está “pegado” por así decirlo al objeto, de forma que al rotar y trasladar su sistema de coordenadas local estamos implícitamente rotando y trasladando el objeto.
Es decir, multiplicando una matriz que representa un sistema de coordenadas local por un punto en dicho sistema de coordenadas obtenemos las coordenadas del punto en el sistema de coordenadas estándar.
¿Y por qué es importante tener esta visión de conjunto?
Porque por las reglas del álgebra que fundamentan todo esto, si tenemos un punto expresado en coordenadas estándar, es posible obtener dicho punto respecto a cualquier sistema de coordenadas local, y esto sí que es interesante en el mundo de los gráficos por ordenador.
Primero, observemos que si bien multiplicar la matriz \(M\) anterior por el punto nos devuelve un nuevo punto en coordenadas del mundo, es posible multiplicar dicho punto por la inversa de la matriz para obtener el punto en coordenadas del sistema local:
\(Mp_{local}=p_{mundo} \Rightarrow M^{-1}Mp_{local} = M^{-1}p_{mundo} \Rightarrow M^{-1}p_{mundo} = p_{local}\)En muchos casos, dado que las matrices de transformación suelen ser ortogonales, calcular la inversa es muy simple ya que sólo tenemos que transponer la matriz. En otros casos, basta con deshacer la transformación.
Aunque no es el propósito de esta entrada, pongamos el ejemplo de cómo calcular la inversa de \(M\). Primero, ten en cuenta que esta matriz no es más que el resultado de aplicar una transformación de rotación de 45 grados en el eje Z seguida de una traslación. Por tanto, \(M\) se puede expresar como el siguiente producto:
\(M=TR\)
Fíjate que como estamos usando la convención column major, la transformación se lee de derecha a izquierda: primero aplicamos la rotación y luego la traslación. Las matrices de rotación y traslación son las siguientes:
\(R=\begin{pmatrix}
\cos 45 & -\sin 45 & 0 & 0 \\
\sin 45 & \cos 45 & 0 & 0 \\
0 & 0 & 1 & 0 \\
0 & 0 & 0 & 1
\end{pmatrix}\)
\(T=\begin{pmatrix}
1 & 0 & 0 & 1 \\
0 & 1 & 0 & 1 \\
0 & 0 & 1 & 0 \\
0 & 0 & 0 & 1
\end{pmatrix}\)
La inversa de \(M\) es \(M^{-1}=(TR)^{-1}=R^{-1}T^{-1}\). La inversa de \(R\) es simplemente la matriz transpuesta, ya que es ortogonal. De todas formas, también se puede ver como que deshacemos la rotación girando -45 grados. Dado que \(\sin (-x) = -x\) y \(\cos (x) = x\), obtendríamos la matriz transpuesta. Por otro lado, la inversa de \(T\) consiste en deshacer la traslación, o lo que es lo mismo, trasladar -1 unidades. Por tanto y conociendo ambas inversas, es cuestión de calcular el producto \(R^{-1}T^{-1}\):
\(M^{-1}=\begin{pmatrix}
\cos 45 & \sin 45 & 0 & -(\sin 45 + \cos 45) \\
-\sin 45 & \cos 45 & 0 & \sin 45 -\cos 45 \\
0 & 0 & 1 & 0 \\
0 & 0 & 0 & 1
\end{pmatrix}\)
Hay ciertos momentos en los que nos interesa mover las coordenadas del mundo de varios objetos a otro sistema de referencia para hacer más fácil ciertas operaciones, y este es el caso con la cámara.
La cámara no es más que otro objeto 3D en la escena que tiene su posición y orientación. Por lo tanto, tiene una matriz de transformación asociada que, como hemos visto, además de representar dicha posición y orientación, puede interpretarse como un sistema de coordenadas local para la cámara. Por tanto, si multiplicamos todos los objetos de la escena por la inversa de dicha matriz (denominada view transformation), obtenemos las coordenadas de los objetos respecto al sistema local de la cámara, lo cual nos ayuda a determinar qué objetos son visibles por la cámara de una forma mucho más directa que si tuviéramos que calcularlo sabiendo la posición y rotación de los objetos y de la cámara en el mundo.
Así que, en resumen: siempre vemos las transformaciones como funciones que cambian la posición, rotación y escala de un objeto, y esa forma de verlo es útil en la mayoría de los casos. Pero hay veces que conviene interpretar las transformaciones como sistemas de coordenadas expresados respecto al sistema de coordenadas estándar. Ambas interpretaciones son válidas y matemáticamente equivalentes.
Comentarios