我正在尝试使此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/