Transform组件是Unity中非常常用的一个组件,用于控制物体的位移、旋转和缩放,脚本中也有对应的Transform类实现对应的控制。而旋转,是这三种变换中最为复杂的一种。我们所熟悉的旋转一般是矩阵旋转和欧拉旋转。在Unity中,还有一种用于描述旋转的方式,叫四元数,即Quaternion。那么它们之间有什么区别和联系呢?(又来这句- -)通过查阅资料,我得到了一些启发,下面一一说来。
旋转矩阵
学过线性代数就会知道,把一个三维向量乘上一个三阶旋转矩阵就能得到旋转后的向量。这种方法的好处是可以实现三维空间中的任意旋转,但是缺点是浪费空间——确定一个旋转只需要知道旋转轴的方向向量和旋转角度共4个值,而三阶旋转矩阵需要9个值(还有用四阶旋转矩阵的,那就需要16个值,更多了……不过不是很明白是怎样用四阶旋转矩阵表达三维空间的旋转的,如果有大神看到,望不吝赐教),另外矩阵乘法也是不小的计算量。
欧拉旋转
欧拉旋转是指定三个正交的旋转轴,按照一定的顺序分别绕着这三个轴旋转一定的角度,一个简单的例子就是空间直角坐标系的x轴、y轴和z轴。欧拉旋转实际上是一系列坐标轴旋转的组合。使用欧拉旋转的好处是直观,易于理解,表示起来也方便,只需要3个值来对应指定的3个轴下的旋转角度,例如在Unity的C#脚本中欧拉旋转就直接使用了Vector3这个类(三维向量的封装类)。不过欧拉旋转的具体实现仍是三个旋转矩阵相乘,计算量上没有优势。当然,欧拉旋转也存在缺点。一是欧拉旋转是按照预先定义好的三个轴和顺序来旋转的,因此不同旋转轴的选取和不同的顺序都会导致不同的旋转结果。二是欧拉旋转存在Gimbal Lock(万向节死锁)现象,理论上欧