Box2D 是一个开源、高性能的 C++ 2D 物理引擎,仅模拟物理行为(如刚体运动、碰撞、关节),不负责渲染,需配合图形库使用;其核心对象为世界→刚体→夹具→形状,推荐1单位=1米并采用固定时间步调用 Step()。

Box2D 是一个开源、高性能的 2D 物理引擎,用 C++ 编写,广泛用于游戏开发(如《愤怒的小鸟》早期版本)。它不负责渲染,只模拟刚体运动、碰撞、关节等物理行为,需配合图形库(如 SFML、SDL2 或 OpenGL)使用。
一、环境准备与基础编译
Box2D 官方已迁移到 GitHub,推荐使用现代构建方式:
- 从 https://github.com/erincatto/box2d 克隆或下载最新 release(v2.4.x)
- 用 CMake 构建(支持 Windows/macOS/Linux):启用 BUILD_SHARED_LIBS=OFF 可静态链接,避免 DLL 依赖问题
- 将
include/box2d加入项目头文件搜索路径;链接生成的libbox2d.a(Linux/macOS)或box2d.lib(Windows) - 无需预编译 DLL —— 静态链接更轻量、部署简单
二、核心对象与最小可运行示例
Box2D 围绕四个关键对象组织:世界(b2World)→ 刚体(b2Body)→ 夹具(b2Fixture)→ 形状(b2Shape)。下面是一个创建地面和下落方块的极简逻辑:
// 1. 创建世界(重力向下) b2Vec2 gravity(0.0f, -10.0f); b2World world(gravity);// 2. 创建地面刚体(静态) b2BodyDef groundDef; groundDef.position.Set(0.0f, -10.0f); b2Body* ground = world.CreateBody(&groundDef); b2PolygonShape groundShape; groundShape.SetAsBox(50.0f, 1.0f); // 宽50高1的矩形 ground->CreateFixture(&groundShape, 0.0f); // 密度为0 → 静态刚体
// 3. 创建下落方块(动态) b2BodyDef bodyDef; bodyDef.type = b2_dynamicBody; bodyDef.position.Set(0.0f, 5.0f); b2Body* body = world.CreateBody(&bodyDef); b2PolygonShape dynamicShape; dynamicShape.SetAsBox(1.0f, 1.0f); body->CreateFixture(&dynamicShape, 1.0f); // 密度1.0 → 可受力
// 4. 主循环:更新物理(建议固定步长,如 1/60 秒) float32 timeStep = 1.0f / 60.0f; int32 velocityIterations = 6; int32 positionIterations = 2; world.Step(timeStep, velocityIterations, positionIterations);
// 5. 读取位置用于渲染(例如:body->GetPosition())
三、关键概念与避坑提醒
- 单位制是任意的,但推荐 1单位 = 1米:Box2D 对“过大”或“过小”的数值(如 1000px 或 0.001f)模拟不稳定,物体可能穿透或抖动
- 刚体类型分三种:static(静止,不受力)、kinematic(匀速运动,可设速度但不受力影响)、dynamic(完全物理模拟)
- 夹具(Fixture)才是碰撞主体:形状本身不参与物理,必须通过夹具附加到刚体上;一个刚体可有多个夹具(如角色+武器碰撞体)
- 务必用固定时间步调用 Step():不要直接传帧间隔(dt),否则物理结果不可重现;可用累积时间 + while 循环做插值
-
销毁刚体要小心:不能在接触回调中直接调用
DestroyBody(),应标记后延后删除,否则引发迭代器失效











