本文作者:永柠网络科技 首席程序师-探花
(1)理论
欧拉角(Euler Angle)是可以表示3D空间中任何旋转的3个值,由莱昂哈德·欧拉(Leonhard Euler)在18世纪提出。一共有3种欧拉角:俯仰角(Pitch)、偏航角(Yaw)和滚转角(Roll).
如上图所示欧拉角可以控制一个物体的3个欧拉角的角度
对于鼠标控制视角来讲,就是控制摄像机所以我们只用俯仰角,偏航角就够了
方向节死锁:具体原理可参考(B站:无伤理解欧拉角中的“万向死锁”现象)
解决方向节死锁的解决方案是使用四元数这里我们不过多的讨论他可以自行b站搜索
向量
向量最基本的定义就是一个方向。或者更正式的说,向量有一个方向(Direction)和大小(Magnitude,也叫做强度或长度)。
例如:我在小明的左侧 那小明的向量是(0,0,0) 我的向量是(1,0,0)
这三个数字分别代表的是物体在 x轴 y轴 z轴上的数字
如果不清楚什么x轴y轴z轴可以上网搜搜左手坐标系
我们可以通过向量来决定一个物体在三维空间的朝向,所以偏航角和仰俯角的结果也必须是一个向量。
最后的朝向我们可以将偏航角和俯仰角的向量进行结合得出综合向量
计算过程:
- 将角度转换为弧度
- 计算综合方向向量(θ是偏航角,ϕ是仰俯角)
(公式图)
- 计算每个分量得出结果
(以上理论借鉴于:LearnOpenGL CN-摄像机)
(2)实践
- 创建一个Unity项目,并放置一个正方形
- 在Assets文件夹下创建Logic.cs文件
- 获取摄像机对象
- 获取欧拉角分量(鼠标的X轴移动值和Y轴移动值)
这里先运行检测一下效果,根据运行的结果我们可知:当鼠标在游戏屏幕上左右移动的时候,因为Unity引擎的坐标系为左手坐标系的原因,所以获取的X轴移动值实际上为Y轴的旋转值,Y轴的移动值实际为X轴旋转值。
- 将欧拉角向量转成四元数避免万向节死锁
这里先抛出一个结论:因为Unity引擎使用的是左手坐标系
所以X轴的旋转值应该给到Y轴,Y轴的旋转值应该给到X轴 是旋转值!!!不是XY轴的移动值!!!
写到这里,整个代码最大的疑问就是”为什么在Y轴上移动的值要减,而X轴则要加”
因为在Y轴上移动的值在Unity里是相反的所以需要对数据进行取反,而X轴则不用。
比如鼠标往Y轴的正方向滑动但是把最终得出的旋转值随机给一个3d对象发现正的Y轴移动值反而会让3d对象旋转到相反的方向所以才对数据进行取反。