提出
在 Unity 中 我使用了
transfrom.localEulerAngles.y
去获取旋转角度 y 的值,而并没有用localRotation
这就涉及到了欧拉角(EulerAngles)和四元数(Quaternion)的概念。
欧拉角(EulerAngles)
百度百科说道,”欧拉角是用来唯一地确定定点转动明体位置的三个一组独立角参量,由章动角θ、进动角ψ和自转角φ组成,为L.欧拉首先提出,故得名。“
在 Unity 中 EulerAngles 使用三个值(x,y,z)组成的旋转序列来表示角位移,这三个值分别绕三个相互垂直的轴(本地坐标轴)的旋转角度。
XYZ 约定一:heading-pitch-bank 约定(来自网络)
- 先将物体坐标系与惯性坐标系重合
- heading 绕此时物体坐标系的 y 轴旋转
- pitch 绕 heading 旋转后的物体坐标系的 x 轴旋转
- bank 绕 heading-pitch 旋转后的物体坐标系的 z 轴旋转
XYZ约定二:yaw-pitch-roll 约定 (来自《Unity 5 实践》)
- 先将物体坐标系与惯性坐标系重合
- yaw(偏航) 绕此时物体坐标系的 y 轴旋转
- pitch(偏角) 绕 heading 旋转后的物体坐标系的 x 轴旋转
- 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 提供了欧拉角和四元数的自动转换,方便开发人员进行操作。