En esta entrada estudiaremos qué son las bases y cómo hacer cambios de base, ya que son conceptos fundamentales que subyacen a los gráficos por ordenador. Esta entrada es principalmente sobre álgebra, que es uno de los campos fundamentales que hay conocer para aprender gráficos. ¡Así que vamos al lío!
NOTA: En muchas ocasiones, para intentar explicar algo de forma didáctica y accesible, es posible que haga vomitar a más de un matemático.
¿Qué es una base?
Piensa en un número entre 0 y 9, es decir, de una cifra. Esto empieza como un truco de magia pero tiene su razón de ser. Pongamos que has pensado (y si no, piénsalo para no dejarme en mal lugar), en el 8. El 8 lo puedes escribir tal cual, 8, o también como \(8 \cdot 1\).
Ahora piensa en un número de 2 cifras. Bien, ya veo que estás pensando en el 42. Este maravilloso número lo puedes escribir tal cual, o bien como \(4 \cdot 10 + 2 \cdot 1\).
Fíjate que estamos utilizando el 1 y el 10 como base para formar otros números. En general, podemos decir que cualquier número de una cifra se puede expresar en función de la base \(\mathcal{B} = \{1\} = \{10^0\} \), mientras que cualquier número de dos cifras se puede expresar con la base \(\mathcal{B} = \{10^1, 10^0\}\). Técnicamente, lo que diríamos es que los números pueden expresarse como la combinación lineal (multiplicaciones y sumas) de los elementos de sus bases. Es decir, cualquier número \(n\) de dos cifras se puede representar del siguiente modo:
$$n = a \cdot 10^1 + b \cdot 10^0$$
Por ejemplo, en el caso del 42, \(a = 4\) y \(b = 2\).
El concepto de base surge en realidad cuando hablamos de vectores. Una base es así un conjunto de vectores a partir de los cuales se pueden generar todo el resto de vectores. En \(\mathbb{R}^2\), es decir, vectores con dos componentes o bidimensionales, sólo necesitamos dos vectores para formar una base que nos permita representar cualquier otro vector de dos dimensiones. En \(\mathbb{R}^3\), necesitamos tres vectores. Y así sucesivamente. De esta forma, si tenemos una base \(\mathcal{B}=\{\vec{v}_1, \vec{v}_2, \vec{v}_3\}\), podemos formar cualquier vector \(\vec{v}\) de tres dimensiones mediante:
$$\vec{v} = a\vec{v}_1 + b\vec{v}_2 + c \vec{v}_3$$
Exactamente igual que hacíamos con los números.
Cambio de base
Normalmente cuando expresamos un vector, lo hacemos con la base estándar por defecto, que es \(\mathcal{B} = \{\vec{e}_x, \vec{e}_y, \vec{e}_z\} = \{(1, 0, 0), (0, 1, 0), (0, 0, 1)\}\). De esta forma, cuando hablamos del vector (4, 5, 0), implícitamente estamos refiriéndonos al vector que se forma como:
$$\vec{v} = 4 \vec{e}_x + 5 \vec{e}_y + 0 \vec{e}_z$$
Sin embargo, de igual modo que usamos esa base, podríamos utilizar cualquier otra base para representar un vector. Pongamos que tenemos la base estándar \(\mathcal{B}\) y otra base \(\mathcal{B_2} = \{\vec{b}_1, \vec{b}_2\}\). Lo que nos dice el álgebra es que:
$$B [\vec{v}]_\mathcal{B_2} = [\vec{v}]_\mathcal{B}$$
donde B es una matriz formado por los vectores de la base dispuestos en columnas, es decir:
$$ B =\begin{pmatrix}
\vec{b}_1 & \vec{b}_2
\end{pmatrix} = \begin{pmatrix}
b_{{1}_{x}} & b_{{2}_{x}} \\
b_{{1}_{y}} & b_{{2}_{y}}
\end{pmatrix} $$
Es decir, que si multiplicamos la base por el vector, obtenemos el vector en la base estándar. O dicho de otro modo, estamos haciendo un cambio de base. ¿Pero y si tenemos un vector en la base estándar y queremos representarlo según otra base \(\mathcal{B}\)? Es decir, ¿y si tenemos la matriz B y \([\vec{v}]_\mathcal{B}\) pero no tenemos \([\vec{v}]_\mathcal{B_2}\)? Un poquito más de álgebra nos revela que:
$$B^{-1}B [\vec{v}]_\mathcal{B_2} = B^{-1}[\vec{v}]_\mathcal{B} \rightarrow [\vec{v}]_\mathcal{B_2} =B^{-1}[\vec{v}]_\mathcal{B} $$
Es decir, que si multiplicamos la inversa de la matriz B por el vector representado en la base estándar, obtenemos el vector representado en la base \(\mathcal{B_2}\).
Aplicación
Este pretende ser un blog sobre gráficos por ordenador, así que el siguiente paso lógico es preguntarse para que sirve esto de las cambios de bases. Voy a poner un ejemplo concreto en el que es muy conveniente.
Una matriz representa una transformación. Es decir, si multiplicamos una matriz por un vector estamos transformado ese vector. Una de esas transformaciones es la rotación. La matriz R asociada a una transformación de rotación de \(\alpha\) grados alrededor del eje X es la siguiente:
$$ R_{x, \alpha} = \begin{pmatrix}
1 & 0 & 0 \\
0 & \cos \alpha & -\sin \alpha \\
0 & \sin \alpha & \cos\alpha
\end{pmatrix} $$
En general, lo fácil es rotar un vector alrededor de los ejes X, Y, Z. ¿Pero y si queremos rotar alrededor de un eje arbitrario representado por el vector \(\vec{a}\)? Lo que podemos hacer es lo siguiente:
- Formamos una base a partir de \(\vec{a}\)(1)Building an orthonormal basis from a unit vector, encontrando nuevos vectores \(\vec{b}\) y \(\vec{c}\), tal y como se muestra en la figura de abajo.
- Alineamos esta base con la base estándar de forma que \(\vec{a}\) coincida con \(\vec{x}\). O dicho de forma equivalente: representamos el vector que queremos transformar en función de esta nueva base \(\{\vec{a}, \vec{b}, \vec{c}\}\).
- Rotamos en el eje X (que ahora es el eje a), utilizando la matriz de rotación que conocemos.
- Deshacemos el cambio de base. Es decir, pasamos de la base \(\{\vec{a}, \vec{b}, \vec{c}\}\) a la base estándar.
Los pasos 2) y 4) representan cambios de base.
Sabemos que la matriz para cambiar de la base \(\{\vec{a},\vec{b}, \vec{c}\}\) a la base estándar es:
$$ M = \begin{pmatrix}
a_x & b_x & c_x \\
a_y & b_y & c_y \\
a_z & b_z & c_z
\end{pmatrix} $$
Si los vectores \(\vec{a}\), \(\vec{b}\) y \(\vec{c}\) son ortogonales y de longitud 1, la matriz M es ortogonal, por lo que su inversa es igual a su traspuesta. Esto significa que la matriz que transforma de la base estándar a la base \(\{\vec{a}, \vec{b},\vec{c}\}\) es:
$$M^{-1}=M^{T} = \begin{pmatrix}
a_x & a_y & a_z \\
b_x & b_y & b_z \\
c_x & c_y & c_z
\end{pmatrix} $$
Por tanto, y siguiendo el orden que hemos mencionado antes, la transformación final para rotar un vector alrededor de un eje arbitrario \(\vec{a}\) quedaría:
$$MR_{x, \alpha}M^{T}$$
Ten en cuenta que estamos suponiendo una notación column-major, lo que significa que tenemos que leer las transformaciones de delante hacia atrás. Es decir, primero aplicaríamos \(M^{T}\), cambiando así de la base estándar a la otra base. A continuación, aplicaríamos \(R_{x, \alpha}\), que rotaría el vector alrededor del eje X (que ahora es el eje \(\vec{a}\)). Y finalmente, aplicaríamos \(M\), que volvería a representar el vector rotado en la base estándar.
Notas
Comentarios