Matriz de rotacion

De Codepixel

Una forma muy simple de conseguir una matriz de rotación desde cero es usar ángulos de Euler. Básicamente consiste en primero rotar sobre el eje X, luego sobre el Y, y luego sobre el Z. Esto se puede lograr de dos formas:

1. Calculando cada paso por separado, fácil ideal para empezar:


\begin{matrix}
\mathbf{r}_i = (\mathcal{M}_z * (\mathcal{M}_y * (\mathcal{M}_x * \mathbf{v}_i)))
\end{matrix}

Es decir, primero rotamos el vector sobre el eje X, ese resultado lo rotamos sobre el eje Y, y ese resultado sobre el eje Z para obtener el resultado final.


2. Calculando de un solo paso, mas complicado pero mas rápido:


\begin{align}
\mathbf{r}_i & = (\mathcal{M}_z * (\mathcal{M}_y * \mathcal{M}_x)) * \mathbf{v}_i
\end{align}

o lo que es lo mismo:


\begin{align}
\mathcal{M}_{yx} & = \mathcal{M}_y * \mathcal{M}_x \\
\mathcal{M}_{zyx} & = \mathcal{M}_z * \mathcal{M}_{yx} \\
\mathbf{r}_i & = \mathcal{M}_{zyx} * \mathbf{v}_i
\end{align}

De esta forma estamos aprovechando que los productos de matrices y vectores son asociativos al multiplicar, es decir que podemos mover los paréntesis como queramos. Dado que todos los vectores van a usar la misma matriz de rotación, solo hay que calcularla una vez y luego usarla en todos los vectores.

Para calcular la matriz Mzyx se parte de los ángulos de giro sobre cada eje, se calculan senos y cosenos de estos ángulos y finalmente se usan para calcular cada elemento de la matriz:


\begin{align}
ca & = \cos(\alpha) \\
sa & = \sin(\alpha) \\
cb & = \cos(\beta) \\
sb & = \sin(\beta) \\
cc & = \cos(\gamma) \\
sc & = \sin(\gamma) \\
\end{align}


\mathcal{M}_{zyx} =
\begin{pmatrix}
cc*ca & -cc*sa*cb + sc*sb & cc*sa*sb + sc*sb \\
sa & ca*cb & -ca*sb \\
-sc*ca & sc*sa*cb + cc*sb & -sc*sa*sb + cc*cb
\end{pmatrix}

Herramientas personales