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_nx
y w_ny
.
Las nuevas coordenadas se almacenan en las variables globales x_n
, y_n
y z_n
. La rotación alrededor de y-axis
(cambiar el valor de w_nx
- para que los y
valores 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