【C++游戏引擎开发】《线性代数》(5):四元数的3D旋转原理与实现(含新增Vector3、修改Matrix为非SIMD版本)

发布于:2025-04-01 ⋅ 阅读:(27) ⋅ 点赞:(0)

一、四元数基础理论

四元数(Quaternions)是一种扩展了复数系统的数学工具,由威廉·哈密顿(William Rowan Hamilton)于1843年提出。它在三维空间旋转表示和计算中具有重要应用,尤其在计算机图形学、机器人学和航空航天等领域中因其高效性和无万向节锁的特性而被广泛使用。

​1.1 四元数的定义

四元数是一个四维超复数,形式为:
q = a + b i + c j + d k q = a + b\mathbf{i} + c\mathbf{j} + d\mathbf{k} q=a+bi+cj+dk
其中:

  • a , b , c , d ∈ R a, b, c, d \in \mathbb{R} a,b,c,dR 是实部(标量部分)和三个虚部(矢量部分)。
  • i , j , k \mathbf{i}, \mathbf{j}, \mathbf{k} i,j,k 是虚数单位,满足以下乘法规则:
    i 2 = j 2 = k 2 = i j k = − 1 , i j = k , j k = i , k i = j , \mathbf{i}^2 = \mathbf{j}^2 = \mathbf{k}^2 = \mathbf{i}\mathbf{j}\mathbf{k} = -1, \quad \mathbf{i}\mathbf{j} = \mathbf{k}, \quad \mathbf{j}\mathbf{k} = \mathbf{i}, \quad \mathbf{k}\mathbf{i} = \mathbf{j}, i2=j2=k2=ijk=1,ij=k,jk=i,ki=j,
    且乘法是不可交换的,例如 j i = − k \mathbf{j}\mathbf{i} = -\mathbf{k} ji=k

1.2 四元数的运算

  • 加减法:对应分量相加减。
    q 1 ± q 2 = ( a 1 ± a 2 ) + ( b 1 ± b 2 ) i + ( c 1 ± c 2 ) j + ( d 1 ± d 2 ) k q_1 \pm q_2 = (a_1 \pm a_2) + (b_1 \pm b_2)\mathbf{i} + (c_1 \pm c_2)\mathbf{j} + (d_1 \pm d_2)\mathbf{k} q1±q2=(a1±a2)+(b1±b2)i+(c1±c2)j+(d1±d2)k

  • 乘法:使用分配律和虚数单位规则展开。
    q 1 q 2 = ( a 1 a 2 − b 1 b 2 − c 1 c 2 − d 1 d 2 ) + ⋯ q_1 q_2 = (a_1a_2 - b_1b_2 - c_1c_2 - d_1d_2) + \cdots q1q2=(a1a2b1b2c1c2d1d2)+
    乘法满足结合律但不满足交换律( q 1 q 2 ≠ q 2 q 1 q_1 q_2 \neq q_2 q_1 q1q2=q2q1)。

  • 标量乘法:标量 k k k 乘以四元数,即各分量乘以 k k k

​1.3 共轭与模长

  • 共轭四元数:将虚部取反。
    q ∗ = a − b i − c j − d k q^* = a - b\mathbf{i} - c\mathbf{j} - d\mathbf{k} q=abicjdk

  • 模长(范数)​
    ∥ q ∥ = a 2 + b 2 + c 2 + d 2 \| q \| = \sqrt{a^2 + b^2 + c^2 + d^2} q=a2+b2+c2+d2
    ∥ q ∥ = 1 \| q \| = 1 q=1,则称 q q q单位四元数

  • 逆四元数
    q − 1 = q ∗ ∥ q ∥ 2 q^{-1} = \frac{q^*}{\| q \|^2} q1=q2q
    对于单位四元数, q − 1 = q ∗ q^{-1} = q^* q1=q

1.​4 四元数与三维旋转

四元数的核心应用之一是表示三维旋转,其优势在于避免了欧拉角的万向节锁问题,且计算效率高。

​1.4.1 旋转的表示
  • 旋转轴:单位向量 u = ( u x , u y , u z ) \mathbf{u} = (u_x, u_y, u_z) u=(ux,uy,uz)
  • 旋转角度 θ \theta θ(绕轴 u \mathbf{u} u 旋转的角度)。

对应的单位四元数为:
q = cos ⁡ ( θ 2 ) + sin ⁡ ( θ 2 ) ( u x i + u y j + u z k ) q = \cos\left(\frac{\theta}{2}\right) + \sin\left(\frac{\theta}{2}\right)\left(u_x\mathbf{i} + u_y\mathbf{j} + u_z\mathbf{k}\right) q=cos(2θ)+sin(2θ)(uxi+uyj+uz