Rotar plano 3d

Tengo un avión en el espacio 3D que se formó a partir de 3 puntos PAG 1 = ( X 1 , y 1 , z 1 ) , PAG 2 = ( X 2 , y 2 , z 2 ) , PAG 3 = ( X 3 , y 3 , z 3 )

Quiero rotar y transformar estos puntos (plano igualmente relacionado) en espacio 2D (Evitar z eje pero guarda distancia y relaciones en el plano 2D).

Para aclarar, desea rotar el plano que contiene los puntos PAG 1 , PAG 2 , PAG 3 en el X y avión.
Solo es necesario rotar el plano en un plano paralelo al plano xy. (Si el plano tiene alguna distancia desde el origen, entonces será imposible girarlo en el plano x=y, que pasa por el origen). Una vez girado en paralelo al plano xy, todas las coordenadas z en el plano original serán las mismas y se pueden ignorar, lo que lo convierte en un plano 2D.

Respuestas (3)

Como primer paso, me mudaría PAG 1 al origen, de modo que los puntos se vuelven PAG 1 = ( 0 , 0 , 0 ) , PAG 2 = ( X 2 X 1 , y 2 y 1 , z 2 z 1 ) , PAG 3 = ( X 3 X 1 , y 3 y 1 , z 3 z 1 ) . A partir de ahí solo es cuestión de aplicar una matriz de rotación.

Una matriz de rotación R que conserva todas las distancias y formas, etc. está dada por

R = ( mi 1 X mi 2 X mi 3 X mi 1 y mi 2 y mi 3 y mi 1 z mi 2 z mi 3 z )

donde los vectores ( mi 1 α , mi 2 α , mi 3 α ) para α { X , y , z } son ortogonales y de longitud unitaria, es decir

i = 1 3 mi i α mi i β = { 1 α = β 0 α β .

Aplicar R , tus puntos rotados PAG i = ( X i , y i , z i ) son dados por

( X i y i z i ) = R ( X i y i z i )

Sugiero hacer la fila superior de R el vector unitario en la dirección de PAG 1 a PAG 2 , es decir

( mi 1 X mi 2 X mi 3 X ) = 1 ( X 1 X 2 ) 2 + ( y 1 y 2 ) 2 + ( z 1 z 2 ) 2 ( X 1 X 2 y 1 y 2 z 1 z 2 )

lo que significaría que la línea de PAG 1 a PAG 2 se mapea en el X -eje.

Calculando lo que podría usar para la segunda y tercera fila de R ahora es solo una cuestión de resolver algunas ecuaciones lineales simples, para asegurarse de que la línea de PAG 1 a PAG 3 no tiene componente z.

para resolver por ( mi 1 z , mi 2 z , mi 3 z ) , el vector mi i z debe tener un producto punto cero con ambos mi i X y ( X 3 X 1 , y 3 y 1 , z 3 z 1 ) , entonces las ecuaciones son

mi 1 X mi 1 z + mi 2 X mi 2 z + mi 3 X mi 3 z = 0 ( X 3 X 1 ) mi 1 z + ( y 3 y 1 ) mi 2 z + ( z 3 z 1 ) mi 3 z = 0

Por eso

( mi 1 z mi 2 z mi 3 z ) = λ z ( ( z 3 z 1 ) mi 2 X ( y 3 y 1 ) mi 3 X ( X 3 X 1 ) mi 3 X ( z 3 z 1 ) mi 1 X ( y 3 y 1 ) mi 1 X ( X 3 X 1 ) mi 2 X )

para algunos λ z , que debe determinarse de modo que mi i z es un vector de longitud unitaria. Finalmente mi i y se puede determinar como el vector que es perpendicular a ambos mi i X y mi i z , es decir

( mi 1 y mi 2 y mi 3 y ) = λ y ( mi 3 z mi 2 X mi 2 z mi 3 X mi 1 z mi 3 X mi 3 z mi 1 X mi 2 z mi 1 X mi 1 z mi 2 X )

donde otra vez λ y se determina para que mi i y es un vector de longitud unitaria.

Como sugiere la respuesta aceptada, primero aplique una traducción de PAG 1 a todos los puntos. Tus tres puntos son entonces O , A , y B (dónde A = PAG 2 PAG 1 y B = PAG 3 PAG 1 ). Ahora calcule la unidad plana normal:

norte = A × B | A × B | .

Para rotar el plano a la X y avión, todo lo que necesitas hacer es girar norte a ( 0 , 0 , 1 ) . La forma más sencilla de hacer esto es rotar norte acerca de z eje en el positivo X mitad de X z plano y luego girar sobre el y eje hasta norte es paralelo al positivo z eje.

También podría usar la fórmula de rotación de Rodrigues para rotar sobre el eje norte × ( 0 , 0 , 1 ) , pero esta matriz de rotación es mucho más complicada que la matriz para una rotación alrededor de un eje de coordenadas.

Cálculo de la matriz de rotación que gira norte acerca de z eje en el positivo X mitad de X z plano no requiere calcular un ángulo. La matriz de rotación se da simplemente en términos de norte :

R z = ( norte X / norte X 2 + norte y 2 norte y / norte X 2 + norte y 2 0 norte y / norte X 2 + norte y 2 norte X / norte X 2 + norte y 2 0 0 0 1 ) .
La matriz de rotación que gira norte = R z norte acerca de y eje a ( 0 , 0 , 1 ) tampoco requiere calcular un ángulo. Es
R y = ( norte z 0 norte X 0 1 0 norte X 0 norte z ) .

Parece que podría beneficiarse al aprender a representar la dirección en 3D usando un vector de dirección. Esto implica aprender a normalizar un vector hasta una unidad de longitud, lo que da como resultado un vector de dirección.

Luego, una vez que te sientas cómodo con eso, aprende a resolver la orientación de (dirección perpendicular a) el plano de un triángulo 3D:

  o <-- normalize[(P2-P1) x (P3-p2)]   (vector cross product of 2 vector diffs)

Ahora, desea definir la rotación de coordenadas 3D deseada que alinea la orientación de su plano triangular con el eje z. Nuevamente, usando productos cruzados, estas son las 3 columnas de la matriz de rotación de 3x3 que desea:

R = [ newXaxis newYaxis newZaxis ] (tres vectores de dirección ortogonal)

Por elección, elige su valor de o como newZaxis.

Los otros dos nuevos ejes deben ser ortogonales a newZaxis y entre sí. El producto vectorial vectorial normalizado le da la dirección ortogonal mutua a cualquiera de las dos direcciones distintas d1 y d2 (siempre que no sean direcciones coincidentes u opuestas):

nuevoEjeX = normalizar(nuevoEjeZ x [ 1 0 0 ] )

(si newZaxis == [ 1 0 0 ], use newXaxis = normalize(newZaxis x [ 0 1 0 ] ) en su lugar

nuevoEjeY = nuevoEjeZ x nuevoEjeY

Ahora, coordina la rotación de cada punto de tu triángulo con el rotador R:

p1' <-- R • p1 (vector multiplicado por una matriz)

p2' <-- R • p2

p3' <-- R • p3

Notará que p1', p2' y p3' tienen coordenadas z idénticas. Puede desecharlos y simplemente usar sus coordenadas x e y. Ha proyectado efectivamente su triángulo en un plano xy 2D.