簡體   English   中英

幀頻獨立重力

[英]Frame rate independent gravity

我遇到一個問題,重力隨幀頻變化而變化很大。 當我以160 fps的速度運行時,我的播放器在空中跳了幾米然后摔倒了,但是以10 fps的速度,我的播放器跳了半米然后摔倒了。 我的重力代碼如下:

public void fall(long delta) {
    float increase = acceleration * ((delta) / 1000000000); //changes delta time (nanoseconds) to seconds
    if(player.y + velocity + increase < -1.15f) {
        if(velocity + inc < terminal_velocity) {
            velocity += inc;
        }
        player.y += velocity;
    }else{
        player.y = -1.15f;
        velocity = 0;
    }
}

我稱之為:

while(!close_request) {
        now = getTime();
        int delta = getDelta(now);

        player.fall(delta);

        ........other functions.........

    }

我認為實現增量會使玩家改變速度的速度過快或過慢,但實際上會使情況變得更糟。 我認為這是由於以下事實:隨着幀之間的時間增加,速度的增加也隨之增加,這導致播放器異常快速下降。 這是由於隨着FPS的增加,玩家跳得更高,更高。 有任何想法嗎?

您的問題在這一行:

player.y += velocity;

這沒有考慮到速度是“距離除以時間”。

您正在正確地建模加速:

v = u + a * t   // v = current velocity, a = acceleration, t = time

但不是距離,對於足夠小的delta ,它是:

delta_s = v * delta_t

在將velocity添加到位置之前,需要將velocity乘以delta

您沒有正確地建立物理模型。 假設dt足夠小,這將提供“足夠好”的近似值。

curV     // current velocity
accel    // global acceleration constant
terminal // terminal velocity for object
dt       // delta time in seconds

fall(dt):
    deltaV = accel * dt                  // Change in velocity in a vacuum
    newV = curV + deltaV                 // New velocity 
    if (newV < terminal) newV = terminal // Don't exceed downwards terminal velocity
    y = y + dt * (curV+newV)/2           // New position
    curV = newV                          // Save new velocity as current

它忽略了復雜性,例如當您接近最終速度時加速度降低。 與您之間最大的不同是dt出現了兩次 ,一次是在計算deltaV ,一次是在計算新的垂直位置時。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM