本来打算先学习chipmuk这个物理引擎,但是找到的资料比较少,Box2d应用比较广泛,box2d是c++写的,也有jbox2d这样更有利于学习
一:
1:首先下载box2d的源码,编译运行一下。
下载cmake编译。编译的方法都在源代码项目里面有说明。(我在mac环境下编译的)
2:找到一本介绍box2d的书籍,结合源代码学习。
本来想用source insight阅读的。但是好像mac上没有这软件,所以就把这工程拷到xcode里面学习了。
二:box2d 的一些基础
1:作为物理引擎当然,得了解一些物理知识。比如力,冲量,扭拒等等
2:box2d的基本概念
刚体(rigid body):一块十分坚硬的物质,它上面的任何两点之间的距离都是完全不变的。它们就像钻石那样坚硬。在后 面的讨论中,我们用物体(body)来代替刚体。
形状(shape)
一块严格依附于物体(body)的 2D 碰撞几何结构(collision geometry)。形状具有摩擦(friction)和恢 复(restitution)的材料性质。
约束(constraint)
一个约束(constraint)就是消除物体自由度的物理连接
关节(joint)
它是一种用于把两个或多个物体固定到一起的约束。Box2D 支持的关节类型有:旋转,棱柱,距离等 等。关节可以支持限制(limits)和马达(motors)。
关节限制(joint limit)
一个关节限制(joint limit)限定了一个关节的运动范围。例如人类的胳膊肘只能做某一范围角度的运 动。
关节马达(joint motor)
一个关节马达能依照关节的自由度来驱动所连接的物体。例如,你可以使用一个马达来驱动一个肘的 旋转。
世界(world)
一个物理世界就是物体,形状和约束相互作用的集合。Box2D 支持创建多个世界,但这通常是不必要 的。
三:基本步骤
1:先建立包围盒
b2AABB worldAABB;
worldAABB.lowerBound.Set(-100.0f,-100.0f);
worldAABB.upperBound.Set(100.0f,100.0f);
定义重力矢量
b2Vec2 gravity(0.0f,-10.0f);
bool doSleep=true;
建立世界对象
b2World world(worldAABB,gravity,doSleep);
定义地面
b2BodyDef groundBodyDef;
groundBodyDef.poition.Set(0.0f,-10.0f);
b2Body* ground=world.CreateBody(&groundBodyDef);
b2PolygonDef groundShapeDef;
groundShapeDef.SetAsBox(50.0f,10.0f);
groundBody->CreateShape(&groundShapeDef);