box2d 学习笔记

转载自:http://blog.sina.com.cn/s/blog_4f52c70d0100sj49.html

几个对象:
世界--b2World:
创建世界,同时声明重力。在层的(id)init 函数中。
b2World* myWorld = new b2World(gravity, doSleep);
销毁世界,在层的(void)dealloc 函数中。
delete myWorld;
单步执行世界模拟
myWorld->Step(timeStep, velocityIterations, positionIterations);
第一个是时间间隔,通常我们使用 tick 凼数传入的参数 dt。后两个是是速度和位置迭代次数,这也是两个要根据游戏效果微 调的参数,大家可以修改这两个参数看看实际的体验。
遍历世界
body遍历
for (b2Body* b = myWorld->GetBodyList(); b; b = b->GetNext())
碰撞点
for (b2Contact* c = myWorld->GetContactList(); c; c = c->GetNext())
关节
for (b2Joint* j = myWorld->GetJointList(); j; j = j->GetNext())
查询几何矩形中包含的物体对象(检索世界)
光探索
坐标转换
b2Vec2 GetWorldPoint(const b2Vec2& localPoint);
b2Vec2 GetWorldVector(const b2Vec2& localVector);
b2Vec2 GetLocalPoint(const b2Vec2& worldPoint);
b2Vec2 GetLocalVector(const b2Vec2& worldVector);


物体对象--b2Body
 静态物体(b2_staticBody)。质量为 0,不可以移动,通常模拟我们游戏的物理边
界:大地、墙壁等。
平台物体(b2_kinematicBody)。按照固定路线运动的物体,比如说电梯,运动的
滚梯,运行的火车等等。
动态物体(b2_dynamicBody)。我们最常见的精灵对象对应的物体。
==========================================
关于物体-body,夹具-fixture,形状-shape三者的关系是比较难理解的,有这么一句话:将形状固定在物体身上的夹具,再看看代码是怎么样的:


//物体
b2Body *body = world->CreateBody(&bodyDef);


// 形状对象(Shape)
b2PolygonShape dynamicBox;
dynamicBox.SetAsBox(.5f, .5f);


//定义夹具,及夹具对应的形状
b2FixtureDef fixtureDef;
fixtureDef.shape = &dynamicBox;


//给物体上夹具
body->CreateFixture(& fixtureDef );


===========================================


三者的属性:
body:
类型(上述3种)
b2BodyDef bodyDef;
bodyDef.type = b2_dynamicBody;
位置
bodyDef.position.Set(p.x/PTM_RATIO, p.y/PTM_RATIO);
内部关键点(几何原点或者重心点)
是否旋转
bodyDef.fixedRotation = true;
用户数据(可以指向精灵)
bodyDef.userData = sprite;
最后在world中添加:
b2Body *body = world->CreateBody(&bodyDef);


Fixture:b2FixtureDef fixtureDef;
形状
fixtureDef.shape = &dynamicBox;
物理属性
fixtureDef.density = 1.0f; //密度
fixtureDef.friction = 0.3f; //摩擦力
碰撞标志
用户数据
是否探测
将 isSensor 设置为真时,任何物体与之碰撞都不会发生碰撞效果。利用返个属性,我们就可以利用 Box2D 引擎来进行没有物理效果模拟的任何游戏的碰撞探测。
最后和包裹上body
body->CreateFixture(& fixtureDef );
一个物体可以有多个夹具


Shape: b2PolygonShape shape;
官方的手册中明确 Shape 的价值是用于碰撞处理,完全可以独立于物理模拟来使用,主要是使用夹具对象的 “是否探测器(isSensor)”属性来实现。对于各类不需要物理引擎效果的游戏来说,返也是一种系统化的处理碰撞的方法,大家 可以进一步分析、探索。
类型:
圆形(b2CircleShape)
多边形(b2PolygonShape),可以是线和凸多边形。
A.线性边界:shape.SetAsEdge(b2Vec2(-20.0f, 0.0f), b2Vec2(20.0f,0.0f));
//实现 一条水平的横线来模拟大 地
B.一个矩形的方格:shape.SetAsBox(0.5f, 0.5f);//边长为 1.0,半长为 0.5.
C.含有多发的凸多边形。可以用VetextHelper来勾勒边
形状计算:
点是否在形状中
b2Transfrom transform;
transform.SetIdentity();
b2Vec2 point(5.0f, 2.0f);
bool hit = shape->TestPoint(transform, point);
光线探测
b2Transfrom transform;
transform.SetIdentity();
b2RayCastInput input;
input.p1.Set(0.0f, 0.0f, 0.0f);
input.p2.Set(1.0f, 0.0f, 0.0f);
input.maxFraction = 1.0f;
b2RayCastOutput output;
bool hit = shape->RayCast(&output, input, transform);
if (hit)
{
    b2Vec2 hitPoint = input.p1 + output.fraction * (input.p2 –input.p1);
}
距离测试
b2DistanceInput input;
input.proxyA.Set(&m_polygonA);
input.proxyB.Set(&m_polygonB);
input.transformA = m_transformA;
input.transformB = m_transformB;
input.useRadii = true;
b2SimplexCache cache;
cache.count = 0;
b2DistanceOutput output;
b2Distance(&output, &cache, &input);


m_debugDraw.DrawString(5, m_textLine, "distance = %g",output.distance);

posted on 2012-04-24 15:28  yang3wei  阅读(189)  评论(0编辑  收藏  举报