首页 >> 大全

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

2023-08-27 大全 32 作者:考证青年

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

想必不少小伙伴和我一样刚开始处理游戏物体旋转时候,都是在面板上去调整然后再在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官方文档的建议

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了