正确地在Box2d中应用Force

时间:2014-11-17 14:18:56

标签: box2d

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

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

但我在这里遇到了严重的问题。因为我必须用恒定的时间步更新Box2d世界

  

我们也不喜欢改变的时间步骤。一个可变的时间步骤   产生可变结果,这使得调试变得困难。所以不要   将时间步长与帧速率联系起来(除非你真的,真的有   至)。 [see here]

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

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不是恒定的,我只在每个帧中施加一次力。因此,在不同时期,我使用相同的力以相同的时间间隔(世界步骤)。