Tengo un avión en el espacio 3D que se formó a partir de 3 puntos , ,
Quiero rotar y transformar estos puntos (plano igualmente relacionado) en espacio 2D (Evitar eje pero guarda distancia y relaciones en el plano 2D).
Como primer paso, me mudaría al origen, de modo que los puntos se vuelven , , . A partir de ahí solo es cuestión de aplicar una matriz de rotación.
Una matriz de rotación que conserva todas las distancias y formas, etc. está dada por
donde los vectores para son ortogonales y de longitud unitaria, es decir
Aplicar , tus puntos rotados son dados por
Sugiero hacer la fila superior de el vector unitario en la dirección de a , es decir
lo que significaría que la línea de a se mapea en el -eje.
Calculando lo que podría usar para la segunda y tercera fila de ahora es solo una cuestión de resolver algunas ecuaciones lineales simples, para asegurarse de que la línea de a no tiene componente z.
para resolver por , el vector debe tener un producto punto cero con ambos y , entonces las ecuaciones son
Por eso
para algunos , que debe determinarse de modo que es un vector de longitud unitaria. Finalmente se puede determinar como el vector que es perpendicular a ambos y , es decir
donde otra vez se determina para que es un vector de longitud unitaria.
Como sugiere la respuesta aceptada, primero aplique una traducción de a todos los puntos. Tus tres puntos son entonces y (dónde y ). Ahora calcule la unidad plana normal:
Para rotar el plano a la avión, todo lo que necesitas hacer es girar a . La forma más sencilla de hacer esto es rotar acerca de eje en el positivo mitad de plano y luego girar sobre el eje hasta es paralelo al positivo eje.
También podría usar la fórmula de rotación de Rodrigues para rotar sobre el eje 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 acerca de eje en el positivo mitad de plano no requiere calcular un ángulo. La matriz de rotación se da simplemente en términos de :
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.
Daryl
pbierre