GOOGLE ADS

lunes, 2 de mayo de 2022

Girar un punto 3D alrededor de otro

Tengo una función en mi programa que rota un punto (x_p, y_p, z_p)alrededor de otro punto (x_m, y_m, z_m)por los ángulos w_nxy w_ny.

Las nuevas coordenadas se almacenan en las variables globales x_n, y_ny z_n. La rotación alrededor de y-axis(cambiar el valor de w_nx- para que los yvalores no se dañen) funciona correctamente, pero tan pronto como hago una rotación alrededor del eje x-o (cambiando el valor de ) las coordenadas ya no son precisas. Comenté en la línea que creo que es mi falla, pero no puedo entender qué está mal con ese código.z-w_ny

void rotate(float x_m, float y_m, float z_m, float x_p, float y_p, float z_p, float w_nx,float w_ny)
{
float z_b = z_p - z_m;
float x_b = x_p - x_m;
float y_b = y_p - y_m;
float length_ = sqrt((z_b*z_b)+(x_b*x_b)+(y_b*y_b));
float w_bx = asin(z_b/sqrt((x_b*x_b)+(z_b*z_b))) + w_nx;
float w_by = asin(x_b/sqrt((x_b*x_b)+(y_b*y_b))) + w_ny; //<- there must be that fault
x_n = cos(w_bx)*sin(w_by)*length_+x_m;
z_n = sin(w_bx)*sin(w_by)*length_+z_m;
y_n = cos(w_by)*length_+y_m;
}


Solución del problema

Lo que casi hace el código:


  • Calcular vector de diferencia

  • convertir vector en coordenadas esféricas

  • agregue w_nx y wn_y al ángulo de inclinación y acimut (consulte el enlace para ver la terminología)

  • convertir coordenadas esféricas modificadas de nuevo en coordenadas cartesianas


Hay dos problemas:


  • la conversión no es correcta, el cálculo que haces es para dos vectores de inclinación (uno en el eje x, el otro en el eje y)

  • aunque el cálculo fuera correcto, la transformación en coordenadas esféricas no es lo mismo que girar alrededor de dos ejes


Por lo tanto, en este caso, usar matrices y matemáticas vectoriales ayudará:

b = p - m
b = RotationMatrixAroundX(wn_x) * b
b = RotationMatrixAroundY(wn_y) * b
n = m + b

matrices básicas de rotación.

No hay comentarios.:

Publicar un comentario

Flutter: error de rango al acceder a la respuesta JSON

Estoy accediendo a una respuesta JSON con la siguiente estructura. { "fullName": "FirstName LastName", "listings...