box2d Mannual
1.5 核心概念
1. rigid body
刚性物体,很硬,上面任意两点的距离都是固定的。
2. shape
外形,比如:矩形,三角形,圆形。
3. fixture
将body 和 shape 连接起来。 并且规定了物体的摩擦力,弹性。
4.constraint
约束。任何一个物体,都有三个方面的自由度:x, y 方向的移动,旋转。 如果加上了constraint ,那么就可限制物体的某个自由度。
5. contact constraint
一种特殊的约束,用来防止一个物体插入另一个物体,还可以模拟摩擦力和弹性。(fixture 里不也可以定义吗?不知这是神码意思)
6. joint
一种约束。用来将连个物体连接在一起。包括:旋转,菱形,distance等。有些约束可以有限制,Motors。
7. joint limit
用来限制Joint 的运动幅度,比如人的手肘只能弯曲到一定程度。
8. joint motor
Joint 马达可以用来驱动Joint, 比如可以用joint motor 来驱动手肘的转动。
9. world
世界,包含body, fixture, constraint 等等所有的东西。
10. solver
无语。。。后面会有介绍。
11. continous collision
连续碰撞。 solver 用的是不连续的方式来推断下一步的运动状态,如果不加处理,就会出现跳跃的情况。
box2d 采用了特殊的算法来处理tunneling(跳跃)的出现。
1.6 modules
box2d 有三大模块: Collision, Common, Dynamic
Common 模块包括分配内存,数学,数值设定等。
Collision 模块包括 Shape定义,碰撞检测,碰撞函数/查询等
Dynamic 模块包括对现实世界的模拟,比如Fixture,Body,Joint等。
1.7 单位
box2d 用米,公斤,秒作为单位。
一个物体的大小最好在 0.1米 -- 10米之间,静态物体可以最大到50米。
在编程中,不要用像素值来替代米!要做转换。
1.8 Factory and Definitions
用Create 方法来创建所有的box2d对象,而不是用其他的方式。
b2Body * body = b2Body::CreateBody(const b2BodyDef* bdef);
b2Joint * joint = b2Joint::CreateJoint(const b2JointDef * bJoint);
b2Body::Destroy(body);
b2Joint::Destroy(joint);
b2Body --> b2Fixture --> b2Shape/denisty .
1.9 UserData
不用多说,用来承载用户数据的。什么数据都行。
Chapter2 Helloworld BOX2D
1. 创建世界
b2World myWorld(重力向量,是否休眠);
2. 创建body
b2BodyDef groundDef;
groundDef.position.set(0.0f, -10.0f);
b2Body * ground = myWorld.CreateBody(&groundDef);
3. 创建Shape
b2PolygonShape groundShape;
groundShape.SetAsBox(50.0f, 10.0f);
4. 创建Fixture
ground->CreateFixture(&goundShape, 0.0f);
5. 创建Dynamic body
1)
b2BodyDef dBodyDef;
dBodyDef.type= b2_dynamicBody;
dBodyDef.position.Set(0.0f, 4.0f);
b2Body * dBody = world.CreateBody(&dBodyDef);
2)
b2PolygonShape dBodyShape;
dBodyShape.SetAsBox(1.0f,1.0f);
3)
b2FixtureDef fDef;
fDef.denisty = 1.0f;
fDef.shape = dBodyShape;
fDef.friction = 0.3f;
body->CreateFixture(&fDef);
流程: 创建body,规定它的位置和类型,默认是静态的。 ==》 创建Shape ,规定物体的外形 ==》 创建Fixture, 规定物体的粗糙,设定外形,重量
==》 用body 调用CreateFixture, 将Fixture 信息添加到body 上。
实际上,fixture 就包含了物体的大小,粗糙程度,质量等信息。 位置信息是在创建物体的时候定义的,不是在fixture 里面定义的。
创建物体==》创建fixture==》将fixture 添加到物体上。
6. go !
world.Step(timeStep, vCount, pCount);
timeStep: 走多少时间,一般最好是 1.0f/60.0f 最好。
vCount: 速度迭代次数,最好是8。
pCount 位置迭代次数,最好是3。
b2Vector position = body->GetPosition();
float32 angel = body->GetAngle();
Chapter 3 Common
Common 包括设定,常用值等。
chapter4 Collision Module
1. Circle shape
b2CircleShape c;
c.m_p.Set(0.0f, 0.0f);
c.m_radius = 5.0f;
2. Polygon Shape
b2Vec2 v[3];
v[0].Set(0.0f, 1.0f);
v[1].Set(1.2f, 3.0f);
v[2].Set(2.0f, 3.1f);
b2PolygonShape p;
p.Set(v, 3);
p.SetAsBox(w, h);
p.SetAsBox(w,h, center, radius);
3. Edge Shape
b2EgeShape e;
b2Vec2 v0(0.0f, 1.0f);
b2Vec2 v1(2.0f, 1.2f);
e.Set(v0,v1);
4. Chain Shape
b2Vec2 v[3];
v[0].Set(0.0f, 0.0f);
v[1].Set(1.2f, 2.0f);
v[2].Set(1.4f, 3.2f);
b2ChainShape chain;
chain.CreateChain(v,3);
获取Chain 里面的某一个 Edge
b2EdgeShape e;
chain.GetChildEdge(&e, 0);
补充:综合编程 , 其他综合 ,