Java 带精灵运动的线性插值-添加“摩擦力”?

Java 带精灵运动的线性插值-添加“摩擦力”?,java,game-physics,sfml,Java,Game Physics,Sfml,我有一段代码,在精灵运动中使用线性插值: public void update(float dt) { vx += (targetX - vx) * dt; vy += (targetY - vy) * dt; x += vx * dt; y += vy * dt; playerSprite.setPosition(x, y); // other stuff, not related to the problem } public static

我有一段代码,在精灵运动中使用线性插值:

public void update(float dt) {

    vx += (targetX - vx) * dt;
    vy += (targetY - vy) * dt;
    x += vx * dt;
    y += vy * dt;
    playerSprite.setPosition(x, y);
    // other stuff, not related to the problem
}

public static void moveUp() {
    targetY = -moveSpeed;
}

public static void moveDown() {
    targetY = moveSpeed;
}

public static void moveLeft() {
    targetX = -moveSpeed;
}

public static void moveRight() {
    targetX  = moveSpeed;
}
targetX和targetY是精灵应该去的地方

vx和vy是精灵当前速度的变量,均初始化为0

dt是自上次更新屏幕以来的帧时间差

moveSpeed初始化为150

运动是平稳的,这就是我想要的,然而,精灵从来没有它的速度澄清:速度的绝对值减慢。所以,我永远无法让精灵停止移动,如果我只是按一个移动键让它移动,它就会继续移动。
在我目前的情况下,我将如何实现摩擦力?

我不确定您使用的单位和坐标系,因此我将提供一个简单的示例

在下面的Java源代码中,我从二维空间或平面中的位置10开始。精灵的当前速度为0.0,15.0表示每个时间段,速度以距离除以时间(如英尺/秒)表示,精灵将在X方向移动0个单位,在Y方向移动15个单位

下面的循环是一个简单的重新计算,其中每次通过循环表示一定的时间量,在循环的底部,计算在给定速度下的时间段内行驶的距离的新值。我们还通过修改速度来减慢对象的速度

我将其打印为数据点的逗号分隔值列表,这样我就可以将序列拉入Excel并用图形表示这些值。当我用一个简单的折线图绘制Y位置值时,我看到的是Y位置在开始时有很大的变化,并且有一条很好的位置值曲线,它显示每个时间段移动的距离越来越小,直到速度为零时达到其最终值

public static void main(String[] args) {
    // TODO Auto-generated method stub

    int i;

    double  dVelocityX = 0.0;
    double  dVelocityY = 15.0;
    double  dFriction  = 0.90;    // simple friction coefficient, 1.0 means no friction

    int     xStart = 10;
    int     yStart = 10;

    System.out.print(" i,xStart,yStart,dVelocityX,dVelocityY\n");
    for (i = 0; i < 60; i++) {
        System.out.print(i+"," + xStart + "," + yStart+"," + dVelocityX + "," + dVelocityY + "\n");
        xStart += dVelocityX;
        yStart += dVelocityY;
        dVelocityX *= dFriction;
        dVelocityY *= dFriction;
    }
}
然后,如果你把摩擦力从1.0,也就是说没有摩擦力,改为0.90,你会发现冰球在移动的过程中会减速,所以在14秒的时间里,它的移动不会像在没有摩擦力的宇宙中那样远

 i,xStart,yStart,dVelocityX,dVelocityY
0,10,10,0.0,15.0
1,10,25,0.0,13.5
2,10,38,0.0,12.15
3,10,50,0.0,10.935
4,10,60,0.0,9.8415
5,10,69,0.0,8.85735
6,10,77,0.0,7.971615000000001
7,10,84,0.0,7.174453500000001
8,10,91,0.0,6.457008150000001
9,10,97,0.0,5.811307335000001
10,10,102,0.0,5.230176601500001
11,10,107,0.0,4.707158941350001
12,10,111,0.0,4.236443047215001
13,10,115,0.0,3.8127987424935013
14,10,118,0.0,3.4315188682441513
现在,如果你改变测量单位,在计算位置时使用更精细的分辨率,比如说使用微米而不是毫米,在时间上使用更精细的分辨率,比如使用百分之一秒而不是秒,那么更小的位置差异将变得更明显。因此,您可能必须使用宇宙的尺度来确定用于模拟的单位


对于诸如移动精灵之类的动画,当您向用户呈现一系列帧或图像时,您必须选择一个时间段,在该时间段内,移动的动画相当平滑,在这些帧或图像中,精灵的位置只需在帧与帧之间进行一次触摸即可改变。精灵移动越快,帧显示速率必须越快,才能提供平滑的运动。

您需要以一系列增量或差值重新计算速度,每次重新计算时速度都会减小。看到了吗?这类似于使用惯性体模拟来实现带摩擦和制动的flick滚动,减缓显示数据的滚动。我可以在代码中看到这一点吗?我不太明白@RichardChambers请用注释更新问题中的源代码示例,以指示变量代表什么以及度量单位。完成@理查德钱伯斯
 i,xStart,yStart,dVelocityX,dVelocityY
0,10,10,0.0,15.0
1,10,25,0.0,13.5
2,10,38,0.0,12.15
3,10,50,0.0,10.935
4,10,60,0.0,9.8415
5,10,69,0.0,8.85735
6,10,77,0.0,7.971615000000001
7,10,84,0.0,7.174453500000001
8,10,91,0.0,6.457008150000001
9,10,97,0.0,5.811307335000001
10,10,102,0.0,5.230176601500001
11,10,107,0.0,4.707158941350001
12,10,111,0.0,4.236443047215001
13,10,115,0.0,3.8127987424935013
14,10,118,0.0,3.4315188682441513