Jolt Physics

Stars

面向游戏与 VR 的多核友好型 C++17 刚体物理和碰撞检测库,支持连续碰撞、约束、角色、车辆、布料与确定性仿真,已用于 Horizon Forbidden West 与 Death Stranding 2。

C++17Rigid Body · CollisionGames · VR · Deterministic
COLLISION DETECTION · GJK SIMPLEX

被拒绝的支撑点,不能参与接触重建

一次没有带来更近解的试探点,如果继续留在单纯形里,就会把微小接触放大成数米级穿透。

SHAPE CAST · CYLINDER → CAPSULE
CAST < 1 CM
FRACTION0.0STARTTOUCHING
BEFORE · REJECTED POINT RETAINED
ABC×
mNumPoints still includes C
near-degenerate triangle7.24732 mFALSE PENETRATION
AFTER · PREVIOUS VALID SIMPLEX
C×--mNumPointsREJECT
ABCONTACT RECONSTRUCTION
penetration depth4.81e-6 m< 1e-4 m · PASS
异常结果

不到一厘米的投射得到 7.25 米穿透

`GJKClosestPoint::CastShape()` 在新增支撑点无法生成更近单纯形、第二次收敛仍失败时,会返回命中却把被拒绝的点继续留在 `mP`、`mQ` 与点计数中。接触点重建因此把试探点误当作有效顶点,组成近退化三角形并产生极大的重心权重,使仅仅接触的圆柱与胶囊报告约 7.24732 米穿透深度。

几何根因

无效点构成近退化三角形

GJK 单纯形只应包含当前能够描述最近几何关系的有效支撑点;未让距离继续收敛的最后一点只是试探样本。既然第二次失败后选择接受当前命中,接触重建就必须回到加入该点之前的有效单纯形,而不能用一个几何上已被判定无效的顶点插值接触位置。

状态回退

失败返回前恢复上一个有效单纯形

在失败返回前递减 `mNumPoints`,明确将最后一个无效支撑点从单纯形中弹出,让 `mP` / `mQ` 的接触点重建只读取上一个有效单纯形;同时加入使用收缩形状与凸半径的圆柱—胶囊回归用例,锁定 `fraction == 0` 且穿透深度小于 `1e-4` 米。

跨平台验证

接触深度与确定性同时锁定

复现中的穿透深度由约 7.24732 米降至约 `4.81e-6` 米,远低于回归阈值。Debug 与 Release 各 583 项单元测试全部通过,ReleaseUBSAN 的 GJK、EPA 和 CastShape 共 26 项测试通过,并完成 Linux、Windows、macOS、Android、iOS、WebAssembly 及多架构确定性检查;PR #2108 获作者 Jorrit Rouwe 确认并合入 master,关闭 #2103。

Jolt Physics 官方刚体堆叠仿真演示
刚体堆叠演示呈现了大量关节化物体在重力、碰撞和约束共同作用下的实时运动,也直观体现 Jolt Physics 面向游戏与 VR 场景的多核刚体仿真能力。