我在我的程序中有一个函数,该函数用一个角度w_nx & w_ny围绕另一个点(x_m,y_m,z_m)旋转一个点(x_p,y_p,z_p)。新坐标存储在全局变量x_n,y_n和z_n中。围绕y轴旋转(如此改变w_nx的值 - 以便y值不会受到伤害)正常工作,但只要我围绕x轴或z轴旋转(改变w_ny的值)坐标不再准确。我评论了我认为是我的错误的那一行,但我无法弄清楚那段代码有什么问题。围绕另一个点旋转一个3D点
任何人都可以帮助我吗?
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;
}
如果你使用[tag:opengl]我确定一个图形库将有一个矩阵和载体植入,你可以使用。通过矩阵旋转点将简化您的算法。 – andre
@ahenderson你的意思是“执行”? ;) – leemes
如果你还不熟悉这个术语,你应该阅读“Gimbal Lock”。我不能立即告诉你的代码是否会受到它的影响,但当你使用“欧拉角”进行这种旋转时,这是一个常见的缺陷。 – Rook