在实际工程中,旋转的表示方式直接影响代码的可读性、计算效率和数值稳定性。本文从工程实践角度,梳理三种常用旋转表示方法及其适用场景。
复数:二维旋转的优雅表达
由欧拉公式 ,任意复数 乘以 相当于在复平面上旋转 弧度:
这与旋转矩阵等价,但表达更简洁。在 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])
旋转矩阵:最通用的选择
旋转矩阵是 正交矩阵,适用于任意维度,且天然支持矩阵链式组合:
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 个数存一个旋转,且插值困难。
轴角与四元数:三维旋转的首选
轴角表示用单位向量 和角度 描述旋转,共 4 个参数。四元数 是其代数化表达:
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)自然平滑,是游戏引擎和机器人领域的主流选择。
如何选择
| 场景 | 推荐表示 |
|---|---|
| 二维旋转 | 复数或 矩阵 |
| 三维刚体变换(含平移) | 齐次矩阵 |
| 三维纯旋转 / 插值 | 四元数 |
| 需要直观调参 | 欧拉角(仅作输入输出,内部转为四元数) |
理解每种表示背后的数学本质,能在实际编码中做出更合适的选择。
评论