欧拉角和四元数

提出

在 Unity 中 我使用了 transfrom.localEulerAngles.y 去获取旋转角度 y 的值,而并没有用 localRotation 这就涉及到了欧拉角(EulerAngles)和四元数(Quaternion)的概念。

欧拉角(EulerAngles)

百度百科说道,”欧拉角是用来唯一地确定定点转动明体位置的三个一组独立角参量,由章动角θ、进动角ψ和自转角φ组成,为L.欧拉首先提出,故得名。“

在 Unity 中 EulerAngles 使用三个值(x,y,z)组成的旋转序列来表示角位移,这三个值分别绕三个相互垂直的轴(本地坐标轴)的旋转角度。

XYZ 约定一:heading-pitch-bank 约定(来自网络)

  1. 先将物体坐标系与惯性坐标系重合
  2. heading 绕此时物体坐标系的 y 轴旋转
  3. pitch 绕 heading 旋转后的物体坐标系的 x 轴旋转
  4. bank 绕 heading-pitch 旋转后的物体坐标系的 z 轴旋转

XYZ约定二:yaw-pitch-roll 约定 (来自《Unity 5 实践》)

  1. 先将物体坐标系与惯性坐标系重合
  2. yaw(偏航) 绕此时物体坐标系的 y 轴旋转
  3. pitch(偏角) 绕 heading 旋转后的物体坐标系的 x 轴旋转
  4. roll(侧滚) 绕 heading-pitch 旋转后的物体坐标系的 z 轴旋转

四元数(quaternion)

四元数是一个描述旋转的数学概念,强烈推荐去看一遍B站的一个视频【Numberphile数字狂】神奇四元数

看完视频后,可以简单说,我们在一维空间(X轴)移动需要一个数,这个就是实数(1 or -1)。在二位空间(XY坐标轴)移动和旋转我们需要添加一个数,这个数就是复数i(i²=-1),进入三维空间(xyz坐标轴)移动和旋转我们就需要再添加两个数,构成的就是四元数ijk(i²=j²=k²=ijk=-1)。

在 Unity 方面 Quaternion 是为了在旋转值之间插值,使得旋转看起来更平滑和自然。三维动画和游戏中常用四元数,如果是欧拉旋转(用xyz轴的转动角表示),转动的路径常常不是弧形,有时还会造成万向节锁,也就是无法旋转,四元数很好地解决了这个问题。

总结

localRotation 是一个四元数,而不是欧拉角,使用 EulerAngles 是为了让旋转更加容易理解,Unity 提供了欧拉角和四元数的自动转换,方便开发人员进行操作。

posted @ 2019-12-25 16:31  ZeroyiQ  阅读(1134)  评论(0编辑  收藏  举报