Java 矢量加速逻辑3

Java 矢量加速逻辑3,java,libgdx,logic,game-physics,Java,Libgdx,Logic,Game Physics,我试图让这个向量3在向右时加速,在不向右时减速。这是我的更新方法。为什么它不加速?它有一个恒定的速度。我知道你可以在vel.x左边加-5,右边加+5,然后在vel.x为0时停止,但我正在努力实现这一点。我真的不明白我做错了什么 在类中,我声明了两个Vector3s(用于update) 新答案 每帧调用一次update方法。因此,上面的代码会使每帧的速度降低20%,这意味着如果你的速度为60FPS,那么当你在屏幕的左半部分时,你会在一秒钟内将速度降低到0.8^60=1.eE-6或几乎为零 你还想加

我试图让这个向量3在向右时加速,在不向右时减速。这是我的更新方法。为什么它不加速?它有一个恒定的速度。我知道你可以在
vel.x
左边加-5,右边加+5,然后在
vel.x
为0时停止,但我正在努力实现这一点。我真的不明白我做错了什么

在类中,我声明了两个
Vector3
s(用于
update

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

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

此外,您还需要按时间增量来缩放减速。除以增量(
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.
}
下面是老答案 如果没有更多的代码,我所能做的就是向您展示在一般情况下进行计算的正确方法

如果要使用Euler方法求解运动常微分方程,请按以下方式执行:

// 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] 
如果您希望速度“衰减”,可以通过添加适当的减速(或阻力/风阻/摩擦力,无论您如何称呼它):

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

注2:Euler的方法是最简单的解算器,可用于根据加速度计算位置和速度。它会带来一些问题,它不像龙格库塔那个样精确,而且它也会表现出一些振荡的稳定性问题


你知道当你看到某个东西被困在游戏中时,它会像疯了一样颤抖吗?是的,这可能是Euler的方法变得不稳定了。

我只想要
vel.add(-5,0,0)if
中选择code>。没有别的了。当它在左边时,我希望它再次减速。你还需要什么样的背景?这是该屏幕atm的全部更新方法。当
矢量
在屏幕的右半部分时,我希望它加速,否则减速。我说得通吗?如果我没有,请告诉我。如果我删除
velx*=0.8f它会按预期加速,但显然在到达屏幕中间后不会减速,它会以恒定的速度继续。抱歉,花了这么长时间。我非常感谢你的帮助。我更新了我的问题并包含了完整的更新方法。它现在的样子应该会让它加速,对吧?请注意,
ACC
等于-3。很抱歉不清楚。第一次编辑是我在阅读您的答案后将更新方法更改为的内容。现在,我从一开始就包含了更新方法。在我的代码中,我使用了tutorialVel和tutorialPos,但为了便于理解,我在这里分别将其更改为vel和pos。在这里发布时,我忘记了将单个tutorialVel.x错误地编辑为vel.x。感谢您花时间帮助我。我想我现在解决了。
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.
}
// 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]