我有一个身体,我想通过对它施加力来移动它。所以在每个帧更新事件中,我都像这样施加力:
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
以下是另一篇好文章:
- http://siondream.com/blog/games/fixing-your-timestep-in-libgdx-and-box2d/
- https://gamedev.stackexchange.com/questions/1589/fixed-time-step-vs-variable-time-step
- http://kirbysayshi.com/2013/09/24/interpolated-physics-rendering.html