游戏物理 - 摩擦

时间:2013-04-13 16:41:27

标签: java physics

我非常简单的问题是:我将如何实施摩擦?我尝试的任何东西似乎都没有用。

哦,speedX = 1。

这是我的代码:

public void update() {
    x += velocityX;
}

public void keyPressed(KeyEvent e) {
    int key = e.getKeyCode();

    if (key == KeyEvent.VK_RIGHT)
        vx = xSpeed;

    if (key == KeyEvent.VK_LEFT)
        vx = -xSpeed;
}

public void KeyReleased(KeyEvent e) {
    int key = e.getKeyCode();

    if (key == KeyEvent.VK_RIGHT)
        vx = 0;

    if (key == KeyEvent.VK_LEFT)
        vx = 0;
}

编辑:

现在,一旦玩家停止,他就会减速(这很好),但他并没有完全停止。

if (key == KeyEvent.VK_RIGHT) {
        vx = 0.20 * vx;

        if (vx < 0.2)
            vx = 0;

        playerAction = "still";
    }

5 个答案:

答案 0 :(得分:1)

摩擦是与速度相反的力。如果你正在处理力量,重力或电场或火箭发动机或更神秘的东西,只需加上一个总力,一个计算为速度乘以某个系数。对于不同的效果,您可以获得幻想并使其幅度与平方或立方的速度成比例。然后像往常一样计算速度和位置。

如果你没有处理力和F = ma,而是使用仅基于速度的简单物理,这在视频游戏中很常见,你需要逐渐降低速度。对于每个时间步,计算new_velocity = 0.99 * current_velocity。使用任何系数给出适当的减速量。再一次,你可以得到幻想,并以某种方式参与速度平方来改变物体减速的感觉。

答案 1 :(得分:1)

考虑到具有constant normal force的两个表面之间的摩擦力,通常假设摩擦是恒定的力,这会使物体的速度线性减慢。其他摩擦力如空气阻力通常也具有线性和二次项。 如果你想在两个表面之间使用摩擦,你可以这样做:

if (vx > 0) vx += -friction / mass;
if (vx < 0) vx +=  friction / mass;

我还将质量加到F = m * a来加速。如果还有其他力作用在物体上,那将会有点复杂,因为如果物体停止移动,它只会在剩余力超过摩擦力时再次开始移动。

顺便说一下,如果您想让数字更正确,可以在模拟中添加时间步长:vX += accelerationX * timeStep;x += vX * timeStep;

答案 2 :(得分:1)

我曾担任游戏 AI 工程师。这通常涉及制作游戏玩法和物理。我最近不得不自己回答这个问题。这就是我发现这个的原因。这是我的解决方案。我的问题可能与您的略有不同,但我面临的挑战是无论我使用什么帧率都让它工作。这是我的解决方案:

speed -= (speed * (1 - friction)) / fps;

摩擦力总是介于 0 和 1 之间的浮点数,1 表示没有摩擦力,而 0 基本上是无限摩擦力。这可确保与每秒帧数成比例地施加适量的摩擦。

答案 3 :(得分:0)

如果表面摩擦力的公式为umg Ff=umg,那么F=ma中的a = deltaV/s也是一个常数。同样因为as=deltaV意味着速度等于加速时间(deltaV)。这意味着,如果Ff相同,则v=0对于每个时间间隔保持不变。速度变化仅在不移动时停止(deltaV)。所以我认为最好的方法是检测它是否正在移动并应用常量v(针对相反的方向),并在{{1}}达到零时不应用它。

答案 4 :(得分:-1)

摩擦是一种减慢你移动的物体的力量。所以你需要有一个像后台线程一样的东西,它不断地查看你所有物体的速度,然后慢慢地将每个速度减少到零。