Box2D如何将重力应用于特定物体?

4

我看到很多人说在Box2D世界中添加重力的方法如下:

b2Vec2 gravity = b2Vec2(0.0f, -10.0f);
bool doSleep = false;
world = new b2World(gravity, doSleep);

问题是,如果我只想让一个包含CCSprite userData的特定b2Body受到重力影响怎么办?据我所知,这将使世界中的所有东西都受到重力影响,而我不希望如此。因此,有人能向我解释一下如何仅将此重力应用于特定的b2Body吗?

谢谢!

编辑1: 我可以只做这一行吗?

_bottomBody->ApplyForce(gravity, _bottomBody->GetPosition());

与其使用 world = new b2World... 等等,是否可以只在那个 b2Body 上使用重力?

1个回答

4

只需在每一帧对特定的b2Body施加力/冲量即可模拟重力。

// a procedure called every frame
void Application::on_update_world(double t)
{
  m_body_with_custom_gravity->applyForce(CUSTOM_GRAVITY * m_body_with_custom_gravity->getMass());

  m_phys_world->Step(t, VEL_ITERATIONS, POS_ITERATIONS);
}

一个与你问题紧密相关的线程:如何在Box2D身体上施加恒定的力?


怎么做呢?我只想使用上面的方法,有没有办法修改我的代码,只适用于一个对象? - SimplyKiwi
1
你的应用程序无疑有一个框架循环,即一个过程/方法,在其中调用b2World::step()。在这个过程中,你需要为指定的物体调用applyForce方法。请看这个答案中的代码示例。 - Dmitry Sapelnikov
我的应用程序没有帧循环。我的应用程序是Box2d与Cocos2d混合使用,同时也混合了Obj C。我只是使用了一个Cocos2D游戏循环,它会在每一秒钟被调用一次,这意味着当视图更新时。如果那段代码适用于我,请查看我原始帖子中的编辑1。 - SimplyKiwi
你的引擎在哪里调用b2World::Step()方法?这是向身体施加力的正确位置。请注意,为了正确模拟,自定义的重力力必须在每次调用b2World::Step()方法之前应用于物体。 - Dmitry Sapelnikov
box2d引擎在b2World::Step()方法结束时会重置应用于物体的所有力,因此自定义的重力力必须在每次调用b2World::Step()方法之前重新应用于物体。 - Dmitry Sapelnikov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接