libgdx-带插值的固定时间步长-不带box2d

libgdx-带插值的固定时间步长-不带box2d,libgdx,physics,Libgdx,Physics,我在游戏中使用图形插值实现固定时间步长时遇到一些问题 以下是渲染方法的一部分: @Override public void render(float delta) { double newTime = TimeUtils.millis() / 1000.0; double frameTime = Math.min(newTime - currentTime, 0.25); accumulator += frameTime; currentTime = newTi

我在游戏中使用图形插值实现固定时间步长时遇到一些问题

以下是渲染方法的一部分:

@Override
public void render(float delta)
{
    double newTime = TimeUtils.millis() / 1000.0;
    double frameTime = Math.min(newTime - currentTime, 0.25);

    accumulator += frameTime;
    currentTime = newTime;

    while (accumulator >= step)
    {
        updateObjects(step);
        accumulator -= step;
    }

    double alpha = accumulator / step;

    interpolateObjects((float)alpha);
}
以下是更新对象:

for (int i = 0; i < world.level.gameObjects.size(); i++)
{
    GameObject go = world.level.gameObjects.get(i);
    go.prevPosition.set(go.position);//save previous position
    go.update(delta);
}
for (int i = 0; i < world.level.gameObjects.size(); i++)
{
    GameObject go = world.level.gameObjects.get(i);
    go.position.lerp(go.prevPosition, alpha);
}
for(inti=0;i
插值对象:

for (int i = 0; i < world.level.gameObjects.size(); i++)
{
    GameObject go = world.level.gameObjects.get(i);
    go.prevPosition.set(go.position);//save previous position
    go.update(delta);
}
for (int i = 0; i < world.level.gameObjects.size(); i++)
{
    GameObject go = world.level.gameObjects.get(i);
    go.position.lerp(go.prevPosition, alpha);
}
for(inti=0;i
然后使用位置渲染对象

据我所知,这应该行得通,但是不行。 在高fps(200-400)时,一切都太慢了,甚至看不到运动,我只能看到位置正在以0.0001或类似的速度变化

在低fps(10-20)下,运动是可见的,但物体还是非常缓慢

如果我禁用插值,那么一切都会正常工作(在任何fps上),但随后一切都会变得紧张


所以问题就出在插值的某个地方。

你的插值
go.position.lerp(go.prevPosition,alpha)
被设置为假设
prevPosition
最后一次更新是以
步长的精确倍数进行的,但是当你像这样更新
prevPosition
时,go.prevPosition.set(go.position)
在第一次更新框架时,您正在销毁该合同。看起来您正在向后移动(从位置到上一个位置)

我认为您需要第三个向量,以便保证最后一个插值不会影响固定时间更新。这里我将它称为
interposition
,它将用于绘图,而不是
position

实际上,从技术上讲,您似乎是在外推(而不是插值)该值,因为您没有提前更新,并且您的
alpha
是从累加器中剩余的时间计算出来的。如果要从计算的最后两个位置进行线性外推,可以这样做(注意要外推的
1+alpha
):

for(inti=0;i

根据模拟的速度(以及对象可以加速的速度),这看起来可能仍然不稳定。我认为一种更平滑但计算速度较慢的方法是使用
alpha
而不是步长来进行完全计算的更新,并将其存储在
interposition
向量中。但只有在必要时才这样做。

在高fps(400)上的效果与预期一样,但它看起来仍然不稳定,而不是线性插值/外推位置,您可以执行与
update()中相同的位置计算
但将其应用于
interposition
而不是
position
,并使用
alpha
作为增量时间,而不是
step
。然后可以考虑加速度和可能的碰撞。