2012-02-24 19 views
7

Estoy haciendo algo donde tengo un avión en una coord sys A con un conjunto de puntos ya en él. También tengo un vector normal en el espacio N. ¿Cómo puedo rotar los puntos en coord sys A para que el plano subyacente tenga la misma dirección normal que N?rotaciones 3D de un avión

Preguntándose si alguien tiene una buena idea sobre cómo hacer esto. Gracias

Respuesta

16

Si tiene, o puede calcular fácilmente, el vector normal para el plano en el que se encuentran actualmente sus puntos, creo que la forma más fácil de hacerlo será girar alrededor del eje común a los dos planos. Así es como me gustaría ir al respecto:

  1. Let M el vector normal a su plano actual, y N el vector normal al plano que desea girar en. Si M == N puede detenerse ahora y dejar los puntos originales sin cambios.
  2. calcular el ángulo de rotación como

    costheta = dot(M,N)/(norm(M)*norm(N)) 
    
  3. Calcular el eje de rotación como

    axis = unitcross(M, N) 
    

    donde unitcross es una función que realiza el producto cruzado y normaliza a un vector unitario, es decir, unitcross(a, b) = cross(a, b)/norm(cross(a, b)). Como user1318499 señaló en un comentario, este paso puede causar un error si M == N, a menos que su implementación de unitcross devuelva (0,0,0) cuando a == b.

  4. Calcular la matriz de rotación desde el eje y el ángulo como

    c = costheta 
    s = sqrt(1-c*c) 
    C = 1-c 
    rmat = matrix([ x*x*C+c x*y*C-z*s x*z*C+y*s ], 
           [ y*x*C+z*s y*y*C+c y*z*C-x*s ] 
           [ z*x*C-y*s z*y*C+x*s z*z*C+c ]) 
    

    donde x, y, y z son los componentes de axis. Esta fórmula se describe on Wikipedia.

  5. Para cada punto, calcular su punto correspondiente en el nuevo plano que

    newpoint = dot(rmat, point) 
    

    donde la función de dot realiza la multiplicación de la matriz.

Esto no es único, por supuesto; como se menciona en la respuesta de peterk, hay un número infinito de rotaciones posibles que podrían transformar el plano normal a M en el plano normal a N. Esto corresponde al hecho de que, después de seguir los pasos descritos anteriormente, puede rotar el plano alrededor de N, y sus puntos estarán en lugares diferentes mientras permanece en el mismo plano. (En otras palabras, cada rotación que puede hacer que satisfaga sus condiciones corresponde a hacer el procedimiento descrito anteriormente seguido de otra rotación alrededor de N). Pero si no le importa en qué punto del avión terminan sus puntos, creo que esta rotación el eje común es la forma más sencilla para obtener sólo los puntos en el plano que los quiere en.


Si usted no tiene M, pero tiene las coordenadas de los puntos en el plano de partida relativa a un origen en ese plano, puede calcular el vector normal de partida desde las posiciones de dos puntos x1 y x2 como

M = cross(x1, x2) 

(también puede usar unitcross aquí pero no hace ninguna diferencia). Si usted tiene los puntos coordenadas relativas a un origen que no está en el plano, todavía puede hacerlo, pero tendrá que tres puntos posiciones:

M = cross(x3-x1, x3-x2) 
+1

+1 Buena respuesta. La única queja (en la medida en que se eleva al nivel de una queja, lo cual es cuestionable) es que no mencionaron la rotación de cuaternión como una posible alternativa a los pasos 4 y 5. Son algo más eficientes. – andand

+0

@andand: generalmente hago este tipo de cosas analíticamente, así que no estoy completamente familiarizado con los cuaterniones. Pero si tengo tiempo lo editaré. –

+1

Un buen resumen está en http://en.wikipedia.org/wiki/Quaternion_rotation – andand

0

Estoy pensando en hacer un vector unitario [0,0,1] y usar el producto de puntos a lo largo de dos planos para encontrar el ángulo de diferencia, y cambiar todos los puntos por esos ángulos. Esto supone que desea que el eje z se alinee con el vector normal, sino que simplemente use [1,0,0] o [0,1,0] para xey respectivamente.

+0

No sería esto alinear el eje Z sólo ? habrá más Dof en x o y – bendervader

1

Un solo vector (su normal - N) no será suficiente. Necesitarás otros dos vectores para las otras dos dimensiones. (Imagine que su espacio tridimensional aún podría rotar/girar alrededor del vector normal, y necesita otros 2 vectores para clavarlo). Una vez que tenga la normal y otra en el avión, la tercera debería ser fácil de encontrar (diestra o zurda según su sistema).

Asegúrate de que los tres estén normalizados (longitud de 1) y colócalos en una matriz; usa esa matriz para transformar cualquier punto en tu espacio 3D (usa la multiplicación de la matriz). Esto debería darte las nuevas coordenadas.

+0

¡Tiene sentido! Tendré que encontrar una manera de obtener el otro vector: S ¡Gracias! – bendervader

+2

-1: Esta respuesta es vaga e incompleta. – andand

Cuestiones relacionadas