施力无效后,受影响的身体已经静止了一段时间

ApplyForce ineffective after affected body has been still for a while

本文关键字:静止 一段时间 无效 影响 施力      更新时间:2023-10-16

我是第一次使用Box2D。我已经构建了一个简单的测试应用程序,它包括一个代表地面的静态物体和一个小的动态盒子,它落在地面上。然后我决定用力进行实验,分配一个键来引起一个向上的力施加在盒子上。它能像预期的那样工作,但前提是我要确保在盒子完全静止之前触发力。这种行为是意料之中的吗?

顺带一讲,动态箱体的主体、形状和夹具是这样定义的:

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.

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

谢谢。

Box2D,像大多数物理引擎一样,如果对象有一段时间没有移动,它会"让对象进入睡眠状态"。这节省了计算。如果你想让这个物体继续移动,你需要唤醒它。

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

ApplyForce的第三个参数告诉Box2D是否应该允许唤醒对象。您已经告诉Box2D不要唤醒对象。