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(![]() |
= | cos(![]() ![]() ![]() ![]() |
u1 | = | - (sen![]() ![]() ![]() ![]() ![]() ![]() ![]() |
u2 | = | (sen![]() ![]() ![]() ![]() ![]() ![]() ![]() |
u3 | = | (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).