Pregunta

Digamos que tengo dos puntos en el espacio 3D (ayb) y un vector de eje / unidad fijo llamado n.

Quiero crear una matriz de rotación que minimice la distancia de euclidan entre el punto a (sin girar) y el punto girado b.

E.g:

 Q := matrix_from_axis_and_angle (n, alpha);

 find the unknown alpha that minimizes sqrt(|a - b*Q|)

Btw - Si una solución / algoritmo puede expresarse más fácilmente con unidades-cuaterniones, adelante, úselos. Acabo de usar matrices para formular mi pregunta porque son más utilizadas.


Oh, sé que hay algunos casos degenerados (a o b que están exactamente en línea con n ect.) Estos pueden ignorarse. Solo busco el caso donde se puede calcular una sola solución.

¿Fue útil?

Solución

suena bastante fácil. Supongamos que el vector unidad n implica una rotación alrededor de una línea paralela a n hasta el punto x0. Si x0! = El origen, traduzca el sistema de coordenadas con -x0 para obtener los puntos a ' y b' en relación con el nuevo origen del sistema de coordenadas 0, y use esos 2 puntos en su lugar de a y b.

1) calcula el vector ry = n x a

2) calcula el vector unitario uy = vector unitario en la dirección ry

3) calcula el vector unitario ux = uy x n

Ahora tienes un triplete de vectores de unidades mutuamente perpendiculares ux, uy y n, que forman un sistema de coordenadas para diestros. Se puede demostrar que:

 a = dot(a,n) * n  +  dot(a,ux) * ux

Esto se debe a que el vector unitario uy es paralelo a ry que es perpendicular tanto a a como a n. (desde el paso 1)

4) Calcule los componentes de b a lo largo de los vectores unitarios ux, uy. Los componentes de a son (ax, 0) donde ax = punto (a, ux). Los componentes de b son (bx, by) donde bx = dot (b, ux), by = dot (b, uy). Debido al sistema de coordenadas de la mano derecha, el hacha siempre es positiva, por lo que no es necesario calcularlo.

5) Calcular theta = atan2 (by, bx).

Tu matriz de rotación es la que gira según el ángulo theta en relación con el sistema de coordenadas (ux, uy, n) alrededor del eje n.

Esto produce respuestas degeneradas si a es paralelo a n (pasos 1 y 2) o si b es paralelo a n (pasos 4, 5).

Otros consejos

Creo que puedes reformular la pregunta para:

cuál es la distancia desde un punto hasta un círculo 2D en el espacio 3d.

la respuesta se puede encontrar aquí

por lo que los pasos necesarios son los siguientes:

  • rotar el punto b alrededor de un vector n te da un círculo 2D en el espacio 3d
  • utilizando lo anterior, encuentra la distancia a ese círculo (y el punto en el círculo)
  • el punto en el círculo es el punto girado b que está buscando.
  • deducir el ángulo girado

... o algo; ^)

La distancia se minimizará cuando el vector de a a la línea a lo largo de n se alinee con el vector de b a la línea a lo largo de n.

Proyecte a y b en el plano perpendicular a n y resuelva el problema en 2 dimensiones. La rotación que obtienes allí es la rotación que necesitas para minimizar la distancia.

Sea P el plano perpendicular a n. Podemos encontrar la proyección de a en el plano P, (y de manera similar para b):

a' = a - (dot(a,n)) n 
b' = b - (dot(b,n)) n 

donde punto (a, n) es el producto-punto de a y n

a 'y b' se encuentran en el plano P.

Ahora hemos reducido el problema a 2 dimensiones. Yay!

El ángulo (de rotación) entre a 'y b' es igual al ángulo (de rotación) necesario para oscilar b alrededor del eje n para estar más cerca de a. (Piense en las sombras que b proyectaría en el plano P).

El ángulo entre a 'y b' es fácil de encontrar:

dot(a',b') = |a'| * |b'| * cos(theta)

Resuelve para theta.

Ahora puedes encontrar la matriz de rotación dada theta yn aquí: http://en.wikipedia.org/wiki/Rotation_matrix

Jason S señala acertadamente que una vez que conozca theta, todavía debe decidir girar b en el sentido de las agujas del reloj o en sentido contrario a las agujas del reloj respecto al eje n.

La cantidad, punto ((a x b), n), será una cantidad positiva si (a x b) se encuentra en la misma dirección que n, y negativo si (a x b) se encuentra en la dirección opuesta. (Nunca es cero siempre y cuando ni a ni b sean colineales con n.)

Si (a x b) se encuentra en la misma dirección que n, entonces b debe girarse en el sentido de las agujas del reloj por el ángulo theta sobre el eje n.

Si (a x b) se encuentra en la dirección opuesta, entonces b tiene que girarse en el sentido de las agujas del reloj por el ángulo -theta sobre el eje n.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top