ammo.js 替代方案
ammo.js 是知名且常用的 JavaScript 物理引擎,功能灵活,支持高保真模拟,但性能和内存要求也较高。因此需要评估它是否最适合应用;例如 2D 游戏可能更适合专用 2D 物理引擎。
以下列出替代方案,开发较活跃者排在前面,后面是基本不再维护但仍可使用的旧引擎:
| 物理引擎 | 语言 | JS 构建 | WASM 构建 | 2D | 3D | 确定性 | PlayCanvas 集成 |
|---|---|---|---|---|---|---|---|
| Rapier | Rust | ✔️ | ✔️ | ✔️ | ✔️ | ||
| Jolt | C++ | ✔️ | ✔️ | ✔️ | ✔️ | ||
| Box3D | C | ✔️ | ✔️ | ✔️ | |||
| PhysX | C++ | ✔️ | ✔️ | ||||
| box2d.js | C++ | ✔️ | ✔️ | ✔️ | |||
| Matter.js | JavaScript | ✔️ | ✔️ | ||||
| p2.js | JavaScript | ✔️ | ✔️ | 有 | |||
| cannon.js | JavaScript | ✔️ | ✔️ | ||||
| Oimo.js | JavaScript | ✔️ | ✔️ |
非 JavaScript 引擎通过独立绑定项目编译到浏览器:Rapier 使用 @dimforge/rapier2d 和 @dimforge/rapier3d,Jolt 使用 JoltPhysics.js,Box3D 使用 box3d.js,PhysX 使用 physx-js-webidl。只有 Rapier 和 Jolt 绑定由对应引擎作者维护。
多数只提供 WebAssembly。Jolt 和 box2d.js 也提供 JavaScript 构建,因为 Emscripten 可生成 asm.js。asm.js 无需 WebAssembly 支持,可在 JavaScript 环境运行,但比对应 WASM 更慢、更大,因此除非有特别需求,应优先使用 WebAssembly。
确定性
表中的确定性表示跨平台确定性,即不同设备产生完全相同的模拟结果,适用于锁步联网和重放。它取决于构建设置,使用前应确认:
- Rapier 官方 WebAssembly 包默认具有跨平台确定性。
- Jolt 需要编译时启用
CROSS_PLATFORM_DETERMINISTIC,预编译 JoltPhysics.js 包未启用。 - PhysX 只保证同一平台与构建的确定性,明确不支持跨架构确定性。
引擎物理组件不会直接调用 ammo.js。刚体、形状、关节、射线和接触报告经过 PhysicsWorld 后端层,内置 ammo.js 是其中一种实现。此层标记为 Alpha,API 仍可能变化,但它是集成其他引擎的预期接口:Rapier 或 Jolt 后端实现相同类,即可保留现有 rigidbody 和 collision 组件。较早的 PlayCanvas p2.js 集成早于该层,通过自己的脚本组件封装物理引擎。
另请参阅
- 物理入门:在各开发方式下启用 ammo.js。
- 直接调用 ammo.js:使用组件未公开的 Bullet 功能。