重力方程-速度方程|为什么它只适用于某些FPS



这些方程的跳跃大小随着每秒更新量的减少而减小。Δ值乘以重力和跳跃速度力减少的量,以及每次迭代所用的时间加上Δ(Δ值是自上次更新以来经过的毫秒数),人们会认为它会很好地工作。

//d is delta
...
if(isFalling||isJumping){
elapsedTime +=d;
//the elapsed time is the total amount of time passed since one started jumping,
//so that's logical to add the amount of time since last update.
long tesquared = (long) Math.pow(elapsedTime, 2);
//amount of time elapsed squared.
jumpSpeed+=-0.0000005*elapsedTime*d;
//this is the amount that jumpspeed is taken down by every time. 
if(jumpSpeed > 0){
isJumping = true;
} else {
isJumping = false;
}
double fGravity = 0.0000001*tesquared*d;
// this is the equation for gravity, the amount that the player goes down
yRend += jumpSpeed - fGravity;
//the amount it goes up, minus the amount it goes down.
xRend -= strafeSpeed;
oldyRend = yRend;
}

要开始跳跃,可以添加任意数量的jumpSpeed。

问题是,当每秒更新的数量减少时,跳跃的持续时间和幅度都会减少。我很确定这里的delta值是好的,这意味着问题一定在方程本身。

我认为当delta较大时,fGravity会更快地超过jumpSpeed

所以我的问题。如果问题真的存在于方程本身,那么对球员的向上力减去以外的向下重力进行建模的正确方法是什么

jumpSpeed+=-0.0000005*elapsedTime*d;

double fGravity = 0.0000001*tesquared*d;

如果问题在于没有正确应用delta值,那么应用它的正确方法是什么?

玩家没有"向上的力"(除了在他们跳跃的那一点)。力赋予动量,产生速度。一旦进入空中,它们确实会感觉到向下的力(即重力),这会导致它们减速,最终产生负速度,使它们返回地面。

如果玩家开始以速度u向上跳跃,那么在该跳跃开始后的时间t,用于计算位置的经典方程是y = ut + 0.5 * at^2

在这种情况下,a是重力(如果y为"向上",则为负),给出y = u * t - 0.5 * g * t ^ 2

基本上跳跃的方程式如下:

重力垂直施加并产生恒定的向下力。垂直速度是vy=vy0-经过时间*g,g是重力常数,vy0是跳跃开始时的初始速度。

你不必计算经过的时间。只需在每一帧上执行以下操作:

vy -= g * dt; // dt is the elapsed time since last frame
y += vy * dt;
x += vx * dt; // vx doesn't change in the jump

相关内容

最新更新