☰
碰撞检测与动力学求解的深层分工
2026/10/8 13:56:09 网站建设 项目流程

PhysX 中,碰撞检测和动力学求解是两个相互连接、但职责不同的系统:

碰撞检测负责确定“物体之间发生了什么接触”;动力学求解负责决定“这些接触以及外力、关节,会让物体怎样运动”。

以箱子落到地面为例:

碰撞检测: 箱子底部接近或接触地面; 接触点在哪里; 接触法线与分离距离是多少。 动力学求解: 地面需要给箱子多大的支撑冲量; 箱子是否反弹、滑动或旋转; 下一时刻箱子的速度与位姿如何变化。

以下以 PhysX 的 CPU 刚体模拟为主说明。


一、整体分工

形状、位姿、过滤规则 │ ▼ 碰撞检测 ├─ Broad Phase:找候选对 └─ Narrow Phase:生成接触 │ ▼ 接触数据 │ ├──── 质量、惯性、速度 ├──── 摩擦、恢复参数 ├──── 关节和驱动 └──── 外力、重力、力矩 │ ▼ 动力学处理 ├─ 外力与运动状态准备 ├─ 约束准备 ├─ 约束求解 └─ 状态积分 │ ▼ 新的速度与位姿

实际执行可能并行或交织,尤其 PGS、TGS 和 CCD 配置会影响具体时序。


二、碰撞检测的目的与职责

1. 目的:建立可靠的接触事实

碰撞检测需要回答:

  1. 哪些形状可能接触?
  2. 哪些形状需要进一步处理?
  3. 是否需要生成接触?
  4. 接触位置、方向和距离是什么?

它主要研究的是几何关系,而不是物体受到接触后如何运动。


2. Broad Phase:筛选潜在碰撞对

目的

避免对整个场景中的形状执行两两精确检测。

职责

  • 根据形状边界维护空间结构;
  • 查找可能重叠的形状对;
  • 识别新增和消失的候选关系;
  • 尽量减少进入精确检测的配对数量。

输入与输出

输入: 形状的世界空间边界及其变化 输出: 潜在碰撞对

例如:

箱子 A 与地面:可能接触 箱子 A 与远处汽车:排除

宽相不确定真实接触点,也不计算碰撞响应。


3. 过滤与交互维护:决定是否需要处理

这部分是碰撞流水线中的管理职责,不是纯粹的几何算法。

目的

让几何候选关系遵守应用的碰撞规则。

职责

  • 排除不允许交互的对象对;
  • 区分普通接触与触发器;
  • 设置是否需要接触通知;
  • 维护持续交互及其生命周期。

例如:

子弹与发射者: 忽略。 箱子与地面: 检测接触并产生物理响应。 角色与任务触发区: 检测重叠,但不产生阻挡响应。

因此:

发生几何重叠,不代表一定生成求解约束;生成接触,也不代表默认会向应用发送所有接触事件。


4. Narrow Phase:计算接触细节

目的

将“可能碰撞”转化为实际可用的接触或重叠信息。

职责

  • 对具体几何组合执行精确检测;
  • 生成接触位置和法线;
  • 计算分离距离或穿透相关信息;
  • 维护和更新接触流形;
  • 利用历史缓存降低重复计算。

输入与输出

输入: 两个形状的几何和位姿 接触生成参数 历史接触缓存 输出: 接触点 接触法线 分离距离 接触流形及相关信息

PhysX 可以在物体尚未实际穿透时生成接触,因此窄相不只是判断“是否已经相交”。

不属于它的职责

窄相不负责:

  • 根据质量决定谁被撞开;
  • 计算最终摩擦冲量;
  • 维持关节;
  • 更新最终刚体运动。

这些由动力学相关阶段完成。


三、动力学求解的目的与职责

“动力学求解”有两种常见用法:

  • 狭义:约束求解器计算接触、摩擦、关节等约束冲量;
  • 广义:包括外力处理、约束准备、求解和运动积分的完整动力学流程。

下面按广义流程说明,同时明确各部分边界。


1. 外力处理:计算不考虑约束时的运动趋势

目的

确定重力、外力和力矩如何改变刚体运动。

职责

  • 处理重力与外力;
  • 处理力矩;
  • 处理阻尼和相关速度限制;
  • 准备供求解使用的运动状态。

简化的线速度表达:

[
\mathbf{v}^{*}

\mathbf{v}_{t}
+
\left(\mathbf{g}+\frac{\mathbf{F}}{m}\right)\Delta t
]

其中 (\mathbf{v}^{*}) 是还没有完成约束修正的候选速度。

重力使箱子向下运动 ↓ 但是否会穿过地面,还要由接触约束处理

2. 约束准备:把接触与关节转成数学限制

目的

将几何信息和关节规则转化为求解器能计算的数据。

职责

结合:

  • 刚体质量与逆质量;
  • 惯性与逆惯性;
  • 接触点相对质心的位置;
  • 线速度与角速度;
  • 摩擦、恢复参数;
  • 关节限位、驱动和误差修正参数;

构建约束。

例子:箱子接触地面

法向约束: 限制继续向地面内部运动。 摩擦约束: 限制沿地面滑动。

例子:门轴

关节约束: 限制不允许的相对平移和旋转; 保留绕门轴转动的自由度。

接触点描述几何事实,约束描述运动必须遵守的条件。


3. 约束求解:计算需要多大的冲量

目的

使刚体运动尽可能满足接触和关节约束。

概念上,约束冲量对速度的影响为:

[
\Delta \mathbf{v}

M{-1}JT\lambda
]

其中:

  • (M^{-1}):广义逆质量,包含平移和转动响应;
  • (J):约束雅可比;
  • (\lambda):待求的约束冲量。

主要职责

① 接触法向响应

限制物体相互靠近到不合理穿透的程度,并配合偏置项逐步修正误差。

对于普通非黏附接触,法向冲量通常只能推开物体,不能把物体拉在一起。

② 摩擦响应

根据相对切向运动与摩擦参数,计算限制滑动的冲量。

概念上受库仑摩擦条件约束:

[
|\lambda_t|\leq \mu\lambda_n
]

实际实现会根据摩擦模型进行离散和近似。

③ 恢复响应

根据恢复系数和速度阈值等条件处理反弹,而不是让每次接触都产生弹跳。

④ 关节、限位与驱动

限制刚体间不允许的相对运动,并尝试满足驱动目标。

驱动也会受配置的力或冲量限制以及其他约束影响,不一定能精确达到目标。

为什么需要迭代?

在一堆箱子中:

地面对底层箱子的支撑 ↓ 影响中层箱子的运动 ↓ 影响顶层箱子的运动 ↓ 其他约束需要重新调整

PhysX 的 PGS、TGS 等求解器通过迭代处理这种耦合关系。

有限迭代得到的是实时预算下的近似结果,并不保证零穿透、零关节误差。


4. 状态积分:把运动状态推进到下一时刻

目的

更新刚体的位置和旋转。

职责

  • 根据线速度推进位置;
  • 根据角速度更新姿态;
  • 与求解器的状态推进、稳定化等处理配合。

最简单的位置更新示意:

[
\mathbf{x}_{t+\Delta t}

\mathbf{x}_{t}+\mathbf{v}\Delta t
]

不同求解器的积分与求解可能交织,不能把所有路径都理解为“求解一次,最后积分一次”。


四、为什么碰撞检测和动力学必须分开理解?

1. 有碰撞检测,不一定有动力学响应

例如:

  • 触发区域检测;
  • 接触通知但禁用接触求解的配置;
  • 独立几何重叠测试。

这些都可以获得交互信息,而不推动刚体。

2. 有动力学计算,不一定有碰撞

例如:

一个在空中下落的箱子: 没有接触,但仍受重力并发生运动。 两个由关节连接、彼此不碰撞的刚体: 仍然需要求解关节约束。

所以:

动力学不是碰撞之后的附属操作,碰撞只是动力学约束的重要来源之一。


五、用“球撞墙”完整串起来

① 游戏输入 给球初始速度。 ② 外力与运动准备 考虑重力、阻尼等。 ③ Broad Phase 发现球与墙可能发生接触。 ④ 过滤 确认这对对象允许碰撞和响应。 ⑤ Narrow Phase 生成球与墙的接触法线、位置、分离距离。 ⑥ 约束准备 结合球的质量、速度及材质构建约束。 ⑦ 约束求解 计算法向冲量、摩擦冲量及必要的反弹响应。 ⑧ 状态积分 推进球的位置和旋转。 ⑨ 结果获取 应用读取新的状态,并接收已配置的相关事件。

这里最重要的边界是:

检测到墙在哪里、接触是什么 ≠ 决定球撞墙后如何运动

六、职责与源码速查

子系统核心职责常见源码位置
Broad Phase筛选潜在碰撞对lowlevelaabb/
几何与接触生成计算接触细节geomutils/
底层碰撞流水线组织碰撞任务与接触数据lowlevel/
场景与交互控制管理交互、活动对象和模拟组织simulationcontroller/
动力学与约束求解约束准备、冲量求解、状态推进lowleveldynamics/

目录职责有交叉,具体实现以所使用的 PhysX 版本为准。

总结

对比项碰撞检测动力学求解
目的建立接触事实计算运动响应
主要关注几何、位姿、空间关系质量、惯性、速度、力与约束
典型输出接触点、法线、分离距离冲量、修正后的速度与运动状态
是否负责摩擦响应提供相关接触信息计算摩擦约束响应
是否负责维持关节否是
是否直接决定反弹否是

一句话记忆:碰撞检测提供“接触事实”,约束准备建立“运动规则”,动力学求解计算“响应大小”,积分产生“下一时刻的状态”。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询