Unity基础:欧拉角、四元数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity基础:欧拉角、四元数相关的知识,希望对你有一定的参考价值。

参考技术A

在游戏开发中,经常会接触到旋转,常用的旋转方式有使用矩阵旋转,使用欧拉角旋转和使用四元数旋转。在本篇中,主要研究欧拉角和四元数。

在Unity的Transform中,Rotation属性对应的就是欧拉角,一共分为3个轴,x、y和z,而每一个数值对应的是绕对应的轴旋转的度数。

如上图所示,表示按照坐标顺序旋转,X轴旋转30°,Y轴旋转90°,Z轴旋转10°。

但欧拉角会出现一个问题: 万向锁
什么是万向锁?这个不好解释,感觉只有真正遇到过的才会有所体会,有兴趣的可以搜下万向锁的相关视频感受下。

为什么要使用四元数?

原因有很多,下面是其中的两个我觉得比较重要的原因:

四元数比较复杂,是一个高级复数,跟二维复数能表示平面上的一个点类似,四元数表示的是思维空间上的一个点,由于是一个四维空间(所以不好想象),表示方式为:
![][1]
[1]: http://latex.codecogs.com/png.latex?x=a+bi+cj+dk
其中:
![][2]
[2]: http://latex.codecogs.com/png.latex?i 2=j 2=k^2=-1

对一个点 p 的转换公式为,p\'为转换后的点(至于具体的解释,可以参考 candycat 前辈的 这篇博客 ):
![][3]
[3]: http://latex.codecogs.com/png.latex?p\'=qpq ^-1

在四元数中,点 p 的四元数表示方式为
![][5]
[5]: http://latex.codecogs.com/png.latex?p=((x,y,z),0)
其中x,y,z为对应坐标,w量为0方便计算(其他数值也可以,不过转换后结果不会有影响,我们只关注坐标量x,y,z)。

而旋转点所需的四元数 q 的表示方式为:
![][4]
[4]: http://latex.codecogs.com/png.latex?q=(cos \\frac\\theta2,(x,y,z)sin\\frac\\theta2)
其中 theta 为旋转的角度,x,y,z为旋转轴。

参考资料后,我的几何理解是:一个点p要绕一个轴旋转,如果用四元数进行变换,则要通过一个 辅助轴a ,轴a是原点与旋转过程中的中间点构成的向量,通过两次的四元数变换把点p变换到最终点p’(四维的量,不能单纯地把xsin(theta/2),ysin(theta/2),zsin(theta/2)理解为欧拉角的x,y,z量)。

当然,四元数是可以通过欧拉角进行构建的:

通过轴-角构建:

当然还有其他方式,需要大家自行查询官方文档。

以上是关于Unity基础:欧拉角、四元数的主要内容,如果未能解决你的问题,请参考以下文章

Unity编程四元数(Quaternion)与欧拉角

Unity复杂的旋转-欧拉角和四元数

unity没有提供四元数到欧拉角的转换函数吗

简单研究Unity中的万向锁和欧拉角以及四元数

Unity3D 灵巧小知识点☀️ | Unity 四元数欧拉角 与 方向向量 之间转换

Unity3D_(API)Quaternion四元数中的Quaternion.LookRotation()