【问题标题】:Frame rate independent gravity帧率独立重力
【发布时间】:2012-12-24 17:19:26
【问题描述】:

我遇到了重力随帧速率变化而严重变化的问题。当我以 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.........

    }

我认为实施 delta 可以防止玩家改变速度过快或过慢,但实际上它让情况变得更糟了一些。我认为这是因为随着帧之间的时间增加,速度的增加也会导致玩家异常快速地摔倒。这是因为随着 FPS 的增加,玩家会跳得更高、更高。有什么想法吗?

【问题讨论】:

    标签: java frame-rate gravity delta


    【解决方案1】:

    你的问题出在这一行:

    player.y += velocity;
    

    没有考虑到速度是“距离除以时间”。

    您正确地模拟了加速:

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

    但不是距离,对于足够小的delta 来说是:

    delta_s = v * delta_t
    

    您需要将velocity 乘以delta,然后再将其添加到该位置。

    【讨论】:

      【解决方案2】:

      您没有正确建模物理。假设 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,然后又是在计算新的垂直位置。

      【讨论】:

      • 谢谢!这与 Alnitak 的帖子相同,但并不那么清楚。仍然是一个很好的答案,所以 +1!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-03
      • 1970-01-01
      • 2011-10-17
      • 2017-04-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多