# 四元数乘法的数学原理

12 min read
Table of Contents

概述

四元数乘法(Quaternion Multiplication)是3D图形学中用于组合旋转的核心运算。在草地渲染系统中,这个函数用于组合多个旋转变换,生成每片草叶独特的生长方向。

四元数基础

四元数是四维超复数,可以表示为:

q=w+xi+yj+zkq = w + xi + yj + zk

其中:

  • ww 是实部(标量部分)
  • (x,y,z)(x, y, z) 是虚部(向量部分)
  • i,j,ki, j, k 是虚数单位

虚数单位的性质

虚数单位满足以下基本关系:

i2=j2=k2=ijk=1i^2 = j^2 = k^2 = ijk = -1

虚数单位的乘法规则

四元数乘法基于虚数单位的乘法规则(右手定则):

ij=k,jk=i,ki=jji=k,kj=i,ik=j\begin{align} i \cdot j &= k, \quad j \cdot k = i, \quad k \cdot i = j \\ j \cdot i &= -k, \quad k \cdot j = -i, \quad i \cdot k = -j \end{align}

记忆技巧:顺时针相乘为正,逆时针相乘为负。

四元数乘法公式

对于两个四元数 q1=(x1,y1,z1,w1)q_1 = (x_1, y_1, z_1, w_1)q2=(x2,y2,z2,w2)q_2 = (x_2, y_2, z_2, w_2),它们的乘积 q1×q2q_1 \times q_2 计算如下:

完整展开式

x=w1x2+x1w2+y1z2z1y2y=w1y2x1z2+y1w2+z1x2z=w1z2+x1y2y1x2+z1w2w=w1w2x1x2y1y2z1z2\begin{align} x &= w_1 x_2 + x_1 w_2 + y_1 z_2 - z_1 y_2 \\ y &= w_1 y_2 - x_1 z_2 + y_1 w_2 + z_1 x_2 \\ z &= w_1 z_2 + x_1 y_2 - y_1 x_2 + z_1 w_2 \\ w &= w_1 w_2 - x_1 x_2 - y_1 y_2 - z_1 z_2 \end{align}

📚 推导过程详解(初学者友好)

让我们一步一步推导这个公式,理解为什么是这样的。

第一步:写出四元数的完整形式

回忆四元数的定义:

q1=w1+x1i+y1j+z1kq2=w2+x2i+y2j+z2k\begin{align} q_1 &= w_1 + x_1 i + y_1 j + z_1 k \\ q_2 &= w_2 + x_2 i + y_2 j + z_2 k \end{align}

第二步:展开乘法(像多项式乘法)

q1×q2q_1 \times q_2 展开,就像 (a+b)(c+d)=ac+ad+bc+bd(a+b)(c+d) = ac + ad + bc + bd 一样:

q1×q2=(w1+x1i+y1j+z1k)(w2+x2i+y2j+z2k)q_1 \times q_2 = (w_1 + x_1 i + y_1 j + z_1 k)(w_2 + x_2 i + y_2 j + z_2 k)

展开后得到 16 项(4×4):

q1×q2=  w1w2+w1x2i+w1y2j+w1z2k+x1iw2+x1ix2i+x1iy2j+x1iz2k+y1jw2+y1jx2i+y1jy2j+y1jz2k+z1kw2+z1kx2i+z1ky2j+z1kz2k\begin{align} q_1 \times q_2 = &\;w_1 w_2 + w_1 x_2 i + w_1 y_2 j + w_1 z_2 k \\ &+ x_1 i w_2 + x_1 i \cdot x_2 i + x_1 i \cdot y_2 j + x_1 i \cdot z_2 k \\ &+ y_1 j w_2 + y_1 j \cdot x_2 i + y_1 j \cdot y_2 j + y_1 j \cdot z_2 k \\ &+ z_1 k w_2 + z_1 k \cdot x_2 i + z_1 k \cdot y_2 j + z_1 k \cdot z_2 k \end{align}

第三步:应用虚数单位乘法规则

现在关键来了!使用我们前面学的乘法规则:

规则回顾

  • i2=j2=k2=1i^2 = j^2 = k^2 = -1
  • ij=k,jk=i,ki=ji \cdot j = k, \quad j \cdot k = i, \quad k \cdot i = j
  • ji=k,kj=i,ik=jj \cdot i = -k, \quad k \cdot j = -i, \quad i \cdot k = -j

让我们逐项化简:

第1行(w1w_1 的项)

w1w2+w1x2i+w1y2j+w1z2kw_1 w_2 + w_1 x_2 i + w_1 y_2 j + w_1 z_2 k

这些项已经是最简形式了。

第2行(x1ix_1 i 的项)

x1w2ix1w2i(已是最简)x1x2i2x1x2(1)=x1x2(实部)x1y2(ij)x1y2k(变成 k 分量)x1z2(ik)x1z2(j)=x1z2j(变成负的 j)\begin{align} x_1 w_2 i &\rightarrow x_1 w_2 i \quad \text{(已是最简)} \\ x_1 x_2 i^2 &\rightarrow x_1 x_2 \cdot (-1) = -x_1 x_2 \quad \text{(实部)} \\ x_1 y_2 (i \cdot j) &\rightarrow x_1 y_2 \cdot k \quad \text{(变成 k 分量)} \\ x_1 z_2 (i \cdot k) &\rightarrow x_1 z_2 \cdot (-j) = -x_1 z_2 j \quad \text{(变成负的 j)} \end{align}

第3行(y1jy_1 j 的项)

y1w2jy1w2j(已是最简)y1x2(ji)y1x2(k)=y1x2k(变成负的 k)y1y2j2y1y2(1)=y1y2(实部)y1z2(jk)y1z2i(变成 i 分量)\begin{align} y_1 w_2 j &\rightarrow y_1 w_2 j \quad \text{(已是最简)} \\ y_1 x_2 (j \cdot i) &\rightarrow y_1 x_2 \cdot (-k) = -y_1 x_2 k \quad \text{(变成负的 k)} \\ y_1 y_2 j^2 &\rightarrow y_1 y_2 \cdot (-1) = -y_1 y_2 \quad \text{(实部)} \\ y_1 z_2 (j \cdot k) &\rightarrow y_1 z_2 \cdot i \quad \text{(变成 i 分量)} \end{align}

第4行(z1kz_1 k 的项)

z1w2kz1w2k(已是最简)z1x2(ki)z1x2j(变成 j 分量)z1y2(kj)z1y2(i)=z1y2i(变成负的 i)z1z2k2z1z2(1)=z1z2(实部)\begin{align} z_1 w_2 k &\rightarrow z_1 w_2 k \quad \text{(已是最简)} \\ z_1 x_2 (k \cdot i) &\rightarrow z_1 x_2 \cdot j \quad \text{(变成 j 分量)} \\ z_1 y_2 (k \cdot j) &\rightarrow z_1 y_2 \cdot (-i) = -z_1 y_2 i \quad \text{(变成负的 i)} \\ z_1 z_2 k^2 &\rightarrow z_1 z_2 \cdot (-1) = -z_1 z_2 \quad \text{(实部)} \end{align}

第四步:按分量归类整理

现在把所有项按照 i,j,k,实部i, j, k, \text{实部} 分组:

实部(w 分量)

w=w1w2x1x2y1y2z1z2w = w_1 w_2 - x_1 x_2 - y_1 y_2 - z_1 z_2

来源:直接乘积 + 三个 i2,j2,k2i^2, j^2, k^2

i 分量(x 分量)

x=w1x2i+x1w2i+y1z2iz1y2i=(w1x2+x1w2+y1z2z1y2)i\begin{align} x &= w_1 x_2 i + x_1 w_2 i + y_1 z_2 i - z_1 y_2 i \\ &= (w_1 x_2 + x_1 w_2 + y_1 z_2 - z_1 y_2) i \end{align}

所以:x=w1x2+x1w2+y1z2z1y2x = w_1 x_2 + x_1 w_2 + y_1 z_2 - z_1 y_2

j 分量(y 分量)

y=w1y2j+y1w2jx1z2j+z1x2j=(w1y2+y1w2x1z2+z1x2)j\begin{align} y &= w_1 y_2 j + y_1 w_2 j - x_1 z_2 j + z_1 x_2 j \\ &= (w_1 y_2 + y_1 w_2 - x_1 z_2 + z_1 x_2) j \end{align}

所以:y=w1y2x1z2+y1w2+z1x2y = w_1 y_2 - x_1 z_2 + y_1 w_2 + z_1 x_2

k 分量(z 分量)

z=w1z2k+z1w2k+x1y2ky1x2k=(w1z2+z1w2+x1y2y1x2)k\begin{align} z &= w_1 z_2 k + z_1 w_2 k + x_1 y_2 k - y_1 x_2 k \\ &= (w_1 z_2 + z_1 w_2 + x_1 y_2 - y_1 x_2) k \end{align}

所以:z=w1z2+x1y2y1x2+z1w2z = w_1 z_2 + x_1 y_2 - y_1 x_2 + z_1 w_2

第五步:最终结果

这就得到了我们的四元数乘法公式!

x=w1x2+x1w2+y1z2z1y2y=w1y2x1z2+y1w2+z1x2z=w1z2+x1y2y1x2+z1w2w=w1w2x1x2y1y2z1z2\boxed{ \begin{align} x &= w_1 x_2 + x_1 w_2 + y_1 z_2 - z_1 y_2 \\ y &= w_1 y_2 - x_1 z_2 + y_1 w_2 + z_1 x_2 \\ z &= w_1 z_2 + x_1 y_2 - y_1 x_2 + z_1 w_2 \\ w &= w_1 w_2 - x_1 x_2 - y_1 y_2 - z_1 z_2 \end{align} }

💡 记忆技巧

  1. 实部(w):所有平方项都是负的(x2,y2,z2-x^2, -y^2, -z^2

  2. 虚部(x, y, z)

    • 前两项:对应分量与实部的交叉项(如 xxw1x2+x1w2w_1x_2 + x_1w_2
    • 后两项:其他两个虚部的”循环”交叉(一正一负)
  3. 符号规律

    • 正号:顺时针循环(ijkii \to j \to k \to i
    • 负号:逆时针循环(ikjii \to k \to j \to i

向量形式

也可以用向量和标量的形式表示:

q1×q2=(w1w2v1v2w1v2+w2v1+v1×v2)q_1 \times q_2 = \begin{pmatrix} w_1 w_2 - \mathbf{v}_1 \cdot \mathbf{v}_2 \\ w_1 \mathbf{v}_2 + w_2 \mathbf{v}_1 + \mathbf{v}_1 \times \mathbf{v}_2 \end{pmatrix}

其中 v1=(x1,y1,z1)\mathbf{v}_1 = (x_1, y_1, z_1)v2=(x2,y2,z2)\mathbf{v}_2 = (x_2, y_2, z_2) 是虚部向量。

代码实现对应关系

function multiplyQuaternions(q1: Cesium.Quaternion, q2: Cesium.Quaternion): Cesium.Quaternion {
// x 分量:w₁x₂ + x₁w₂ + y₁z₂ - z₁y₂
const x = q1.x * q2.w + q1.w * q2.x + q1.y * q2.z - q1.z * q2.y
// ↑ x₁w₂ ↑ w₁x₂ ↑ y₁z₂ ↑ -z₁y₂
// y 分量:w₁y₂ - x₁z₂ + y₁w₂ + z₁x₂
const y = -q1.x * q2.z + q1.w * q2.y + q1.y * q2.w + q1.z * q2.x
// ↑ -x₁z₂ ↑ w₁y₂ ↑ y₁w₂ ↑ z₁x₂
// z 分量:w₁z₂ + x₁y₂ - y₁x₂ + z₁w₂
const z = q1.x * q2.y - q1.y * q2.x + q1.w * q2.z + q1.z * q2.w
// ↑ x₁y₂ ↑ -y₁x₂ ↑ w₁z₂ ↑ z₁w₂
// w 分量:w₁w₂ - x₁x₂ - y₁y₂ - z₁z₂
const w = -q1.x * q2.x - q1.y * q2.y - q1.z * q2.z + q1.w * q2.w
// ↑ -x₁x₂ ↑ -y₁y₂ ↑ -z₁z₂ ↑ w₁w₂
return new Cesium.Quaternion(x, y, z, w)
}

几何意义

旋转组合

四元数乘法的主要几何意义是旋转的组合

qresult=q1×q2q_{result} = q_1 \times q_2

表示:先应用旋转 q2q_2,再应用旋转 q1q_1

⚠️ 注意:旋转顺序从右到左!

非交换性

四元数乘法是非交换的

q1×q2q2×q1q_1 \times q_2 \neq q_2 \times q_1

这意味着旋转的顺序非常重要。例如:

  • 先绕X轴转90°,再绕Y轴转90°
  • 先绕Y轴转90°,再绕X轴转90°

这两种操作的结果完全不同!

单位四元数与旋转

用于表示旋转的四元数必须是单位四元数,满足:

x2+y2+z2+w2=1x^2 + y^2 + z^2 + w^2 = 1

单位四元数与旋转的关系:

q=(sin(θ/2)axiscos(θ/2))q = \begin{pmatrix} \sin(\theta/2) \cdot \mathbf{axis} \\ \cos(\theta/2) \end{pmatrix}

其中:

  • θ\theta 是旋转角度
  • axis=(x,y,z)\mathbf{axis} = (x, y, z) 是归一化的旋转轴

在草地渲染中的应用

应用场景

generateInstancesWithTerrain() 方法中,使用四元数乘法创建草叶的复杂朝向:

// 1️⃣ 绕Y轴旋转(基础方向)- 随机水平朝向
let angle = Math.PI - Math.random() * (2 * Math.PI) // 0 到 2π
let rotationAxis = new Cesium.Cartesian3(0, 1, 0) // Y轴
let x = rotationAxis.x * Math.sin(angle / 2.0)
let y = rotationAxis.y * Math.sin(angle / 2.0)
let z = rotationAxis.z * Math.sin(angle / 2.0)
let w = Math.cos(angle / 2.0)
quaternion0 = new Cesium.Quaternion(x, y, z, w)
// 2️⃣ 绕X轴旋转(前后倾斜)
angle = Math.random() * (0.25 - (-0.25)) + (-0.25) // -0.25 到 0.25 弧度
rotationAxis = new Cesium.Cartesian3(1, 0, 0) // X轴
x = rotationAxis.x * Math.sin(angle / 2.0)
y = rotationAxis.y * Math.sin(angle / 2.0)
z = rotationAxis.z * Math.sin(angle / 2.0)
w = Math.cos(angle / 2.0)
quaternion1 = new Cesium.Quaternion(x, y, z, w)
// 3️⃣ 组合:先Y轴旋转,再X轴旋转
quaternion0 = multiplyQuaternions(quaternion0, quaternion1)
// 4️⃣ 绕Z轴旋转(细微扭转)
const microVariation = (Math.random() - 0.5) * 0.1 // -0.05 到 0.05
angle = microVariation
rotationAxis = new Cesium.Cartesian3(0, 0, 1) // Z轴
x = rotationAxis.x * Math.sin(angle / 2.0)
y = rotationAxis.y * Math.sin(angle / 2.0)
z = rotationAxis.z * Math.sin(angle / 2.0)
w = Math.cos(angle / 2.0)
quaternion1 = new Cesium.Quaternion(x, y, z, w)
// 5️⃣ 最终方向:前面的组合 + Z轴扭转
const orientation = multiplyQuaternions(quaternion0, quaternion1)

视觉效果

通过这种三次旋转的组合,每片草叶获得:

  1. 随机水平朝向(Y轴旋转):草叶向各个方向生长
  2. 自然倾斜(X轴旋转):轻微的前后倾斜,模拟重力和生长不均匀
  3. 细微扭转(Z轴旋转):微小的旋转变化,避免过于规则

最终结果是每片草都有独特的、自然的三维朝向,极大增强了草地的真实感和自然度。

数学性质总结

1. 结合律

(q1×q2)×q3=q1×(q2×q3)(q_1 \times q_2) \times q_3 = q_1 \times (q_2 \times q_3)

2. 非交换性

q1×q2q2×q1q_1 \times q_2 \neq q_2 \times q_1

3. 单位元

q×qidentity=qidentity×q=qq \times q_{identity} = q_{identity} \times q = q

其中 qidentity=(0,0,0,1)q_{identity} = (0, 0, 0, 1)

4. 范数保持(单位四元数)

如果 q1=q2=1\|q_1\| = \|q_2\| = 1,则 q1×q2=1\|q_1 \times q_2\| = 1

参考资源

My avatar

Thanks for reading my blog post! Feel free to check out my other posts or contact me via the social links in the footer.


More Posts

Comments