Regístrate | Conectar
El Tamiz Libros Recursos Series Únete 21 Users Online
Skip to content

Explorando el álgebra geométrica 17 – Rotaciones en el espacio euclídeo tridimensional (II)




Siguiendo con la serie dedicada al álgebra geométrica, en esta entrada seguiré con las rotaciones que comenzamos a ver en la entrada anterior, pero hablaré del tratamiento, digamos, más convencional de las rotaciones. En los planes de estudio lo habitual es introducir las rotaciones como transformaciones lineales y utilizar las correspondientes matrices ortogonales para representarlas. Sin embargo, en las aplicaciones prácticas el uso de los rotores (cuaterniones unitarios) del álgebra geométrica es de conocimiento obligado por las razones que veremos al final.

La rotación como transformación lineal. Matriz asociada a una rotación

El enfoque matemático habitual para tratar las rotaciones es considerarlas como transformaciones lineales del espacio. Una transformación lineal \mathcal{T} es una aplicación de un espacio vectorial, \mathbf{V} a otro, \mathbf{W}, que cumple esta propiedad:

Para todo par de vectores \mathbf{v} y \mathbf{w} de \mathbf{V} y para cualquier par de escalares \lambda y \mu de \mathbb{R} tenemos:

\mathcal{T}\left(\lambda \mathbf{v} + \mu \mathbf{w}\right) = \lambda \mathcal{T}\left(\mathbf{v}\right) + \mu \mathcal{T}\left(\mathbf{w}\right)

Esta propiedad es equivalente al siguiente par de propiedades:

1) La transformación lineal de la suma de dos vectores cualesquiera es igual a la suma de transformaciones lineales de los vectores:

\mathcal{T}\left(\mathbf{v} + \mathbf{w}\right) = \mathcal{T}\left(\mathbf{v}\right) + \mathcal{T}\left(\mathbf{w}\right)

2) La transformación lineal del producto de un escalar por un vector es igual al producto del mismo escalar por la transformación lineal del vector:

\mathcal{T}\left(\lambda \mathbf{v}\right) = \lambda \mathcal{T}\left(\mathbf{v}\right)

Las transformaciones lineales que nos interesan serán aquellas en las que tanto el espacio vectorial de partida como el de llegada son el espacio vectorial tridimensional,o sea \mathbf{V} = \mathbf{W} = \mathcal{E}_3. Dentro de estas transformaciones lineales tenemos, por ejemplo:

1) Las homotecias. Estas transformaciones lineales consisten en multiplicar todo vector de \mathcal{E}_3 por un mismo escalar k. Si k \\textgreater 1 diremos que la homotecia es una dilatación, y si k \\textless 1 la homotecia es una contracción. Efectivamente, una dilatación (o, respectivamente, contracción) de la suma de dos vectores es igual la suma de las dilataciones (o, respectivamente, contracciones) de los dos vectores, y la dilatación del producto de un vector por un cierto factor escalar \lambda es igual a \lambda veces la dilatación del vector.

2) Las proyecciones de un vector respecto a otro vector o respecto a un bivector. También se cumple que la proyección de la suma de dos vectores es igual a la suma de proyecciones, así como también que la proyección de un vector multiplicado por un factor escalar \lambda es igual a la proyección del vector mutiplicada por \lambda.

3) Las simetrías y reflexiones. De nuevo aquí se cumple que la simetría o reflexión de la suma de dos vectores es igual a la suma de la simetría o reflexión de cada vector, así como que la simetría o reflexión del producto de un vector por un escalar es igual al producto del escalar por la simetría o reflexión del vector de partida.

4) Como las rotaciones las podemos interpretar como composiciones de dos simetrías o de dos reflexiones, y la composición de dos transformaciones lineales es a su vez otra transformación lineal, se deduce que las rotaciones son transformaciones lineales.

Representación de transformaciones lineales mediante matrices

Una consecuencia de la definición de transformación lineal es que para calcular la transformación lineal de un vector cualquiera basta conocer cuál es la transformación lineal de los vectores de una base del espacio vectorial en que nos encontremos. En particular, como nos encontramos en \mathcal{E}_3, basta conocer la transformación lineal de la base ortonormal de vectores \mathbf{e}_1, \mathbf{e}_2 y \mathbf{e}_3. Si expresamos un vector cualquiera de \mathcal{E}_3 en función de esta base:

\mathbf{v} = v_1 \mathbf{e}_1 + v_2 \mathbf{e}_2 + v_3 \mathbf{e}_3

tendremos, al aplicar las propiedades de linealidad, que la transformación \mathcal{T}\left(\mathbf{v}\right) será:

\mathcal{T}\left(\mathbf{v}\right) = \mathcal{T}\left(v_1 \mathbf{e}_1 + v_2 \mathbf{e}_2 + v_3 \mathbf{e}_3\right) = v_1 \mathcal{T}\left(\mathbf{e}_1\right) + v_2 \mathcal{T}\left(\mathbf{e}_2\right) + v_3 \mathcal{T}\left(\mathbf{e}_3\right)

A la hora de trabajar con transformaciones lineales es habitual utilizar el formalismo matricial. Para ello, expresaremos los vectores como matrices columna, de modo que el vector \mathbf{v} será identificado con la matriz \mathsf{v} de tres filas y una columna:

\\mathsf{v} = \\\left( \\begin{array}{c}  v_1 \\ v_2 \\  v_3  \\end{array} \\right)

Fijémonos que al utilizar matrices, estamos presuponiendo una cierta base (en nuestro caso, ortonormal, pero no necesariamente siempre tiene por qué ser así) de vectores, ya que las tres componentes de la matriz columna que representa un vector se refieren a esa base ortonormal en concreto. Otro vector \mathbf{w} = w_1 \mathbf{e}_1 + w_2 \mathbf{e}_2 + w_3 \mathbf{e}_3 quedaría representado matricialmente por la correspondiente matriz columna:

\\mathsf{w} = \\left[ \\begin{array}{c} w_1 \\ w_2 \\ w_3 \\end{array} \\right]

Si ahora quisiéramos calcular, por ejemplo, el producto interior \mathbf{v} \cdot \mathbf{w} = \left(v_1 \mathbf{e}_1 + v_2 \mathbf{e}_2 + v_3 \mathbf{e}_3\right) \cdot \left(w_1 \mathbf{e}_1 + w_2 \mathbf{e}_2 + w_3 \mathbf{e}_3\right) = v_1 w_1 + v_2 w_2 + v_3 w_3, podríamos hacerlo también utilizando matrices, recurriendo a la matriz transpuesta y al producto de matrices:

\\mathsf{v^T} \\mathsf{w} = \\left( \\begin{array}{ccc} v_1 &v_2 &v_3 \\end{array}\\right) \\left( \\begin{array}{c}  w_1 \\ w_2 \\  w_3  \\end{array} \\right) = \\left(v_1 w_1 + v_2 w_2 + v_3 w_3\\right) = \\left(\\mathbf{v} \\cdot \\mathbf{w}\\right)

La transposición de una matriz consiste en obtener una matriz a partir de otra intercambiando filas por columnas. De este modo, la matriz transpuesta de \mathsf{v}, que indicamos como \mathsf{v^T}, será una matriz fila (tiene una única fila y tres columnas). El producto escalar de vectores puede entonces realizarse, como se puede apreciar, como el producto de la matriz \mathsf{v^T} por la matriz \mathsf{w}. El producto de una matriz fila como \mathsf{v^T} por una matriz columna como \mathsf{w} es el caso más sencillo del producto de matrices: para poder hacer el producto es imprescindible que el número de columnas de la primera matriz (3, en nuestro caso) coincida con el número de filas de la segunda matriz. El número de filas de la matriz resultante será el mismo número de filas de la primera matriz que se multiplica (en este caso, 1) y el número de columnas será el número de columnas de segunda matriz (también 1 en este caso). Por tanto, el resultado es una matriz de una fila y una columna, o sea, un número real, que resulta ser el producto escalar euclídeo de los vectores \mathbf{v} y \mathbf{w}.

¿Cómo se representa entonces una transformación lineal de \mathcal{E}_3 en \mathcal{E}_3? Sencillamente, se representa con una matriz de tres filas y tres columnas, de modo que la columna i represente el vector resultante de transformar el vector \mathbf{e}_i de la base, tal como se muestra en la figura:

Representación de transformaciones lineales mediante matrices

La matriz \mathsf{T} representa la transformación lineal \mathcal{T}, como podría ser (o no) una rotación. El elemento de la matriz situado en la fila i, columna j viene dado por la componente i de la imagen (\mathcal{T}\left(\mathbf{e_j}\right)) del j-ésimo vector de la base que utilicemos. Los vectores se representan por matrices columna, donde el elemento situado en la fila j representa la componente j del vector, según la base utilizada (en nuestro caso, la base ortonormal \mathbf{e}_1, \mathbf{e}_2, \mathbf{e}_3). Para calcular la imagen de un vector \mathbf{v} cualquiera mediante el formalismo matricial basta multiplicar la matriz \mathsf{T} por el vector columna \mathsf{v}. Para multiplicar dos matrices es necesario que el número de columnas de la primera coincida con el número de filas de la segunda, y el resultado será una matriz con el mismo número de filas que la primera matriz y el mismo número de columnas que la segunda matriz. El elemento de la matriz producto situado en la fila i y columna j será el “producto escalar” (entendido como suma de productos de componentes correspondientes) del i-ésimo “vector fila” de la primera matriz por el j-ésimo “vector columna” de la segunda matriz: en la figura se ha señalado como se obtiene la segunda componente del vector columna \mathsf{T \, e_1} como producto de la segunda fila de la matriz \mathsf{T} por el vector columna \mathsf{e_1}. También se visualiza matricialmente cómo la vector imagen del vector columna \mathsf{e}_j no es más que el j-ésimo vector columna de la matriz \mathsf{T}.

Una matriz \mathsf{T} cualquiera estará asociada a una transformación lineal. Pero ahora sólo queremos considerar específicamente las rotaciones entre las transformaciones lineales, y por tanto tenemos que ver qué matrices describen una rotación. En primer lugar, las rotaciones conservan las longitudes, mantienen la norma de los vectores rotados. Concretamente, las columnas de la matriz \mathsf{R} que describe una rotación \mathcal{R} representan los vectores ya rotados de la base ortonormal de partida, tal como se muestra en la siguiente figura:

Rotación en 3D. Vectores vs matrices

Pero como \mathsf{R} no es una matriz asociada a una transformación lineal cualquiera, sino que representa una rotación, debe cumplir ciertas condiciones extra. Para empezar, los vectores que resultan de rotar los vectores de la base ortonormal deben formar también a su vez una base ortonormal. Así que estos vectores deben estar normalizados, y deben cumplir \mathbf{e^\prime}_1 \cdot \mathbf{e^\prime}_1 = \mathbf{e^\prime}_2 \cdot \mathbf{e^\prime}_2 = \mathbf{e^\prime}_3 \cdot \mathbf{e^\prime}_3 = 1. En lenguaje matricial el producto interior de vectores se expresa mediante el producto del vector transpuesto (“vector fila”) por un vector (“vector columna”) sin transponer, de modo que escribiremos:

\\mathsf{e^\\prime}_1^\\mathsf{T} \\mathsf{e^\\prime}_1 = \\left[ \\begin{array}{ccc} r_{11} \\& r_{21} \\& r_{31} \\end{array}\\right] \\left[ \\begin{array}{c} r_{11} \\ r_{21} \\r_{31} \\end{array}\\right] = 1

\\mathsf{e^\\prime}_2^\\mathsf{T} \\mathsf{e^\\prime}_2 = \\left[ \\begin{array}{ccc} r_{12} \\& r_{22} \\& r_{32} \\end{array}\\right] \\left[ \\begin{array}{c} r_{12} \\ r_{22} \\r_{32} \\end{array}\\right] = 1

\\mathsf{e^\\prime}_3^\\mathsf{T} \\mathsf{e^\\prime}_3 = \\left[ \\begin{array}{ccc} r_{13} \\& r_{23} \\& r_{33} \\end{array}\\right] \\left[ \\begin{array}{c} r_{13} \\ r_{23} \\r_{33} \\end{array}\\right] = 1

Además, dos vectores diferentes de la base rotada deben ser ortogonales entre sí, y se deberá cumplir también que:

\mathbf{e^\prime}_i \cdot \mathbf{e^\prime}_j = 0, cuando i \neq j.

Lo que matricialmente se expresaría así:

\\mathsf{e^\\prime}_i^\\mathsf{T} \\mathsf{e^\\prime}_j = \\left[ \\begin{array}{ccc} r_{1i} \\& r_{2i} \\& r_{3i} \\end{array}\\right] \\left[ \\begin{array}{c} r_{1j} \\ r_{2j} \\r_{3j} \\end{array} \\right] = 0, cuando i \neq j.

Pero resulta que todas estas condiciones de normalización y ortogonalidad se pueden expresar como una única identidad matricial, que no es más que \mathsf{R^T} \mathsf{R} = \mathbb{1}, donde \mathsf{R^T} es la matriz transpuesta de \mathsf{R}, o sea, el resultado de cambiar filas por columnas, y \mathbb{1} es la matriz identidad, es decir, aquella matriz que tiene unos en la diagonal principal (cuando el índice de fila y el de columna son iguales) y ceros en el resto de posiciones:

\\mathsf{R^T} \\mathsf{R} = \\left[ \\begin{array}{ccc} r_{11} & r_{21} & r_{31} \\\\ r_{12} & r_{22} & r_{32} \\\\ r_{31} & r_{32} & r_{33} \\end{array} \\right] \\left[ \\begin{array}{ccc} r_{11} & r_{12} & r_{13} \\\\ r_{12} & r_{22} & r_{23} \\\\ r_{13} & r_{23} & r_{33} \\end{array} \\right] = \\left[ \\begin{array}{ccc} 1 & 0 & 0 \\\\ 0 & 1 & 0 \\\\ 0 & 0 & 1 \\end{array} \\right] = \\mathbb{1}

Efectivamente, el elemento situado en la fila i y columna j del resultado del producto de matrices no es más que el producto interior del vector \mathbf{e^\prime}_i, que está codificado en la fila i de la matriz \mathsf{R^T}, por el vector \mathbf{e^\prime}_j, codificado en la columna j de la segunda matriz. Resulta, pues, que la identidad \mathsf{R^T} \mathsf{R} = \mathbb{1} no nos está diciendo otra cosa más que en una matriz de rotación los vectores columna forman una base ortonormal, ya que la tabla de productos escalares \mathbf{e^\prime}_i \cdot \mathbf{e^\prime}_j es precisamente la matriz identidad. El conjunto formado por todas las matrices \mathsf{M} de tres filas y tres columnas que cumplen \mathsf{M^T} \mathsf{M} = \mathbb{1} se llama \mathrm{O(3)}, el llamado grupo ortogonal de 3 dimensiones.[1]

Pero no toda matriz de \mathrm{O(3)} es una matriz de rotación. Dentro de \mathrm{O(3)} hay también matrices que representan reflexiones, las transformaciones que, dicho coloquialmente, transforman una mano izquierda en una mano derecha, algo imposible de conseguir haciendo rotaciones. Para excluir las reflexiones hay que introducir una condición más: la orientación de la base ortonormal rotada tiene que ser la misma que la de la base antes de la rotación. Esta condición se puede expresar con el producto exterior de vectores:

\mathbf{e}_1 \wedge \mathbf{e}_2 \wedge \mathbf{e}_3 = \mathbf{e^\prime}_1 \wedge \mathbf{e^\prime}_2 \wedge \mathbf{e^\prime}_3

La igualdad anterior expresa que el volumen orientado del cubo que tiene por aristas los vectores de la base ortonormal es el mismo antes que después de la rotación, sin cambios de signo debidos a cambios de orientación.[2] Si expresamos los vectores de la base rotada en términos de la base antigua llegamos a esta expresión para \mathbf{e^\prime}_1 \wedge \mathbf{e^\prime}_2 \wedge \mathbf{e^\prime}_3:

\mathbf{e^\prime}_1 \wedge \mathbf{e^\prime}_2 \wedge \mathbf{e^\prime}_3 = \left( r_{11} \mathbf{e}_1 + r_{21} \mathbf{e}_2 + r_{31} \mathbf{e}_3 \right) \wedge \left( r_{12} \mathbf{e}_1 + r_{22} \mathbf{e}_2 + r_{32} \mathbf{e}_3 \right) \wedge \left( r_{13} \mathbf{e}_1 + r_{23} \mathbf{e}_2 +r_{33} \mathbf{e}_3 \right) = \dots =

{\\color{Red}\\left( r_{11} r_{22} r_{33} + r_{31} r_{12} r_{23} + r_{21} r_{32} r_{13} - r_{21} r_{12} r_{33} - r_{11} r_{32} r_{23} - r_{31} r_{22} r_{13} \\right)} \\, \\mathbf{e}_1 \\wedge \\mathbf{e}_2 \\wedge \\mathbf{e}_3 =

{\color{Red}\det(\mathsf{R})} \, \mathbf{e}_1 \wedge \mathbf{e}_2 \wedge \mathbf{e}_3

Al desarrollar el producto exterior acaba apareciendo multiplicando al trivector un factor, señalado en verde, conocido como determinante de la matriz \mathsf{R}. El determinante indica por cuánto se multiplica el volumen del pseudoescalar unitario \mathbf{e}_1 \wedge \mathbf{e}_2 \wedge \mathbf{e}_3 tras la transformación lineal, indicando un signo negativo un cambio de orientación respecto a la base de partida. Para las matrices de \mathrm{O(3)} el valor del determinante sólo puede ser +1 o -1, pero si ademas queremos que la matriz represente una rotación el determinante sólo puede valer +1. El subconjunto de matrices de \mathrm{O(3)} cuyo determinante vale +1, con la operación de producto matricial, forman el grupo \mathrm{SO(3)}, que sí representa el grupo de rotaciones en el espacio euclídeo tridimensional.[3]

Rotores (cuaterniones unitarios) versus matrices: eficiencia de cálculo

Por tanto, podemos representar rotaciones en el espacio tridimensional utilizando matrices de \mathrm{SO(3)}, como hemos visto en esta entrada, o, como vimos en la entrada pasada, las podemos representar utilizando cuaterniones unitarios (exponenciales de bivectores unitarios). Y aquí se plantea cuál de los dos métodos es más práctico. Imaginemos el programador de un videojuego en que se visualicen escenas realistas en 3D o de un simulador de vuelo en tiempo real: esta cuestión deberá tenerla muy en cuenta.

Para hallar la rotación resultante, \mathcal{R},de componer dos rotaciones, la primera \mathcal{R}_1, seguida de una segunda \mathcal{R}_2, \mathcal{R} = \mathcal{R}_2 \circ \mathcal{R}_1, utilizando matrices de \mathrm{SO(3)} tendremos que multiplicar dos matrices de tres filas y tres columnas: \mathsf{R} = \mathsf{R}_2 \mathsf{R}_1. Esto requiere hacer 3 multiplicaciones para obtener cada uno de los 9 elementos de la matriz correspondiente a la rotación resultante final, en total, 27 multiplicaciones. Las multiplicaciones son computacionalmente mucho más costosas que las sumas, que no tenemos en cuenta (y, por cierto, también el número de sumas a realizar en el caso del producto de matrices supera al necesario en el caso del producto de cuaterniones).

Si componemos rotaciones utilizando cuaterniones unitarios tendremos que multiplicar las cuatro componentes del primer rotor asociado a la primera rotación por las cuatro del segundo rotor, en total 16 multiplicaciones. Esto es computacionalmente mucho más eficiente que multiplicar matrices, pero los beneficios del uso de cuaterniones unitarios no acaban aquí…

Espacio de almacenamiento

En caso de que sea necesario almacenar rotaciones en disco o en memoria RAM, para almacenarlas en formato matricial hacen falta 9 números para cada una y para almacenarlas como cuaterniones sólo hacen falta cuatro (de hecho, “poco más de tres”, porque una componente de cuaternión se puede deducir de las otras tres por la condición de normalización, a excepción de un bit de signo que habría que tener también para que no faltara nada).

Acumulación de errores de redondeo

Cuando el programador del videojuego tenga que componer sucesivamente n rotaciones, \mathcal{R}_1, seguida de \mathcal{R}_2\mathcal{R}_n se irán acumulando inevitablemente errores de redondeo. Si utilizamos matrices de \mathrm{SO(3)}, estos errores harán que la matriz obtenida como resultado final, \mathsf{R} = \mathsf{R}_n \mathsf{R}_{n-1} \dots \mathsf{R}_2  \mathsf{R}_1 ya no cumpla la condición \mathsf{R^T} \mathsf{R} = \mathbb{1}, debido a la acumulación de errores, y los vectores de la base ortonormal transformada, que aparecen representados en las columnas de la matriz \mathsf{R}, ya no estarán bien normalizados, ni serán perfectamente perpendiculares entre sí, e incluso el volumen orientado que formen dejará de valer exactamente 1, y seguramente habrá aumentado o disminuido. Como esto no puede consentirse habrá que corregir la matriz obtenida antes de que el problema se desmadre, de modo que sus vectores columna estén perfectamente normalizados y sean perpendiculares entre sí. Hay un procedimiento muy conocido de lograr esto, llamado método de ortonormalización de Gram-Schmidt, que ya tendremos ocasión de ver en otra entrada. Pero tiene el problema de ser engorroso y poco elegante, porque obliga a elegir en un cierto orden, (normalizando primero uno de los vectores columna, a continuación restar de un segundo vector su proyección respecto al primero y normalizar el resultado a su vez, restar del tercer vector sus proyecciones respecto a los dos vectores normalizados obtenidos antes y normalizar el resultado, etc.) y la matriz corregida dependerá del orden en que se haya decidido normalizar los vectores, cosa que se notará tanto más cuanto más se haya dejado acumular los errores. En fin, el método de Gram-Schmidt sin más modificación resulta en sí mismo ser inestable computacionalmente: un auténtico horror para un programador que tenga que presentar una animación realista en tiempo real…

Interpolación de rotaciones

El uso de matrices de \mathrm{SO(3)} tampoco es muy conveniente para la interpolación de rotaciones. Nuestro imaginario programador del videojuego, para representar un movimiento animado lo suficientemente suave, necesitará interpolar entre un estado inicial y un estado final de rotación, cada uno de ellos representado por una matriz de \mathrm{SO(3)}. El problema es que si decide ingenuamente interpolar cada elemento r_{ij} de la matriz por separado obtendrá matrices que no serán ni por asomo de \mathrm{SO(3)}. Lo que hace falta es tener el eje y el ángulo de rotación del objeto a rotar en el estado inicial, el eje y ángulo de rotación del objeto a rotar en el estado final e interpolar orientaciones de los ejes de rotación intermedios y valores del ángulo de rotación de forma adecuada, y luego traducirlo a lenguaje matricial. Pero, ¿cómo se visualiza en una matriz de \mathrm{SO(3)} el eje y ángulo \theta de rotación? La teoría dice que la traza de una matriz de rotación (la suma de los valores de la diagonal principal de la matriz (\operatorname{tr}(\mathrm{R}) = r_{11} + r_{22} + r_{33}) vale 1 + 2 \cos {\theta}, lo que permite calcular el coseno del ángulo, y a partir de ahí su valor absoluto (el signo, asociado al sentido de rotación, queda indeterminado, con lo que queda pendiente el trabajo de deducirlo aparte). En cuanto a “visualizar” el eje de rotación en una matriz de \mathrm{SO(3)} dada, hay que encontrar lo que en la jerga matemática se llama un autovector de la matriz con autovalor unidad, es decir, un vector que cumpla \mathsf{R} \mathsf{v} = \mathsf{v}, que en principio no es algo que se pueda decir que salte a la vista… Se trata de encontrar un vector normalizado que da la solución a un sistema de ecuaciones indeterminado.

En cambio, estos problemas se solucionan muy fácilmente con cuaterniones unitarios. El problema de la acumulación de errores se arregla de forma inmediata normalizando el cuaternión obtenido como resultado del producto de cuaterniones: dividiendo el cuaternión entre su módulo volvemos a tener un cuaternión unitario que vuelve a representar automáticamente una rotación, y en la animación veremos cómo el objeto animado va rotando sin crecer ni encogerse como resultado de la acumulación de errores (al usar cuaterniones en vez de matrices, el único tipo de distorsión que puede aparecer si no nos preocupamos de la normalización son cambios uniformes de escala, quedando excluidas de antemano escalas diferentes de distorsión según la dirección). El tratamiento de la acumulación de errores es incomparablemente más sencillo usando cuaterniones unitarios.

El problema de la interpolación entre diferentes estados de rotación es muy sencillo, porque en un rotor \mathbf{R} es inmediato reconocer el eje y ángulo (con su correspondiente sentido expresado de forma inambigua) de rotación:

\mathbf{R} = e^{\frac{\theta}{2} \hat{\mathbf{n}} \mathbf{I}} = \cos \frac{\theta}{2} + \hat{\mathbf{n}} \mathbf{I} \operatorname{\textrm{sen}} \frac{\theta}{2}

Simplemente se identifica la parte real del rotor con \cos \frac{\theta}{2}. Suponiendo que \cos \frac{\theta}{2} \neq \pm 1 (que correspondería, no importa el signo, al caso de una transformación identidad),[4] tendremos que la parte bivectorial será no nula, y se podrá identificar con el bivector que da el plano de rotación. La norma de este bivector se puede identificar con el seno del semiángulo de rotación, y el sentido de rotación queda determinado de forma no ambigua: no importa cómo se elija el signo del ángulo, el sentido de rotación queda siempre expresado por el sentido del vector unitario \hat{\mathbf{n}}, que cambiará acordemente con la elección del signo para seguir la regla de la mano derecha (suponiendo que hemos elegido la orientación derecha para el pseudoescalar unitario estándar \mathbf{I} = \mathbf{e}_1 \wedge \mathbf{e}_2 \wedge \mathbf{e}_3):

Sólo hay un aspecto en que el uso de matrices es superior al de cuaterniones en el tratamiento de rotaciones en 3D. Se trata, una vez se tiene la rotación deseada perfectamente calculada, de aplicarla a una serie de vectores, por ejemplo para obtener una escena tridimensional rotada. Matricialmente, se trata hacer el producto de la matriz de rotación por el vector columna: \mathsf{R} \mathsf{v}. Eso supone hacer 9 multiplicaciones: cada una de las tres componentes del vector rotado se obtiene como producto interior (suma de tres multiplicaciones) de cada vector fila de \mathsf{R} por el vector original. Con álgebra geométrica hay que calcular, como ya vimos en la entrada pasada, el sandwich multiplicativo siguiente: \widetilde{\mathbf{R}} \mathbf{v} \mathbf{R}, donde \mathbf{R} es el rotor (cuaternión unitario) asociado a la rotación \mathcal{R}. Operando astutamente, eso aún se puede reducir a hacer 15 multiplicaciones, lo cual no es suficiente para competir con las matrices. Así que más vale, una vez tenemos el rotor \mathbf{R}, calcular la matriz\mathsf{R} encontrando las imágenes de los vectores de la base ortonormal estándar, y una vez ahí, se calcula matricialmente la rotación de todos los vectores que haga falta. Sólo en este aspecto concreto, la rotación de vectores, la superioridad del método matricial es indiscutible.

Las ventajas del tratamiento de rotaciones con álgebra geométrica sobre la utilización de matrices se puso de manifiesto de forma práctica en la segunda mitad de la década de los 90, cuando apareció un videojuego que funcionaba en los primeros ordenadores con procesador Intel Pentium y compatibles (y a diferencia de otros juegos 3D de aquella época que todavía no utilizaban cuaterniones, también incluso en procesadores 486, de la generación anterior). Gracias al uso de cuaterniones fue posible exprimir al máximo las capacidades de aquellos primitivos procesadores y mostrar las aventuras de una ágil y atractiva arqueóloga que no paraba de dar volteretas y giros rapidísimos mientras se movía en un mundo totalmente tridimensional, respondiendo inmediatamente a los comandos de los jugadores, que hasta entonces no habían visto nada igual en aquellos ordenadores, mucho más lentos que los de hoy en día (ya habían aparecido otros juegos de aventuras en 3D, pero como no usaban cuaterniones no podían competir con éste por lo que se refiere a la rapidez, eficiencia y realismo en el tratamiento de las rotaciones).

En la próxima entrada veremos en más detalle que el modo en que las rotaciones se representan en \mathrm{SO(3)} y el modo en que se representan con rotores (o cuaterniones unitarios, o espinores unitarios de \mathcal{G}_3, como queráis decir) no son completamente equivalentes, qué hay detrás de eso y qué relación puede tener, por ejemplo, con la Física o con la robótica.

  1. En los libros de texto la deducción de que la matriz inversa de la matriz asociada a una transformación isométrica es la matriz transpuesta se suele hacer de forma más expeditiva y elegante. Como el producto escalar de vectores determina la métrica (cómo se miden las longitudes y ángulos), tiene que conservarse en una transformación isométrica, es decir, para cualquier par de vectores \mathbf{v} y \mathbf{w}, el producto escalar \mathbf{v} \cdot \mathbf{w^} debe conservarse y ser por tanto igual a \mathbf{v^\prime} \cdot \mathbf{w^\prime}, donde \mathbf{v^\prime} y \mathbf{w^\prime} son los respectivos vectores transformados. Pero matricialmente esto se escribe:

    \mathsf{v^T} \mathsf{w} = \mathsf{v^{\prime T} \mathsf{w^\prime} = \mathsf{v^T} \mathsf{R^T} \mathsf{R} \mathsf{w}

    Y de ahí se deduce que si la igualdad es cierta para cualquier par de matrices columna \mathsf{v} y \mathsf{w}, debe cumplirse \mathsf{R^T} \mathsf{R} = \mathbb{1}. []

  2. Si la transformación fuera una reflexión se introduciría una cambio de signo en el fórmula: \mathbf{e}_1 \wedge \mathbf{e}_2 \wedge \mathbf{e}_3 = - \mathbf{e^\prime}_1 \wedge \mathbf{e^\prime}_2 \wedge \mathbf{e^\prime}_3. []

  3. La S de \mathrm{SO(3)} viene de special, por incluir sólo las matrices de determinante igual a +1. En el grupo ortogonal \mathrm{O(3)} hay tanto matrices de determinante +1 como -1. En \mathrm{SO(3)}, todas las matrices tienen determinante +1. []

  4. Lo que vemos aquí es que el mismo rotor cambiado de signo representa la misma rotación. Efectivamente, si para rotar un multivector cualquiera hacemos \mathbf{M}^\prime = \widetilde{\mathbf{R}} \mathbf{M} \mathbf{R}, un cambio de signo de \mathbf{R} implica también el cambio de signo de \widetilde{\mathbf{R}}, y por tanto se obtiene el mismo resultado para \mathbf{M}^\prime. El hecho de que una misma rotación esté representada por dos rotores, a diferencia de las matrices de \mathrm{SO(3)}, en que una rotación está representada por solamente una matriz, será especialmente importante en la próxima entrada. []


Sobre el autor:

jlese (Juan Leseduarte)

Soy licenciado en Ciencias Físicas y profesor de Matemáticas de Educación Secundaria en excedencia. Además de la Física y de las Matemáticas, me gusta la música antigua y trastear en el sistema operativo GNU/Linux. También intento que mis conocimientos de alemán no se oxiden.
 

Escribe un comentario

Tu dirección de correo no es mostrada. Los campos requeridos están marcados *

Al escribir un comentario aquí nos otorgas el permiso irrevocable de reproducir tus palabras y tu nombre/sitio web como atribución.