Box2D 物理引擎---创建一个简单的模拟物理世界

Box2D 物理引擎---创建一个简单的模拟物理世界,第1张

概述效果展示: 首先:我们进行名词解释: b2BodyDef 确定位置 包括旋转角度   以及userData     b2BodyDef bodyDef;     bodyDef.type = b2_dynamicBody; //设置动态类型     bodyDef.position = b2Vec2(3, 6);//设置位置,单位为米     b2Body *body = world->Creat

效果展示:


首先:我们进行名词解释:

b2BodyDef 确定位置 包括旋转角度以及userData

b2BodyDef bodyDef;

bodyDef.type = b2_dynamicBody; //设置动态类型

bodyDef.position = b2Vec2(3,6);//设置位置,单位为米

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

body->SetUserData(ss);

b2polygonShape和b2CircleShape 作为隐形的形状包括宽高

b2polygonShape shape;

shape.SetAsBox(0.5,0.5);//单位是m


b2FixtureDef是材料,用来设定密度质量恢复力等

b2FixtureDef fixtureDef;

fixtureDef.density =1;//设置密度

fixtureDef.friction = 0.3;//设置摩擦力

fixtureDef.shape = &shape;//设置形状

body->CreateFixture(&fixtureDef);

最后由world->CreateBody(&bodyDef);在世界里创建 b2Body

最后通过body->CreateFixture(&fixtureDef);将以及定形的材料加进body中

b2polygonShape是隐形的形状通过FixtureDef将其形状做出来(它只是一部分),还要组装b2doy ,





1。初始化物理世界:


voID HelloWorld::initWorld(){    world = new b2World(b2Vec2(0,-8));//初始化重力环境}

2.添加精灵,然后把精灵和世界进行绑定:


voID HelloWorld::initSprite(){    //先创建一个精灵:    auto ss = Sprite::create("Closenormal.png");    this->addChild(ss);    ss->setScale(3,3);            //用来确定物体的位置,类型(动态。静态);    b2BodyDef bodyDef;    bodyDef.type = b2_dynamicBody;    bodyDef.position = b2Vec2(5,6);    b2Body *body = world->CreateBody(&bodyDef);        //指定精灵的形状,这个步骤不能省略,    b2polygonShape shape;    shape.SetAsBox(ss->getContentSize().wIDth/RATIO,ss->getContentSize().height/RATIO);//单位是m        //材料,用来设置物体的属性(质量,密度,摩擦力,形状,)    b2FixtureDef fixtureDef;    fixtureDef.density =1;    fixtureDef.friction = 0.3;    fixtureDef.shape = &shape; //如果形状为0的话,这个属性是必须的。    body->CreateFixture(&fixtureDef);        body->SetUserData(ss);//物体和世界关联代码:}


3,对世界中的物体进行实时更新:

voID HelloWorld::myupdata(float dt){    world->Step(dt,8,3);    Sprite * bird;    //对于动态的物体,我们要实时的更新它的位置和状态。静态的就不用判断了。    for (b2Body *body = world->GetbodyList(); body; body = body->GetNext()) {        if (body->GetType() == b2_dynamicBody) {            bird = (Sprite*)body->GetUserData();            bird->setposition(Vec2(body->Getposition().x*RATIO,body->Getposition().y*RATIO));//设置动态物体的位置                                }    }}


4.上面步骤只是创建了一个可以按照自由落体运动的物体,我们还需要给世界一个边界

voID HelloWorld::initGround(){        //地板的位置和类型,(静态)    b2BodyDef bodyDef;    bodyDef.type = b2_staticBody;    bodyDef.position = b2Vec2(0,0.1);    b2Body *body = world->CreateBody(&bodyDef);            //指定形状,这一步骤必须有    b2polygonShape groundShape;    groundShape.SetAsBox(960/RATIO,0.5);    b2FixtureDef fixture;    fixture.density = 1;//密度    fixture.friction = 0.3;//摩擦力    fixture.restitution = 0.8;    fixture.shape = &groundShape;        body->CreateFixture(&fixture);        //设置地板,这里用的是精灵,图片可以自己设定,也可以用UI 进行绘图:    Sprite *sp = Sprite::create("HelloWorld.png");    sp->setAnchorPoint(Vec2(0,0));    sp->setposition(Vec2(0,0));    sp->setScale(3,0.1);    this->addChild(sp);    body->SetUserData(sp);}


这样。我们的一个简单的Box模拟物理世界就创建成功了。。。

总结

以上是内存溢出为你收集整理的Box2D 物理引擎---创建一个简单的模拟物理世界全部内容,希望文章能够帮你解决Box2D 物理引擎---创建一个简单的模拟物理世界所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1073594.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存