四元数的数学表示形式:w+xi+yj+zk 通常记为 [w,(x,y,z)] 这是一个3D复数,有一个实部w,三个虚部x,y,z。(2D复数只有一个实部和一个虚部) Unity中记为(x,y,z,w)
四元数的几何意义:如果一个模型的当前的旋转状态A =(10,20,30)(Unity中的ZXY旋转顺序),下一次的旋转状态 B =(60,50,40)。如果用欧拉角表示旋转过程E = (50,30,10) 。(注意:描述旋转状态时我们用欧拉角来描述的,欧拉角对人来说更直观,适合人与人之间的交流)
用四元数也可以表示,可以在数学上证明,A可以绕某一个轴n,旋转θ角度,获得B。轴n不一定是坐标系的x,y,z轴,其可以是任意轴,即三维空间中任意方向的向量。那么用四元数表示旋转过程:
用欧拉角计算旋转时,我们可以轻易得到计算公式:B = A+E
用四元数呢?设置A对应的四元数为a,B对应的四元数为b,E对应的四元数为Q,有 b=aQ
注意:用欧拉角表示时满足交换律 即A+E =E + A ,而用四元数表示时aQ≠Qa
用欧拉角计算时,有E = b - a
用四元数计算时,有 ,其中a^-1 表示四元数a的逆,Unity提供了Quaternion.Inverse()方法来求解
用欧拉角计算时,e = (-E.x,-E.y,-E.z)
用四元数计算时,q = (w, -E.x,-E.y,-E.z) 在数学上q是Q的共轭
欧拉角(0,0,30)表示从(0,0,0)绕Z轴旋转30°
用欧拉角表示旋转过程 E=(0,0,30)
用四元数表示旋转过程时,n=(0,0,1) θ=30°,所以Q=(cos15,0,0,sin15)
欧拉角(60,0,30)表示从(0,0,0)绕Z轴旋转30°,再绕X轴旋转60°
用欧拉角表示旋转过程 E=(0,0,30)+(60,0,0)=(60,0,30)
用四元数表示旋转过程 Q=(cos30,sin30,0,0)(cos15,0,0,sin15) 后旋转的左乘
欧拉角(60,45,30)表示从(0,0,0)绕Z轴旋转30°,再绕X轴旋转60°,再绕Y轴旋转45°
用欧拉角表示旋转过程 E=(0,0,30)+(60,0,0)+(0,45,0)=(60,45,30)
用四元数表示旋转过程 Q=(cos22.5,0,sin22.5,0)(cos30,sin30,0,0)(cos15,0,0,sin15)
那么对于欧拉角E=(β,θ,α)其对应的四元数为:
(注意是复数的乘法,不是矩阵的乘法)
四元数乘以三维向量的几何意义是:将这个三维向量按照四元数表示的旋转过程进行旋转得到新的三维向量,例如 Quaternion.Euler(0, 90, 0) * transform.forward;表示将物体朝向绕Y轴旋转90°。使用矩阵也可以进行旋转,但四元数乘以向量的计算过程比向量乘以矩阵的计算过程要更加高效和精确,因此通常在进行旋转变换时会优先使用四元数。
四元数与三维向量的具体计算过程如下:
设四元数Q = (w, x, y, z),向量V = (vx, vy, vz),则四元数Q乘以向量V的计算公式为:Q * V * Q^-1
其中,Q^-1为Q的逆四元数,计算公式为:Q^-1 = (w, -x, -y, -z)
1. 将向量V转化为四元数P = (0, vx, vy, vz)。这样做是为了能够使用四元数的乘法规则,因为四元数乘法需要两个四元数的标量部分(w 值)相乘,向量无法满足这个要求。
2. 计算四元数Q与四元数P的乘积QP:
QP = Q * P,QP的四个值分别为:
- QP.w = -x*vx - y*vy - z*vz
- QP.x = w*vx + y*vz - z*vy
- QP.y = w*vy + z*vx - x*vz
- QP.z = w*vz + x*vy - y*vx
3. 计算四元数Q的逆四元数Q^-1,使用以下公式:
Q^-1 = (w, -x, -y, -z)
4. 计算结果向量V',使用以下公式:
V' = QP * Q^-1
V' 的三个分量分别为:
- V'.x = QP.x * Q^-1.w + QP.w * Q^-1.x + QP.y * Q^-1.z - QP.z * Q^-1.y
- V'.y = QP.y * Q^-1.w + QP.w * Q^-1.y + QP.z * Q^-1.x - QP.x * Q^-1.z
- V'.z = QP.z * Q^-1.w + QP.w * Q^-1.z + QP.x * Q^-1.y - QP.y * Q^-1.x
最终得到的结果向量V'即为Q乘以V的结果。
《3D数学基础:图形与游戏开发》