在 Box2d 中正确施加力

  • 本文关键字:施加力 Box2d box2d
  • 更新时间 :
  • 英文 :


我有一个身体,我想通过对它施加力来移动它。所以在每个帧更新事件中,我都像这样施加力:

body->ApplyForceToCenter(100 * body->GetMass() * b2Vec2(vel.x, vel.y), true);

但我这里有一个严重的问题。因为我必须以恒定的时间步长更新Box2d世界

我们也不喜欢改变太多的时间步长。可变时间步长 产生可变的结果,这使得调试变得困难。所以不要 将时间步长与您的帧速率联系起来(除非您真的拥有 到)。[看这里]

我写了这段代码来更新物理世界:

void Box2dManager::update(float dt)
{
    static const double step = 1.0/60.0;
    static double accumulator = 0.0;
    // TODO check do we need this?
    // max frame time to avoid spiral of death
    if ( dt > 0.25 )
        dt = 0.25;
    accumulator += dt;
    while (accumulator >= step)
    {
        m_world.Step(step, VELOCITY_ITERATIONS, POSITION_ITERATIONS);
        accumulator -= step;
    }
}

结果是,当我使用偷偷摸摸的操纵杆向不同方向施加力时,身体的运动变得不稳定,无论它移动得慢还是快。当我按帧速率的时间步长更新世界时(dt函数参数),只有这样,运动才会变得平稳。我们该如何解释呢?我们如何解决这个问题?

同样在这里,这不仅是移动波涛汹涌的问题,而且还有另一个问题,因为实际上我没有施加恒定的力,因为 FPS 不是恒定的,而且我只在每一帧中施加一次力。因此,在不同的时间段,我以相同的时间间隔(世界步长)施加相同的力。

我想有两种解决方案,要么我们应该像1 / 300.0这样的小步骤,要么我们应该像这样做一些平滑:http://www.unagames.com/blog/daniele/2010/06/fixed-time-step-implementation-box2d

以下是另一篇好文章:

  1. http://siondream.com/blog/games/fixing-your-timestep-in-libgdx-and-box2d/
  2. https://gamedev.stackexchange.com/questions/1589/fixed-time-step-vs-variable-time-step
  3. http://kirbysayshi.com/2013/09/24/interpolated-physics-rendering.html

最新更新