[译] 发布 Box3D —— 开源三维物理引擎
本文翻译自 Erin Catto 博客 Announcing Box3D(2026 年 6 月 30 日)。
Box3D 现已正式发布——一款开源三维物理引擎,托管于 GitHub:github.com/erincatto/box3d。
Box3D 是 Box2D 的一个分支(fork),并扩展了三维游戏所需的诸多特性:
- 三角网格碰撞(triangle mesh collision)
- 高度场碰撞(height-field collision)
- 烘焙复合碰撞(baked compound collision)
其核心架构与 Box2D 几乎相同,保留了所有核心能力:
- C API
- 全部库代码使用 C17
- 子步求解器(sub-stepping solver)
- 连续碰撞检测(continuous collision)
- 大规模岛的图着色(graph coloring for large islands)
- 宽 SIMD 接触求解器
- 多线程钩子(multi-threading hooks)
- 可选的内部调度器
- 使用双精度浮点数(double)支持大型世界
- 跨平台确定性(cross platform determinism)
- 录制与回放(recording and replay)
Box3D 的存在有两个主要原因。且听我慢慢道来。
原因一:《加利福尼亚传奇》需要它
自 2022 年起,我在 Kintsugiyama 工作室开发游戏《The Legend of California》,使用 Unreal Engine(从 5.0 版本起步)。Unreal 的原生物理引擎 Chaos 存在若干问题。
原生 Unreal 物理的问题
首先,Chaos 不支持陀螺力矩(gyroscopic torque)的仿真。这意味着细长形状的刚体会保持角速度不变——想象一支旋转的步枪,缺乏陀螺效应会导致不真实的物理行为。我曾在 2015 年 GDC 上提出一个约 10 行的陀螺力矩算法(Numerical Methods GDC2015)。Epic 直到 2024 年底才合入了该功能。
更严重的问题是:在我们的生存游戏中,倒下的树木移动诡异,在屏幕上来回跳跃。我怀疑 Chaos 使用了某种连续碰撞的后备方案——而这个场景(大型胶囊体在光滑三角网格上)本应极其简单。
此外,游戏需要在服务端管理数十万个实体,这要求一个极快的宽相碰撞检测(broad-phase)。我在这一领域有丰富经验,包括 GDC 关于动态 BVH 的演讲。
这导向了一个抉择点:是修复原生方案,还是用外部引擎替换?
我考察了 Jolt 等已有引擎,但一位朋友建议了另一条道路。
Valve 伸出援手
我的朋友 Dirk Gregorius——他在《Half-Life: Alyx》中交付了自定义物理引擎 Rubikon(Valve Developer Wiki),并维护着一个业余版本 Rubikon-Lite——建议我 fork Rubikon-Lite。
我将 Rubikon-Lite 接入 Unreal。效果极佳! 我们获得了陀螺力矩,树木也自然倒下。我们能走捷径是因为:
- 我们使用自己的脚本系统(而非 Blueprint)
- 使用移植到 Unreal 的 Esoterica 动画系统
- 拥有直接连接到 Box3D 的自定义 ECS
Box2D v3.0 的优化工作促使我保持二维和三维方向的一致性。我将 Rubikon-Lite 中几乎所有的 API、数据结构和算法替换为 Box2D 代码。今天的 Box3D 仍保留了 Rubikon-Lite 中凸包生成(convex hull generation)和部分碰撞算法的代码;其余部分来自 Box2D 及全新编写的代码。
在 Valve 方面,Rubikon 仍在持续演进。Dirk 已在一个名为 Ragnarok 的新引擎中开发了进一步的优化。
自研更好
《加利福尼亚传奇》是一款宏大的作品——大型开放世界、服务端权威(server authority)。倒下的树木、布娃娃(ragdoll)、体素(voxel)、酒吧弹簧门、风滚草——所有这些都由服务端物理仿真。自定义引擎使我们能够针对具体需求裁剪功能与性能。
性能工作的重点之一是”针对倒树进行优化”:巨大的红杉木快速倒向体素地形,需要精细调校的网格碰撞和 CCD。同时,为运行时构建的体素系统快速生成碰撞网格也至关重要——”由于体素呈网格状,采用中值分割(median split)构建效果极好。”
流式加载(streaming)同样关键。通过 kitbashing 构建的要塞可能包含约 50,000 个独立的碰撞网格。逐一加载效率极低,因此我们构建了复合碰撞系统——”将分离的碰撞形状烘焙(cook)为优化的数据结构”,作为单一超级形状加载,消除了数千个刚体和形状的开销。
原因二:可持续的知识(与心智)
自 2004 年以来,我一直为游戏制作物理引擎。每次更换工作都意味着将之前的成果抛在身后。Box2D 在某种程度上正是作为开源项目创建的,用以捕获我的知识积累。”在三维方面,我在许多问题上不断重复造轮子。”
我成功说服了 Kintsugiyama,允许 Box3D 成为开源项目,并且作为我日常工作的一部分——这使得我可以切实地长期维护它。
为何使用 Box3D?
简而言之:如果你喜欢 Box2D 及其设计理念,你很可能会喜欢 Box3D。我并不是在与其他引擎竞争。开源对我来说不是一门生意。
快速上手
- 安装 git 和 CMake
- 克隆仓库:github.com/erincatto/box3d
- 按照 README 中的构建说明操作
- 构建后运行示例(samples)
- 查看示例代码以入门
- 引擎头文件有完整的 Doxygen 注释;手册正在编写中
- 在线文档:box2d.org/documentation3d
- 最小示例代码见 HelloWorld test
谁在使用 Box3D?
除《加利福尼亚传奇》外:
Box3D 的未来
Box3D 目前仍为 alpha 版本。v0.1 标签即将发布,逐步向 v1.0 迈进。还需要更多的测试和文档。
规划中的工作:
- 增强角色移动特性
- 改进幽灵碰撞(ghost collision)缓解策略
- 性能优化
- 改进关节求解器
我计划 无限期地支持 Box3D,与 Box2D 并行维护。一旦成熟,我可能会暂停功能开发。与 Box2D 不同,我计划接受 Pull Request,大概率会使用 CLA(贡献者许可协议)。
我将继续撰写博客和制作视频。Box3D 不会有独立的网站或 Discord 服务器——更新将发布在本站点和 Box2D Discord 服务器。
| 《加利福尼亚传奇》:官网 | Steam |
| 支持 Box3D 开发:GitHub Sponsors | Patreon |
原文:Announcing Box3D — Erin Catto
© 2026 Erin Catto