3、数学基础(二):几何基础——欧拉角、四元数、旋转矩阵、刚体变换与相似变换
好,咱们接着聊三维重建里的数学。上一章我们讲了坐标系和向量,算是热身。这一章才是真正的硬菜——旋转和变换。
说实话,我刚入行那会儿,最头疼的就是这堆东西。欧拉角、四元数、旋转矩阵……名字听着就吓人。但后来我发现,只要搞懂了它们各自是干什么的、优缺点在哪,用起来其实挺顺手的。
你想想看,三维重建里,相机在动、物体在动、点云在动。怎么描述这些运动?怎么把不同视角的数据对齐?答案就在这章里。
3.1 旋转矩阵:最直观的旋转表达
旋转矩阵,说白了就是一个3x3的方阵。它能把一个三维向量旋转到另一个方向。
它的核心性质就两条:正交和行列式为+1。正交意味着它的逆等于它的转置,这在实际计算中太方便了。行列式为+1保证了它是纯旋转,没有缩放或镜像。
举个例子,绕Z轴旋转θ角,旋转矩阵长这样:
R_z(θ) = [
[cosθ, -sinθ, 0],
[sinθ, cosθ, 0],
[0, 0, 1]
]
绕X轴和Y轴的类似,我就不写了。组合起来,任何旋转都能用三个基本旋转的乘积表示。
3.2 欧拉角:直观但坑多
欧拉角可能是最直观的旋转表达方式了。它用三个角度来描述旋转:绕X轴转多少(roll)、绕Y轴转多少(pitch)、绕Z轴转多少(yaw)。
飞机、无人机、游戏里用得特别多。你一说“俯仰角30度”,大家都能想象出来。
但欧拉角有个大坑——万向锁。当pitch达到±90度时,roll和yaw会变得无法区分。说白了就是丢失了一个自由度。
另外,欧拉角的顺序也很重要。XYZ、ZYX、YXZ……不同顺序得到的结果完全不同。所以用欧拉角时,一定要明确约定顺序。
3.3 四元数:三维重建的“瑞士军刀”
四元数,听起来很玄乎。其实它就是四个数:一个实部加三个虚部。写成q = w + xi + yj + zk。
为什么三维重建里这么爱用四元数?原因有三:
- 无万向锁——这是最大的优势
- 插值平滑——SLERP插值能生成非常自然的旋转过渡
- 计算高效——比旋转矩阵少几个乘法,比欧拉角稳定
四元数表示旋转的公式也很优雅:
v' = q * v * q^(-1)
其中v是三维向量(写成纯四元数),q是单位四元数。这个公式把旋转变成了“乘法”,数学上非常干净。
核心要点: 四元数虽然抽象,但它是三维重建里最常用的旋转表达方式。我个人建议,只要涉及相机位姿优化、点云配准,优先用四元数。
3.4 刚体变换:旋转+平移
刚体变换,就是旋转加平移。它描述的是“物体整体移动,形状不变”的运动。
在三维重建里,相机从一个位置移动到另一个位置,就是刚体变换。点云配准里,把两片点云对齐,也是刚体变换。
数学上,刚体变换可以写成:
P' = R * P + t
其中R是旋转矩阵,t是平移向量。为了计算方便,我们通常用齐次坐标把它写成4x4矩阵:
T = [
[R, t],
[0, 1]
]
这样,连续变换就可以用矩阵乘法串联起来,非常方便。
3.5 相似变换:比刚体多一个尺度
相似变换,就是在刚体变换的基础上,加了一个均匀缩放。
什么时候用?比如你把一个CAD模型缩放到真实尺寸,或者把不同尺度的点云对齐。说白了,就是“形状一样,大小不同”。
数学上:
P' = s * R * P + t
其中s是缩放因子。齐次坐标下:
T_s = [
[s*R, t],
[0, 1]
]
注意,这里的缩放是各向同性的——三个方向缩放相同。如果各方向缩放不同,那就变成仿射变换了,不在我们今天的讨论范围内。
3.6 知识体系总览
说了这么多,我画个图帮你理清思路:
3.7 实际项目中的选择建议
说了这么多理论,到底该用哪个?我根据实际经验给你个参考:
| 场景 | 推荐表达 | 原因 |
|---|---|---|
| 相机位姿优化(BA) | 四元数 + 平移向量 | 无万向锁,参数少,优化稳定 |
| 点云配准(ICP) | 4x4刚体变换矩阵 | 方便串联变换,库支持好 |
| 人机交互(手动调参) | 欧拉角 | 直观,容易理解 |
| 多尺度点云对齐 | 相似变换矩阵 | 同时处理旋转、平移和缩放 |
| 动画/插值 | 四元数SLERP | 平滑无抖动 |
好了,这一章的内容就到这。几何变换是三维重建的基石,搞懂了这些,后面讲相机模型、多视图几何的时候,你会觉得轻松很多。
记住一句话:旋转用四元数,变换用齐次矩阵,调试用欧拉角。这是我多年项目经验的总结,希望对你有帮助。