游戏物理 - 摩擦(Game Physics - Friction)

2019-08-22 19:20发布

我很简单的问题是:我将如何实现摩擦? 没有我尝试似乎工作。

哦, 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";
    }

Answer 1:

摩擦是相反的速度的力。 如果你有力量,在所有交易,重力或电场或火箭发动机或一些更神秘的,只是增加计算速度次一些系数的总兵力多一个。 你可以得到看中,并其大小与转速成正比平方或立方,不同的效果。 然后计算速度和位置如常。

如果你不与部队和F = MA处理,但使用仅基于速度的简单的一种物理,这是在视频游戏中常见的,你需要逐渐降低该速度。 对于每个时间步长,计算new_velocity = 0.99 * current_velocity。 无论使用哪种系数给出放缓适量。 同样,你可以让幻想和涉及某种方式改变对象的减速的感觉平方速度。



Answer 2:

经常摩擦被认为是恒定的力量,考虑到两个表面之间的摩擦以恒定的法向力 ,这将减缓你的对象速度线性。 其他摩擦力如空气阻力往往也有线性和二次项。 如果你想两个表面之间的摩擦使用你可以做这样的:

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

我还包括质量就够F = m * a为加速度。 如果也有作用在物体上的其他力量这将是一个更复杂一点,因为如果物体已经停止移动它只会再次开始转动,如果剩余的力量超过了摩擦力。

顺便说一句,如果你想使之更正确的数字,你可以添加一个时间步长到模拟: vX += accelerationX * timeStep;x += vX * timeStep;



Answer 3:

如果umgFf=umg为公式表面摩擦力是恒定的,然后在一个F=ma也将是常数。 还因为a = deltaV/s那意味着速度等于加速度乘以时间( as=deltaV )。 这意味着,每一个时间间隔deltaV保持不变,如果Ff是一样的。 在速度的变化,只有当它是不动的(停止v=0 )。 所以我认为要做到这一点的最好办法是,以检测是否它的移动或不和应用的不断deltaV (在相反的方向)时,不适用其v达到零。



Answer 4:

摩擦是减慢您有任何移动物体上的力。 所以,你需要有一些像一个后台线程不断着眼于所有对象的速度,慢慢递减每个速度趋向于零。



文章来源: Game Physics - Friction
标签: java physics