在受影响的身体已经存在一段时间后,ApplyForce无效

时间:2016-10-03 03:36:08

标签: c++ box2d

我第一次玩Box2D。我已经构建了一个简单的测试应用程序,它由一个代表地面的静态物体和一个小的,动态的盒子组成,它落在前者上。然后,我决定尝试使用力,指定一个键,使向上的力被施加到盒子上。它按预期工作,但只有当我确保在盒子完全静止之前触发力时才会出现这种情况。预期会出现这种情况吗?

FWIW,这里是如何定义动态框的正文,形状和夹具:

b2BodyDef body_def;
body_def.type = b2_dynamicBody;
body_def.position.Set(position.x, position.y);
body = world.CreateBody(&body_def);

b2PolygonShape shape;
shape.SetAsBox(size.width / 2.0f, size.height / 2.0f);

b2FixtureDef fixture_def;
fixture_def.shape = &shape;
fixture_def.density = 1.0f;
fixture_def.friction = 0.3f;

这是应用向上力量的代码:

b2Body* body = box.b2_body();
body->ApplyForce(b2Vec2(0.0f, 15.0f), body->GetPosition(), false);

这是模拟步骤:

world.Step(time_step, velocity_iterations, position_iterations);

其中:

  • time_step是1/60
  • velocity_iterations是6;和
  • position_iterations是2。

如果需要进一步的信息,请告诉我。

谢谢。

1 个答案:

答案 0 :(得分:2)

像大多数物理引擎一样,Box2D如果不移动一段时间,会“让物体进入睡眠状态”。这节省了计算。如果您希望它继续移动,您需要唤醒该对象。

body->ApplyForce(b2Vec2(0.0f, 15.0f), body->GetPosition(), false);

ApplyForce的第三个参数告诉Box2D是否应该允许它唤醒对象。你告诉Box2D不要唤醒对象。将此参数更改为true。