📌 项目地址erincatto/box3d | ⭐ 5,713 颗星 | 🔧 C | 📜 未标注

Box3D 是什么?

Box3D 是 Erin Catto(Box2D 作者)推出的 3D 物理引擎,用纯 C17 编写,面向游戏开发。它继承了 Box2D 的稳定性和求解器设计,但在 3D 空间、数据布局和多线程上做了彻底重构。官方定位是“for games”,不是通用仿真引擎,因此对性能、实时性和确定性有明确要求。

核心特性集中在三个方面:

  • 碰撞:连续碰撞检测(CCD)、凸包/胶囊体/球体/三角形网格/高度场、多形状复合体、碰撞过滤、射线投射/形状投射/重叠查询、传感器系统、角色移动器。
  • 物理:Robust Soft Step 刚体求解器、支持高速平移和旋转的连续物理、基于 Island 的休眠、六种关节(revolute、prismatic、distance、motor、weld、wheel),以及关节限位、弹簧、摩擦、力和事件通知。
  • 系统:面向数据设计、跨平台确定性、录制与回放、大量多线程和 SIMD 优化,特别针对“大量刚体堆叠”场景做了优化。

为什么值得关注?

Erin Catto 是游戏物理领域最有影响力的人之一,Box2D 几乎成了 2D 物理的事实标准。Box3D 是他对 3D 物理引擎的现代重新实现,不依赖第三方库,只依赖 C 运行库和 libm。对于需要可嵌入、可跨平台、可确定性回放的 3D 物理解决方案,这是一个非常少见的选项。

相比 Bullet 或 PhysX,Box3D 更强调“干净的设计 + 可控的确定性 + 现代 C 接口”。它没有庞大的 GPL 生态包袱(Box3D 使用 MIT 许可证),也没有复杂的场景图结构,更像一个“物理算法库”,而不是“物理中间件”。

实际用法:如何构建和运行 Samples

官方推荐使用 CMake presets,以下命令全部来自 README。

Windows:

cmake --preset windows
cmake --build --preset windows-release

Linux:

cmake --preset linux-release
cmake --build --preset linux-release

macOS:

cmake --preset macos
cmake --build --preset macos-release

Windows MinGW:

cmake --preset mingw-release
cmake --build --preset mingw-release

构建后运行示例程序(必须在 Box3D 目录下):

  • Windows: .buildbinReleasesamples.exe
  • Linux: ./build/bin/samples
  • macOS: ./build/bin/Release/samples

在你的项目中使用 Box3D

README 明确推荐使用 CMake 的 FetchContent:

include(FetchContent)
FetchContent_Declare(box3d
  GIT_REPOSITORY https://github.com/erincatto/box3d.

注意上面最后一行在 README 原文中是以 . 结尾的,实际使用时应替换为对应版本 tag 或分支。链接后你会获得 box3d::box3d 这个 CMake target。核心库没有任何额外依赖,Unix 下只需要 libm

构建细节与注意事项

  • Visual Studio:需要安装 Visual Studio,然后运行 build_vs2026.bat,打开并构建 build/box3d.slnx
  • Linux:直接运行 build.sh,结果在 build 子文件夹。
  • Xcode:手动创建 build 目录,执行 cmake -G Xcode ..,打开 box3d.xcodeproj,选择 samples scheme。
  • WebAssembly:需要 Emscripten SDK,用 emcmake cmake -B build -DBOX3D_SAMPLES=OFFcmake --build build。Box3D 在 WebAssembly 下默认使用 SSE2,可通过 BOX3D_DISABLE_SIMD 宏禁用。
  • 安装cmake --install .(可能需要 sudo)。

需要注意的局限性

  • 项目仍处于开发阶段,API 可能会变化。README 中并未承诺稳定 ABI。
  • 官方提供的 samples 使用 sokol 做渲染后端(Windows 上 D3D11,macOS 上 Metal,Linux 上 OpenGL 4.5),这意味着要实际查看示例,需要对应平台的图形 API 支持。
  • 默认启用 SIMD,如果目标平台不支持 SSE2,需要定义 BOX3D_DISABLE_SIMD 重新编译。
  • 虽然支持多线程,但多线程具体如何配置、跨平台确定性如何保证,README 没有给出详细说明,需要查看源码或官方文档。
  • 官方描述中强调“optimized for large piles of bodies”,如果你的需求是柔体、流体或破坏效果,Box3D 并不适合——它主要面向刚体。

适合谁用?

Box3D 适合以下具体的项目场景:

  • 你需要一个可嵌入的 3D 刚体物理库,且不愿引入 PhysX 或 Bullet 这样的大型框架;
  • 你的游戏需要连续碰撞检测来防止高速物体穿透,并且需要可复现的录制/回放功能;
  • 你在做跨平台(包括 WebAssembly)游戏,希望同一个物理代码在所有平台上行为一致;
  • 你想研究一个现代游戏物理引擎的内部实现,Box3D 的代码比 Box2D 更清晰,且是纯 C,易于阅读。

如果你只是想要一个开箱即用的 3D 物理解决方案,并且不关心确定性或源码学习,Box3D 可能不如 Bullet 成熟。但如果你欣赏 Box2D 的设计哲学,想在 3D 领域获得类似体验,Box3D 是当前最值得关注的项目。

这篇文章对你有帮助吗?

发表回复