围绕另一个旋转一个 3D 点

新手上路,请多包涵

I have a function in my program which rotates a point (x_p, y_p, z_p) around another point (x_m, y_m, z_m) by the angles w_nx and w_ny .

新坐标存储在全局变量 x_ny_nz_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;
    }

原文由 Andi Faust 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 545
1 个回答

代码几乎做了什么:

  • 计算差异向量
  • 将矢量转换为 球坐标
  • 将 w_nx 和 wn_y 添加到倾角和方位角(参见术语链接)
  • 将修改后的球坐标转换回笛卡尔坐标

有两个问题:

  • 转换不正确,您所做的计算是针对两个倾角向量(一个沿 x 轴,另一个沿 y 轴)
  • 即使计算正确,球坐标中的变换也不同于绕两个轴旋转

因此,在这种情况下,使用矩阵和向量数学将有助于:

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

基本旋转矩阵

原文由 kakTuZ 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题