En MATHEMATICA, la rotación de un objeto tridimensional se puede hacer con RotateShape[obj, ,, ] con [0,]. La rotación dada por los ángulos de Euler , y puede ser descompuesta en una sucesión de tres rotaciones sucesivas. La primera rota un ángulo alrededor del eje Z, la segunda rota un ángulo alrededor del eje X y la tercera rota un ángulo alrededor del eje Z nuevamente. RotateShape[ ] determina la matriz de rotación correspondiente y la aplica a todas los puntos del objeto geometrico. El comando RotationMatrix3D[ ,, ] da la matriz de rotación correspondiente a las tres rotaciones sucesivas determinadas por los ángulos de Euler.
El problema es: dado y
u, cuál es la relación entre los ángulos de Euler y y
u?. La relación más sencilla se obtiene usando quaterniones.
Los quaterniones son objetos
[a,v], donde a es un escalar y
v IR3.
La suma y la multiplicación (no commutativa) de quaterniones se define así:
[a1,v] + [a2,u] = [a1 + a2, v + u]
[a1,v][a2,u] = [a1a2 - v . u, a1u + a2v + u×v]
La norma de un quaternion se define como
||[a, v]|| =
Si
1l = [1,(0, 0, 0)] entonces
[a, v]1l = 1l[a, v].
[a, v]- 1=, i.e. [a, v][a, v]- 1 = 1l
Con esta álgebra se puede mostrar que un vector
v puede ser rotado alrededor de un eje aplicando la
operación
qvq- 1. Lo que hacemos es, abusando del
lenguaje, identificar
v con
[0, v]. De esta manera,
si
u = {u1, u2, u3} (unitario), si
q = [cos(/2), sen(/2)u] y si
[0,v'] = q [0, v] q- 1, se tiene que
v' es una rotación de
v, de ángulo
, alrededor de
u.
Con este último resultado podemos determinar una relación entre los ángulos de Euler y una rotación de ángulo
, alrededor de
u. Para esto, ponemos las rotaciones correspondientes a los ángulos de Euler en lenguaje de quaterniones e igualamos:
[cos(/2), sen(/2)u] = [cos(/2), sen(/2)k] [cos(/2), sen(/2)j] [cos(/2), sen(/2)k]
luego, desarrollando la multiplicación de la derecha e igualando, se obtiene
cos(/2) | = | cos(/2) cos( + ) |
u1 | = | - (sen)-1 sen sen( - ) |
u2 | = | (sen)-1 sen cos( - ) |
u3 | = | (sen)-1 cos sen( + ) |
Esto nos dice que, en general, para hacer animaciones que involucran rotaciones de objetos tridimensionales alrededor de una recta, es mejor usar una implementación matricial (o en términos de quaterniones).