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
。然后可以考虑加速度和可能的碰撞。