📌 项目地址: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=OFF和cmake --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 是当前最值得关注的项目。