【问题标题】:Modifying multiplying calculation to use delta time修改乘法计算以使用增量时间
【发布时间】:2010-04-19 09:10:57
【问题描述】:
function(deltaTime) {
  x = x * FACTOR; // FACTOR = 0.9
}

这个函数在游戏循环中被调用。首先假设它以恒定的 30 FPS 运行,因此deltaTime 始终为 1/30。

现在游戏发生了变化,所以deltaTime 并不总是 1/30,而是可变的。如何将deltaTime 纳入x 的计算中以保持“每秒效果”相同?


然后呢

function(deltaTime) {
  x += (target - x) * FACTOR; // FACTOR = 0.2
}

【问题讨论】:

  • 什么编程语言、环境等?
  • 对于第二个问题,您使用变量 delta = target - x。然后更新函数变为 delta = delta * (1 - FACTOR),您已经知道要解决这个问题。给定 delta 你总是可以得到 x = target - delta。

标签: math multiplication exponential


【解决方案1】:
x = x * Math.pow(0.9, deltaTime*30)

编辑

对于您的新更新:

x = (x-target) * Math.pow(1-FACTOR, deltaTime*30) + target;

展示我是如何到达那里的:

设 x0 为初始值,xn 为 n/30 秒后的值。也让T=目标,F=因子。那么:

x1 = x0 + (T-x0)F = (1-F)x0 + TF
x2 = (1-F)x1 + TF = (1-F)^2 * x0 + (1-F)TF + TF

继续 x3,x4,... 将显示:

xn = (1-F)^n * x0 + TF * (1 + (1-F) + (1-F)^2 + ... + (1-F)^(n-1))

现在用公式代替几何序列的总和将得到上面的结果。这实际上只证明了整数 n 的结果,但它应该适用于所有值。

【讨论】:

  • 谢谢,它有效。我用一个更难的问题扩展了这个问题。
  • 这也有效,再次感谢。不过这个更难理解:p
【解决方案2】:

x = x * powf(0.9, deltaTime / (1.0f / 30.0f))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-19
    • 2014-03-29
    • 1970-01-01
    • 2023-01-27
    相关资源
    最近更新 更多