我正在尝试使此Vector3在正确的位置加速,在不正确的时候减速。这是我的更新方法。为什么不加速?它具有恒定的速度。我知道您可以在vel.x的左侧添加-5,在vel.x的右侧添加+5,然后在Vector3为0时将其停止,但是我正在尝试使其工作。我真的不明白我在做什么错。

在该类中,我声明了两个update(在中使用)

    public void update(float delta) {
        timePassed += Gdx.graphics.getDeltaTime(); //irrelevant

        if (pos.x > Kiwi.WIDTH / 2)
            vel.add(-5, 0, 0);

        vel.x *= 0.8f;

        vel.scl(delta);
        pos.add(vel.x, 0, 0);
        vel.scl(1 / delta);
    }

最佳答案

新答案

public void update(float delta) {
    if (pos.x > Kiwi.WIDTH / 2)
        vel.add(-5, 0, 0);
    vel.x *= 0.8f;
    vel.scl(delta);
    pos.add(vel.x, 0, 0);
    vel.scl(1 / delta);
}


每隔一帧调用一次update方法。因此,上面的代码会导致每帧速度降低20%,这意味着如果您具有60FPS,则当您到达帧的左半部分时,您会在一秒钟内将速度降低为0.8^60 = 1.eE-6或几乎为零。屏幕。

您还想在正确的地方加速...向哪个方向加速?您现在正在做的是,如果位置在屏幕的右半边,则它会加速到左半边,这意味着一旦您到达右半边,它就会移回左半边!将-5更改为+5,然后它会飞走,因为您将速度提高了5*60=300 px/s^2。您需要按时间增量来缩放加速度。

同样,您还需要按时间增量来缩放减速度。除以delta(1/delta)也没有任何意义,因此请尝试以下操作:

public void update(float delta) {
    if (pos.x > Kiwi.WIDTH / 2)
        vel.add(5*delta, 0, 0); // Acceleration is now 5 px/s^2 to the right
    vel.x -= vel.x*0.2f*delta; // Decay speed by 20% every second
    pos.add(vel.x*delta, 0, 0); // Move position by speed.
}


下面的旧答案

没有更多的代码可以做,我所能做的就是向您展示在一般情况下进行计算的正确方法。

如果要使用欧拉方法求解运动ODE,请执行以下操作:

// Object state
speed = ...; // Unit is [m/s]
position = ...; // Unit is [m]


// Inputs
frameDelta = ...; // Unit is [s]
acceleration = ...; // Unit is [m/s^2]

// Update step
speed += acceleration * frameDelta; // Unit [m/s^2 * s] = [m/s];
position += speed * frameDelta; // Unit [m/s * s] = [m]


如果您希望速度“衰减”,则可以通过添加适当的减速度来实现(或将阻力/风阻/摩擦力更改为您想要的速度):

decayRate = ...; // Unit is [m/(m*s^2) = 1/s^2] ((de)acceleration per meter)
acceleration -= speed * decayRate * frameDelta; // Unit is [m/s*1/s^2*s = m/s]


注意:您不存储加速度,而是从其他输入(键盘,鼠标,力,碰撞等)中计算出每一帧的加速度。

注意2:欧拉方法是最简单的求解器,可用于根据加速度计算位置和速度。它带有一些问题,它不如Runge-Kutta那样准确,并且还可能出现振荡方面的稳定性问题。

您知道当您看到某些东西卡在游戏中时会发疯一样疯狂吗?是的,这可能是欧拉的方法变得不稳定。

关于java - Vector3的加速逻辑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40042639/

10-13 00:08