在实际工程中,旋转的表示方式直接影响代码的可读性、计算效率和数值稳定性。本文从工程实践角度,梳理三种常用旋转表示方法及其适用场景。

复数:二维旋转的优雅表达

由欧拉公式 eiθ=cosθ+isinθe^{i\theta} = \cos\theta + i\sin\theta,任意复数 z=x+yiz = x + yi 乘以 eiθe^{i\theta} 相当于在复平面上旋转 θ\theta 弧度:

zeiθ=(x+yi)(cosθ+isinθ)=(xcosθysinθ)+(xsinθ+ycosθ)iz \cdot e^{i\theta} = (x + yi)(\cos\theta + i\sin\theta) = (x\cos\theta - y\sin\theta) + (x\sin\theta + y\cos\theta)i

这与旋转矩阵等价,但表达更简洁。在 Python 中:

import numpy as np

def rotate_2d_complex(points, theta):
    """用复数旋转二维点集"""
    z = points[:, 0] + 1j * points[:, 1]
    rotated = z * np.exp(1j * theta)
    return np.column_stack([rotated.real, rotated.imag])

旋转矩阵:最通用的选择

旋转矩阵是 n×nn \times n 正交矩阵,适用于任意维度,且天然支持矩阵链式组合:

def rot_matrix_2d(theta):
    c, s = np.cos(theta), np.sin(theta)
    return np.array([[c, -s], [s, c]])

# 组合旋转:先转 30° 再转 45°
R = rot_matrix_2d(np.deg2rad(45)) @ rot_matrix_2d(np.deg2rad(30))

优点是可以直接嵌入齐次变换矩阵,适合与平移、缩放统一处理。缺点是在三维中需要 9 个数存一个旋转,且插值困难。

轴角与四元数:三维旋转的首选

轴角表示用单位向量 u\mathbf{u} 和角度 θ\theta 描述旋转,共 4 个参数。四元数 q=cos(θ/2)+sin(θ/2)(uxi+uyj+uzk)q = \cos(\theta/2) + \sin(\theta/2)(u_x i + u_y j + u_z k) 是其代数化表达:

from scipy.spatial.transform import Rotation as R

# 绕 z 轴转 90°
r = R.from_rotvec([0, 0, np.pi / 2])
quat = r.as_quat()  # 四元数 [x, y, z, w]

# 旋转向量
v = np.array([1, 0, 0])
v_rotated = r.apply(v)  # → [0, 1, 0]

四元数的主要优势:仅 4 个数、无万向节锁、球面线性插值(Slerp)自然平滑,是游戏引擎和机器人领域的主流选择。

如何选择

场景推荐表示
二维旋转复数或 2×22 \times 2 矩阵
三维刚体变换(含平移)4×44 \times 4 齐次矩阵
三维纯旋转 / 插值四元数
需要直观调参欧拉角(仅作输入输出,内部转为四元数)

理解每种表示背后的数学本质,能在实际编码中做出更合适的选择。