math - 计算旋转以查看 3D 点?

标签 math 3d rotation angle euler-angles

我需要计算 3D 对象面对任意 3D 点的 2 个角度(偏航角和俯仰角)。这些旋转被称为“欧拉”旋转,因为在第一次旋转之后(假设 Z,基于下图),Y 轴也随着对象旋转。

这是我正在使用的代码,但它不能完全工作。当在地平面 (Y = 0) 上时,对象正确旋转以面向该点,但是一旦我在 Y 中向上移动该点,旋转看起来就不正确。

// x, y, z represent a fractional value between -[1] and [1]
// a "unit vector" of the point I need to rotate towards

yaw = Math.atan2( y, x )
pitch = Math.atan2( z, Math.sqrt( x * x + y * y ) )

您知道如何计算给定点的 2 个欧拉角吗?

下图显示了我旋转的方式。这些是我需要计算的角度。
(唯一的区别是我按照 X、Y、Z 而不是 Z、Y、X 的顺序旋转对象)

pic


enter image description here

这是我的系统。
  • 坐标系是 x = 向右,y = 向下,z = 更靠后
  • 对象默认位于 (0,0,1) 朝后
  • 旋转的顺序为 X、Y、Z,其中 X 上的旋转是俯仰,Y 是偏航,Z 是滚转

  • my system

    最佳答案

    以下是我的工作假设:

  • 坐标系 (x,y,z) 是这样的,正 x 向右,正 y 向下,z 为剩余方向。特别地,y=0 是地平面。
  • 当前面向 (0,0,1) 的 (0,0,0) 处的对象正在转向面向 (x,y,z)。
  • 为了实现这一点,将围绕 x 轴旋转,然后围绕 y 轴旋转。最后,围绕 z 轴旋转以使物体直立。

  • (术语偏航、俯仰和滚转可能会令人困惑,所以我想避免使用它,但粗略地说,对应关系是 x=pitch, y=yaw, z=roll。)

    鉴于此设置,这是我尝试解决您的问题的尝试:
    rotx = Math.atan2( y, z )
    roty = Math.atan2( x * Math.cos(rotx), z )
    rotz = Math.atan2( Math.cos(rotx), Math.sin(rotx) * Math.sin(roty) )
    

    希望这是正确的迹象。我认为修复这些标志的最简单方法是反复试验。确实,您似乎已经收到了 rotx 上的标志。和 roty正确——包括一个关于 z 的微妙问题——所以你只需要修复 rotz 上的标志.

    我希望这不是微不足道的(可能取决于您所在的八分圆),但请尝试几种可能性,然后再说它是错误的。祝你好运!

    这是最终对我有用的代码。

    我注意到当物体从任何前象限(正 Z)移动到任何后象限时会发生“翻转”效应。在前象限 前台对象总是面向点。在后象限 返回 物体始终面向点。

    此代码纠正了翻转效果,因此对象的正面 总是 正视点。我通过反复试验遇到了它,所以我真的不知道发生了什么!
     rotx = Math.atan2( y, z );
     if (z >= 0) {
        roty = -Math.atan2( x * Math.cos(rotx), z );
     }else{
        roty = Math.atan2( x * Math.cos(rotx), -z );
     }
    

    关于math - 计算旋转以查看 3D 点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1251828/

    相关文章:

    opengl - opengl中的顶点缓冲区

    jquery - css/javascript 旋转但不是从中心旋转

    python - python 中带有箭头的简单 2d 表面?

    python - 重叠形式组之间的面积总和

    javascript - 循环内速度增加(使用延迟)的 FadeIn 元素

    algorithm - 找到球体的最快方法一个点在里面并且最接近

    java - 如何将相机固定在玩家身上,以便当玩家移动时相机也会跟随

    math - 在 Mathematica 中求解非线性方程组

    ruby - Ruby 和类似类型语言中的数组是向量吗?

    python - Pygame-如何朝玩家 Sprite 的方向射击?