63 votos

¿Cómo se gira un vector mediante un cuaternión unitario?

Dado un vector derecho de 3 variables v que es una traslación medida en el espacio local y un cuaternión unitario que representa una orientación desde el espacio local al espacio mundial, ¿cómo se utiliza el cuaternión para girar el vector desde el espacio local al espacio mundial?

Para facilitar su uso, los valores son:

Vector v \= $[1.0, 0.0, 0.0]$

Quaternion $q = [W: 0.7071068, X: 0, Y: 0.7071068, Z: 0]$ que entiendo que es una rotación $90^\circ (\frac{\pi}{2})$ alrededor del $Y$ -y que convierte del espacio local al espacio mundial. (Es decir, el vector resultante es $[0.0, 0.0, 1.0]$ (y si esto fuera la nariz de una nave espacial, estaría apuntando a la derecha en coordenadas mundiales)

Gracias.

0 votos

@Narf: En respuesta a tu anterior pregunta, había enlazado a este artículo de la Wikipedia en mi respuesta: es.wikipedia.org/wiki/Quaternions_and_spatial_rotation . ¿Podría decir más concretamente qué parte de la explicación no entiende?

0 votos

No estoy rotando el cuaternión; estoy rotando el vector. Parece que sería una cosa diferente.

0 votos

@Narf: No, eso es exactamente lo que se describe ahí; incluso había enlazado a la sección correspondiente del artículo en mi respuesta a tu pregunta anterior: es.wikipedia.org/wiki/

109voto

jhensley2 Puntos 53

La respuesta simple a la pregunta es, dada:

 R = [w, x, y, z]  
 P = [0, p1, p2, p2]
 R' = [w, -x, -y, -z] 

Puedes calcular el vector resultante utilizando el producto de Hamilton H(a, b) (descrito aquí: http://en.wikipedia.org/wiki/Quaternion#Hamilton_product ) por:

 P' = RPR'
 P' = H(H(R, P), R')

En el ejemplo dado estos son:

 R = [0.7071203316249954, 0.0, 0.7071203316249954, 0.0]
 R' = [0.7071203316249954, 0.0, -0.7071203316249954, 0.0]
 P = [0, 1, 0, 0]
 H(R, P) = [0.0, 0.7071203316249954, 0.0, -0.7071203316249954]
 H(H(R, P), R') = [0.0, 0.0, 0.0, -1.0000383267948871]

Observe que el resultado es un vector de longitud 4; el componente w siempre será cero y puede ser descartado.

Es decir. El punto (1, 0, 0) se transforma mediante una rotación alrededor del eje Y de 90 grados y se convierte en (0, 0, -1)

Para aquellos que no estén familiarizados con los cuaterniones, vale la pena señalar que el cuaternión R se genera como se describe aquí ( http://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation ):

a = angle to rotate
[x, y, z] = axis to rotate around

R = [cos(a/2), sin(a/2)*x, sin(a/2)*y, sin(a/2)*z]

18 votos

Cómo es que no es la respuesta aceptada está más allá de mí

44voto

Stephan Aßmus Puntos 16

Parece que tienes muchos problemas con esto, en varias preguntas. Al mismo tiempo, estoy seguro de que no obtendrás respuestas satisfactorias mientras te ciñas a la terminología que estás utilizando. Tal vez en el sitio original de stack overflow, dirigido a los programadores.

Por favor, lee esto: http://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation

y esto: http://en.wikipedia.org/wiki/Quaternions

Para responder no mucho más que tu pregunta, cualquier cuaternión es una expresión $$ q = w + x \; \mathbf{i} + y \; \mathbf{j} + z \; \mathbf{k}.$$ donde las reglas de multiplicación utilizan $$ \mathbf{i}^2 = \mathbf{j}^2 = \mathbf{k}^2 = \mathbf{i} \mathbf{j}\mathbf{k} = -1, $$ y las consecuencias de los mismos, ver wikipedia como he dicho. Cualquier cuaternión $ q = w + x \; \mathbf{i} + y \; \mathbf{j} + z \; \mathbf{k}$ tiene un conjugado, que en wikipedia se escribe $q^\ast,$ dado por $$ q^\ast = w - x \; \mathbf{i} - y \; \mathbf{j} - z \; \mathbf{k}.$$

La "norma" del cuaternión $q$ es exactamente $$ \parallel q \parallel^2 = w^2 + x^2 + y^2 + z^2 = q q^\ast = q^\ast q$$

Un cuaternión $q$ se llama cuaternión "unidad" cuando $$ w^2 + x^2 + y^2 + z^2 = 1. $$

Un cuaternión se denomina "puro" o vector en el espacio 3 cuando $ w = 0,$ por lo que un vector en el espacio 3 es $$ v = v_1 \; \mathbf{i} + v_2 \; \mathbf{j} + v_3 \; \mathbf{k} $$ No tengo ni idea de cómo llaman los ingenieros y programadores a estos conceptos. Usted está preguntando a los matemáticos.

Dados dos cuaterniones, la norma del producto es el producto de las normas.

La "parte real" (la $w$ ) del producto de dos cuaterniones $pq$ es la misma que la "parte real de $qp.$

Entonces, ¿qué sucede cuando tomo un cuaternión unitario $q$ y un cuaternión "puro" $v,$ y calcular $$ p = q^\ast v q.$$

Bueno, tenemos $$\parallel p \parallel = 1 \cdot \parallel v \parallel \cdot 1 = \parallel v \parallel $$

Pero en cuanto a la "parte real", comenzamos con $$ \Re v = 0,$$

entonces $$ \Re q^\ast (v q) = \Re (v q) q^\ast = \Re v (q q^\ast) = \Re v = 0. $$

Así que $ p = q^\ast v q$ es otro cuaternión puro, otro "vector", de la misma longitud que $v,$ pero rotado de donde estaba.

Eso es suficiente para empezar.

2 votos

De nuevo, no estoy preguntando cómo rotar un cuaternión por un vector esta vez; estoy preguntando cómo rotar un vector por un cuaternión, resultando en un vector que apunta en una dirección diferente.

1 votos

Como el "vector" de tu pregunta tiene tres coordenadas, basta con poner un 0 delante para obtener un cuaternión puro.

0 votos

Sólo para aclarar; para rotar el vector 3D "v" (que tiene una x,y,z y una coordenada real inexistente de 0), a qué equivalen las coordenadas x, y y z en términos de los valores de los cuaterniones (x,y,z y w). Por ejemplo, para un cuaternión "q" si quisiera determinar v.x (imagina el subíndice), podría ser v.x = q.w + q.z etc. No entiendo cómo p = q v q o la fórmula de la wiki: v' = qv(q^-1) ayuda en absoluto.

19voto

RPM Puntos 1032

La respuesta anterior de Doug me ha sido extraordinariamente útil. Lo que resulta difícil con muchas explicaciones de los cuaterniones y sus aplicaciones es que la notación es difícil de leer y entender para los alumnos.

Este sitio de Mathworks explica con más detalle cómo multiplicar cuaterniones: http://www.mathworks.com/help/aerotbx/ug/quatmultiply.html?requestedDomain=www.mathworks.com

También tiendo a pensar y aprender en términos de código. Esto es lo que al final he podido reconstruir en python:

def quaternion_mult(q,r):
    return [r[0]*q[0]-r[1]*q[1]-r[2]*q[2]-r[3]*q[3],
            r[0]*q[1]+r[1]*q[0]-r[2]*q[3]+r[3]*q[2],
            r[0]*q[2]+r[1]*q[3]+r[2]*q[0]-r[3]*q[1],
            r[0]*q[3]-r[1]*q[2]+r[2]*q[1]+r[3]*q[0]]

def point_rotation_by_quaternion(point,q):
    r = [0]+point
    q_conj = [q[0],-1*q[1],-1*q[2],-1*q[3]]
    return quaternion_mult(quaternion_mult(q,r),q_conj)[1:]

print(point_rotation_by_quaternion([1, 0, 0],[0.7071203316249954, 0.0, 0.7071203316249954, 0.0])

8voto

Catherine Puntos 6

No puedo asegurar que esto sea útil, pero a mí me ha servido.

Una rotación de cuaterniones realiza dos rotaciones complejas al mismo tiempo, en dos planos complejos diferentes.

Convierte tu 3-vector en un cuaternión añadiendo un cero en la dimensión extra. [0,x,y,z]. Ahora si multiplicas por un nuevo cuaternión, la parte vectorial de ese cuaternión será el eje de una rotación compleja, y la parte escalar es como el coseno de la rotación alrededor de ese eje. Esta es la parte que quieres, para una rotación 3D.

Pero la multiplicación de cuaterniones también te da una rotación compleja entre la cuarta dimensión y el eje, la misma cantidad de rotación que querías. No quieres esto. Te da una cuarta dimensión distinta de cero y hace saltar el eje de rotación.

Así que lo que haces, es primero multiplicar por un cuaternión que te da la mitad de la rotación que quieres, y también lo que no quieres. Luego multiplicas por el otro lado por un cuaternión que te da la otra mitad de la rotación que quieres, y cancela las cosas extra.

A veces no se necesita la doble rotación. Si quieres calcular una órbita elíptica, puedes utilizar un cuaternión ajustado al eje que hace que la elipse parezca un círculo. Entonces puedes calcular la posición a lo largo de la órbita en cualquier fracción de un ciclo completo. Haz que la cuarta dimensión sea el coseno, y que la suma de las otras sea el seno. Haz una multiplicación de cuaterniones y giras la componente circular justo hasta ese punto, y el eje de cuaterniones te da el resto de la ubicación, y la cuarta dimensión dice lo adelantado o atrasado que estás en el tiempo respecto a esa fracción de una órbita completa. Todo en una sola operación.

7voto

Greg Puntos 41

Encontré este artículo y de todos los posts el de J Thomas fue el que más me ayudó a guiarme. Su señaló claramente dos medias rotaciones.

Lo que significa que: resultVector = q * originalVector * q'

float4 resultVector = Multiply(q, originalVector);
resultVector = Multiply(resultVector, Inverse(q));

Sitio útil: http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/transforms/derivations/vectors/index.htm

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X