[学习心得] 旋转 (欧拉角,万向锁,四元数)

声明:此篇文章是个人学习心得,并非教程 。不保证百分百正确,仅供参考 。如有错误,欢迎指出 。谢谢!欧拉角
想必不少小伙伴和我一样刚开始处理游戏物体旋转时候,都是在面板上去调整然后再在Scene面板观察 。以至于后面开始用脚本处理旋转时候,觉得就是用面板上这三个角度 。而这面板上表示旋转的数值就是欧拉角
面板下的组件
而刚开始用脚本去旋转游戏物体的时候,我们发现旋转赋值不是一个类型 。而是四元数 。
刚开始学
而那时候一听四元数就觉得麻烦 。百度找了半天 。最后用.的API来解决旋转,期间发生了好多莫名其妙的错误 。而最近才学习到,这些错误都是万向锁引起的 。
万向锁
个人理解为由于各个轴之间存在子父级关系,导致变化的时候,并不是所有轴都跟着某个轴变化而变化,就导致了两个轴重叠等问题 。而欧拉角本身的意义是变化,而不是转换(运动) 。它本身只注重最终展现给我们的姿态,而不是期间的过程 。例如
我们想要/以为的:物体沿x轴旋转10°,再y轴旋转90°,再x轴旋转70° 。
可以清楚看到最后沿x轴旋转70°的时候,物体不是绕x轴

[学习心得] 旋转 (欧拉角,万向锁,四元数)

文章插图
实际发生的:物体沿x轴旋转80°,再y轴旋转90° 。
这里就不过多阐述万向锁的原因和定义了 。感兴趣的小伙伴们可以自己百度看看 。以下是万向锁产生的部分错误旋转情况 。
【[学习心得] 旋转 (欧拉角,万向锁,四元数)】万向锁导致的错情况一
明明脚本中没有涉及到某个轴的旋转,运行却发现未涉及到旋转的轴也在变化 。
为了方便直观看到错误,给游戏物体挂了对应脚本 。
可以看到:明明没有涉及到Z轴的旋转,却出现了三个轴一起旋转 。
情况二
当旋转到某些特定角度时候,出现丢失轴的情况 。
可以看到,旋转X轴90°时,Y轴和Z的旋转变成了相同的轴旋转 。
??
四元数
四元数从名字上就可以知道,是由四个数组成的 。
由于使用欧拉角去旋转物体可能会导致万向锁的情况 。所以最好还是用四元数来操作,且Unity官方也有相关建议(末尾总结贴上相应文档截图)
那怎样用四元数怎么用呢?以下是我目前碰到过的项目需求 。(后续有其他心得体会再更新)
四元数使用:情况一:已知旋转角度,想要旋转对应度数 。
//假设需要X轴旋转60°Vector3 rotateEuler = new Vector3(60, 0, 0);//定义一个Vector3变量,来当作已知的数据 。Quaternion rotate = Quaternion.Euler(rotateEuler);//将Vector3类型转换为四元数类型transform.rotation = rotate;//直接赋值转换的四元数类型
情况二:想要向某个游戏物体看去 。(除去.的API)我们也可以用四元数实现
//假设要向摄像机看去transform.rotation = Quaternion.LookRotation(Camera.main.transform.position-transform.position);//被减向量To,减数向量是From(从From向To看去)
总结
Unity旋转物体时,应使用四元数及其函数来创建和修改旋转值 。使用欧拉角是有可能出现意料之外的错误 。
Unity官方文档的建议