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

声明:此篇文章是个人学习心得,并非教程。不保证百分百正确,仅供参考。如有错误,欢迎指出。谢谢!


 欧拉角

        想必不少小伙伴和我一样刚开始处理游戏物体旋转时候,都是在Inspector面板上去调整然后再在Scene面板观察。以至于后面开始用脚本处理旋转时候,觉得就是用面板上这三个角度。而这面板上表示旋转的数值就是欧拉角

[学习心得] 旋转 (欧拉角,万向锁,四元数)_第1张图片 Inspector面板下的Transform组件

        而刚开始用脚本去旋转游戏物体的时候,我们发现旋转赋值不是一个Vector3类型。而是四元数。

刚开始学Rotation

        而那时候一听四元数就觉得麻烦。百度找了半天。最后用transform.Rotate的API来解决旋转,期间发生了好多莫名其妙的错误。而最近才学习到,这些错误都是万向锁引起的。


万向锁

        个人理解为由于各个轴之间存在子父级关系,导致变化的时候,并不是所有轴都跟着某个轴变化而变化,就导致了两个轴重叠等问题。而欧拉角本身的意义是变化,而不是转换(运动)。它本身只注重最终展现给我们的姿态,而不是期间的过程。例如

我们想要/以为的:物体沿x轴旋转10°,再y轴旋转90°,再x轴旋转70°。

可以清楚看到最后沿x轴旋转70°的时候,物体不是绕x轴

        实际发生的:物体沿x轴旋转80°,再y轴旋转90°。

        这里就不过多阐述万向锁的原因和定义了。感兴趣的小伙伴们可以自己百度看看。以下是万向锁产生的部分错误旋转情况。

万向锁导致的错

        情况一

        明明脚本中没有涉及到某个轴的旋转,运行却发现未涉及到旋转的轴也在变化。

[学习心得] 旋转 (欧拉角,万向锁,四元数)_第2张图片 为了方便直观看到错误,给游戏物体挂了对应脚本。

[学习心得] 旋转 (欧拉角,万向锁,四元数)_第3张图片 可以看到:明明没有涉及到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;    //直接赋值转换的四元数类型

        情况二:想要向某个游戏物体看去。(除去transform.lookat的API)我们也可以用四元数实现

//假设要向摄像机看去
transform.rotation = Quaternion.LookRotation(Camera.main.transform.position-transform.position);    //被减向量To,减数向量是From(从From向To看去)


 总结

              

          Unity旋转物体时,应使用四元数及其函数来创建和修改旋转值。使用欧拉角是有可能出现意料之外的错误。

[学习心得] 旋转 (欧拉角,万向锁,四元数)_第4张图片 Unity官方文档的建议

你可能感兴趣的:(Unity,unity,游戏引擎)