物理引擎
2026/7/26大约 5 分钟
游戏物理引擎 - 碰撞检测、刚体动力学与约束求解
引言:物理引擎在做什么
物理引擎每帧回答两个问题:
- 谁和谁碰上了? —— 碰撞检测(Collision Detection)
- 碰上之后怎么动? —— 碰撞响应 / 动力学(Dynamics & Solver)
再加上"用稳定、可复现的方式推进时间"——固定步长积分。
一、碰撞检测:宽相 + 窄相
逐对检测所有物体是 O(n²),不可接受。所以分两阶段:
宽相(Broad Phase)
用包围体 + 空间加速结构快速筛出"可能相碰"的候选对:
| 结构 | 说明 |
|---|---|
| AABB | 轴对齐包围盒,相交测试极快 |
| BVH(层级包围体) | 树形组织包围盒,O(log n) 查询 |
| Sweep and Prune | 沿轴排序端点,增量更新,适合帧间连续 |
| 空间哈希 / 网格 | 均匀网格分桶,适合均匀分布 |
BVH 结构示意:
[根 AABB]
/ \
[子树 AABB] [子树 AABB]
/ \ / \
[叶:物体A][叶:物体B][叶:物体C][叶:物体D]
查询时从根下潜,包围盒不相交的整枝剪掉窄相(Narrow Phase)
对候选对做精确几何相交,生成接触流形(接触点、法线、穿透深度):
- GJK(Gilbert-Johnson-Keerthi):判断两凸形是否相交(基于闵可夫斯基差 + 支撑函数)。
- EPA(Expanding Polytope Algorithm):相交时,求穿透深度与分离法线(GJK 的后续)。
- 简单形状(球、盒、胶囊)有解析的快速专用检测。
- 凹形通常拆成多个凸形或用凸包近似。
二、刚体动力学
碰到之后如何运动,由动力学积分决定:
- 状态:位置、朝向、线速度、角速度。
- 积分器:每步用受力/冲量更新状态,常用 半隐式欧拉(Semi-implicit Euler)(比显式欧拉稳定)。
- 质量属性:质量、惯性张量决定平动/转动响应。
三、约束求解(Constraint Solver)
碰撞响应、关节、堆叠等都表示为约束,需要求解满足:
| 约束类型 | 例子 |
|---|---|
| 接触约束 | 不穿透(碰撞响应) |
| 摩擦约束 | 切向阻力 |
| 关节约束 | 铰链、球窝、固定关节 |
主流解法是迭代冲量法(Sequential Impulse / PGS):
- 每步对所有约束多次迭代,逐个施加冲量修正速度,逐步收敛。
- 迭代次数是质量 vs 性能的权衡:次数少则堆叠/关节"软"、抖动;次数多则稳定但贵。
- 穿透修正:用 Baumgarte / 位置投影把已穿透的物体推开。
四、固定步长(Fixed Timestep)
物理必须用固定的时间步长推进,而非可变帧时间:
- 为什么固定:物理积分与约束求解对步长敏感,可变步长会不稳定、不可复现(联机/回放要求确定性)。
- 做法:累积真实时间,够一个固定 dt 就 step 一次(可能一帧 step 0~多次);渲染时对物理状态做插值避免卡顿。
- 步长太大 → 穿透/不稳定(隧穿);太小 → 开销大。
连续碰撞检测(CCD)
高速物体在一步内可能穿过薄物体(隧穿 tunneling)。CCD 通过扫掠(swept)检测运动路径上的碰撞,防止穿透 —— 但开销高,通常只对高速关键物体开启。
五、性能与实践
- 宽相是关键:好的空间结构(BVH/SAP)把 O(n²) 降到近似 O(n log n)。
- 休眠(Sleeping):静止物体进入睡眠、跳过求解,直到被扰动 —— 大幅省开销。
- 碰撞体简化:用简单凸形(盒/球/胶囊/凸包)而非复杂网格碰撞;静态用 mesh collider、动态尽量凸形。
- 迭代次数与步长调参平衡稳定性与性能。
- 分层过滤(Collision Matrix):用层/掩码排除不需要检测的对,减少宽相候选。
- CCD 按需开启:只给高速小物体,避免全局开销。
六、总结
物理引擎的核心由碰撞检测、刚体动力学与约束求解三大模块构成。碰撞检测通过宽相与窄相两阶段将 O(n²) 的暴力检测降为近似 O(n log n);刚体动力学用半隐式欧拉积分推进状态;约束求解通过迭代冲量法逐次修正速度以逼近接触、摩擦与关节约束。固定步长保证了稳定性与可复现性,而连续碰撞检测(CCD)、休眠机制、碰撞体简化与分层过滤等实践则在实际工程中平衡了精度与性能。
附:核心概念速查
| 概念 | 说明 |
|---|---|
| 宽相 / 窄相 | 快速排除候选 / 精确检测生成接触 |
| AABB / BVH / SAP | 宽相的包围体与加速结构 |
| GJK / EPA | 凸形相交判断 / 求穿透深度与法线 |
| 接触流形 | 接触点、法线、穿透深度 |
| 半隐式欧拉 | 稳定的常用积分器 |
| 迭代冲量法(PGS) | 主流约束求解,多次迭代收敛 |
| 固定步长 | 稳定、可复现的物理推进 |
| CCD | 连续碰撞检测,防高速隧穿 |
| Sleeping | 静止物体休眠省开销 |
