本文翻译自 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。我并不是在与其他引擎竞争。开源对我来说不是一门生意。

快速上手

  1. 安装 gitCMake
  2. 克隆仓库:github.com/erincatto/box3d
  3. 按照 README 中的构建说明操作
  4. 构建后运行示例(samples)
  5. 查看示例代码以入门
  6. 引擎头文件有完整的 Doxygen 注释;手册正在编写中
  7. 在线文档:box2d.org/documentation3d
  8. 最小示例代码见 HelloWorld test

谁在使用 Box3D?

除《加利福尼亚传奇》外:

  • s&box — Facepunch Studios 的游戏平台
  • Esoterica — Bobby Anguelov 的开源游戏引擎
  • 千人太空游戏 — Glenn Fiedler 开发的多人在线游戏

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