已知目的地的重力轨迹

时间:2014-06-04 12:16:56

标签: libgdx 2d

我花了几天时间试图解决这个问题而且我要发疯了。非常感谢您的帮助。

我在libgdx中使用2D阶段。我想通过" gravity"将演员(或精灵)移动到这个舞台。显示效果:例如对于actor1,他的初始坐标是(0,0),目标坐标是(100,50),我想用重力轨迹效果将这个actor移动到这个目的地。然后我想对actor2使用相同的引力从(0,0)移动到(25,75),然后将actor3从(0,0)移动到(200,75)等。

我设法根据这个众所周知的循环将重力轨迹应用于任何演员:

setX(getX() + velocity.x);
setY(getY() + velocity.y);
velocity.y += getGravity().y * delta;

因此调整重力值会改变轨迹。它工作正常。 现在,正如我先前所说的那样,我想给每个演员一个给定预定目的地的独特轨迹。

所以我试图找到一个公式来确定每个行为者在每个轨迹上的x和y 我使用以下静态参数:

gravity.y:所有演员都一样 延迟:每个演员在其初始坐标和目标坐标之间移动的帧数。所有演员的价值也相同

首先,我用这个SUPER UGLY公式来计算速度,我绝对不为此感到自豪:

velocity = new Vector2 ( (destinationx - b.getX() )/time,  initdisty/time + ( Math.sqrt(delta*1000)*time / ( 500/Math.abs(gravity) ) ));

其中delta = Gdx.graphics.getDeltaTime();

然后我每帧应用这个速度来计算每个演员的x和y:

public void act(float delta){
for (int i=0; i<delay; i++) {
setX(getX() + velocity.x);
setY(getY() + velocity.y);
velocity.y += gravity.y * delta;
}
}

它是一种有用的工作,但当然,这不是一个长期可靠的解决方案。为每个演员计算每个帧的x和y(可能有5-6个演员同时移动)看起来并不好看。 主要的问题是在具有一致的60FPS的计算机上轨迹是好的,它们在平板电脑上是可以的,但是在具有有限存储器且30&lt; fps&lt; 60,轨迹变得非常错误。

在阅读了几篇博文之后,似乎我可以通过从公式中删除delta参数来避免多设备内存fps问题,但我还没有找到方法。它仍然没有给我一个强大的长期解决方案来计算预定目标坐标的轨迹。

感谢阅读和您的时间,如果不清楚,请告诉我,我会尽力解释。

1 个答案:

答案 0 :(得分:2)

问题原因

维持位置和速度会导致系统离散化,从而导致量化误差。因此,当fps波动时,您将通过当前方法遇到不一致的行为。


解决方案

您只需要将状态变量的数量减少到两个,即不存储当前速度。它导致了最终位置的错误。

代替使用轨迹的参数形式。

  

v = u + at

  

s = ut +½at²


实施

假设您想要及时(totalX)从(sourceX,sourceY)到(targetX,targetY)。

  • 计算初始速度。

    Vector2 initialVelocity = new Vector2((targetX - sourceX) / totalTime,
                (targetY - sourceY) / totalTime - gravity * totalTime / 2);
    float currentTime = 0;
    
  • 在每次迭代中,直接计算位置并跟踪当前时间。

    public void act(float delta){
        if (currentTime < totalTime) {
            currentTime += delta;
    
            setX((initialVelocity.x + gravity.x * currentTime / 2) * currentTime);
            setY((initialVelocity.y + gravity.y * currentTime / 2) * currentTime);
        } else {
            setX(targetX);
            setY(targetY);
        }
    }