欧拉角和四元数
提出
在 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 提供了欧拉角和四元数的自动转换,方便开发人员进行操作。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET 9 new features-C#13新的锁类型和语义
· Linux系统下SQL Server数据库镜像配置全流程详解
· 现代计算机视觉入门之:什么是视频
· 你所不知道的 C/C++ 宏知识
· 聊一聊 操作系统蓝屏 c0000102 的故障分析
· 不到万不得已,千万不要去外包
· C# WebAPI 插件热插拔(持续更新中)
· 会议真的有必要吗?我们产品开发9年了,但从来没开过会
· 如何打造一个高并发系统?
· 《SpringBoot》EasyExcel实现百万数据的导入导出