ApplyForce 无效后受影响 body 已经静止了一段时间

ApplyForce ineffective after affected body has been still for a while

我是第一次玩Box2D。我构建了一个简单的测试应用程序,其中包含一个代表地面的静态 body 和一个小的动态盒子,它落在前者上。然后我决定用力进行试验,分配一个键来对盒子施加向上的力。它按预期工作,但前提是我确保在盒子完全静止一段时间之前触发力。这种行为是预期的吗?

FWIW,动态框的 body、形状和夹具是如何定义的:

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);

其中:

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

谢谢。

Box2D 与大多数物理引擎一样,如果一段时间不移动,它们将 "put objects to sleep"。这样可以节省计算。如果你想让它继续移动,你需要唤醒它。

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

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