Erin Catto 将传奇 Box2D 物理引擎带入 3D 世界
如果你曾经对 2D 游戏开发感兴趣,那么一定听说过 Box2D。《愤怒的小鸟》、《地狱边境》等数百个项目都构建在这个引擎之上。近日,其创始人 Erin Catto 发布了新项目——Box3D。这是一个从零开始用 C 编写的刚体 3D 物理库。
Box3D 是什么
该库采用可移植的 C17 编写,除了标准 C 库外没有任何外部依赖。项目附带的示例使用 C++20 编写,配合 sokol 图形后端和 Dear ImGui 界面。演示应用程序可以在 Windows、macOS 和 Linux 上顺利构建,并且可以通过 WebAssembly 在浏览器中直接运行物理模拟。

与臃肿的商业替代方案不同,Box3D 专注于纯性能、数据导向的设计和可预测性。
主要特性
向量计算与性能
物理引擎核心充分利用了 x86 处理器的 SSE2 向量指令和 ARM 的 Neon 指令。如果你正在为没有 SIMD 支持的 exotic 平台或微控制器构建项目,可以通过 BOX3D_DISABLE_SIMD 宏定义禁用向量数学计算。
Soft Step 求解器与关节类型
Soft Step 算法处理刚体行为。引擎支持凸包、胶囊、球体、多边形网格和高度场。多个形状可以附加到单个刚体上。
支持的关节类型包括:
- 铰链和滑块
- 距离约束和电机
- 焊接关节和轮毂关节
- 可配置的限位、弹簧和摩擦
为了节省资源,系统使用了岛屿睡眠机制:如果一组物体停止运动,引擎会暂时将其排除在计算之外。
确定性与模拟录制
物理世界计算的结果在不同平台上保持一致。这对于网络多人游戏至关重要。开箱即用的模拟录制和回放功能简化了物理 bug 的调试。
连续碰撞检测
得益于完整的连续碰撞检测(CCD)系统,快速移动的物体不会穿墙而过。算法同时处理快速线性运动和旋转。
如何集成到项目中
通过 FetchContent 将 Box3D 集成到 CMake 项目中只需要几分钟:
include(FetchContent)
FetchContent_Declare(box3d
GIT_REPOSITORY https://github.com/erincatto/box3d.git
GIT_TAG v0.1.0)
FetchContent_MakeAvailable(box3d)
target_link_libraries(my_app PRIVATE box3d::box3d)
如果你更喜欢将第三方代码保持在本地,标准的 add_subdirectory 方式同样适用:
add_subdirectory(extern/box3d)
target_link_libraries(my_app PRIVATE box3d::box3d)
关于 AI 在开发中的坦诚对话
README 中有一个有趣的细节——作者坦诚描述了神经网络在创建该库中的作用。Erin Catto 明确表示,他使用 LLM 生成单元测试、配置 CMake、从 Box2D 迁移代码、编写基准测试和代码审查。然而,所有物理引擎逻辑都是他自己编写的,并对每一行代码承担个人责任。
适用人群
如果你正在用 C 或 C++ 编写自己的 3D 引擎,并且一直在寻找一个紧凑的物理库——不需要大量的图形或引擎开销——Box3D 值得仔细研究。该项目处于 0.1.0 发布阶段,目前关闭了 pull requests,仅接受 issues,但源代码采用 MIT 许可证开放,且非常易于阅读。
相关项目