【发布时间】:2022-04-17 19:05:37
【问题描述】:
我的程序中有一个函数可以将点 (x_p, y_p, z_p) 围绕另一点 (x_m, y_m, z_m) 旋转角度 w_nx 和 w_ny。
新坐标存储在全局变量x_n、y_n 和z_n 中。围绕y-axis 旋转(因此更改w_nx 的值 - 以便y - 值不会受到损害)工作正常,但只要我围绕x- 或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;
}
【问题讨论】:
-
如果您使用opengl,我确信图形库将包含您可以使用的矩阵和向量植入。通过矩阵旋转一个点将简化您的算法。
-
@ahenderson 您的意思是“实施”吗? ;)
-
如果你还不熟悉这个术语,你应该阅读“云台锁”。我无法立即判断您的代码是否会受到影响,但是当您使用“欧拉角”进行这种旋转时,这是一个常见的缺陷。
-
我尝试使用
glrotatef,但它只旋转绘图,而不是顶点的坐标,我需要旋转坐标以检查碰撞!
标签: c++ math opengl trigonometry