【问题标题】:Convert sin calculation to use per-frame delta将 sin 计算转换为使用每帧增量
【发布时间】:2018-03-08 18:43:16
【问题描述】:

我目前有一个使用 sin 函数更新值的函数,以及一个 timeFactor double 用于跟踪自程序启动以来已经过去了多少时间:

double timeFactor;
double delta;
while(running) {
  delta = currentTime - lastTime;
  timeFactor += delta;
  var objectX = sin(timeFactor);
}

但是,我需要将此代码转换为使用增量而不是 timeFactor。
IE。为了更新到 sin(time+delta),我只想使用 sin(time) 的当前值以及根据 delta 值计算的任何值。
IE。计算 sin(time+delta) == f(sin(time),delta)

我该怎么做?

【问题讨论】:

  • 不清楚您要做什么。 “将代码转换为使用增量而不是 timeFactor”是什么意思?如果你想要sin(delta) 而不是sin(timeFactor) - 是什么阻止了你?
  • 这是否意味着将 sin(timeFactor) 与 sin(delta) 交换?
  • 您的意思是要更新objectX 使用它以前的值和delta,而不是使用timeFactor?
  • 是的,我想使用之前的值和增量更新 objectX。
  • sin(A + B) = sin A cos B + cos A sin B

标签: math timestamp trigonometry timedelta


【解决方案1】:

来自数学:
sin(A + B) == sin(A) * cos(B) + cos(A) * sin(B)
cos(A + B) == cos(A) * cos(B) - sin(A) * sin(B)

将 sin(A) 和 cos(A) 存储在两个变量中。 然后使用其中一个的临时副本更新它们,否则您将使用新的而不是第一个的旧值来更新第二个。

假设:

  • persistent objectX 存储当前并使用初始 sin(timeFactor) 进行初始化
  • persistent objectXc 存储当前并使用初始 cos(timeFactor) 进行初始化
  • 临时 objectXt 存储 objectX 的副本

(“持久”,如“在更新代码的执行过程中保持价值”, 与“仅在更新代码期间保持价值”中的“临时”相反; 这是为了避免使用“全局”属性,这意味着糟糕的数据设计)

更新代码:

objectXt = objectX;
objectX  = objectX * cos(delta) + objectXc * sin(delta);
objectXc = objectXc* cos(delta) - objectXt * sin(delta);

感谢 John Coleman 在最初的使用想法中发现了问题
1 == sin(A)*sin(A)+cos(A)*cos(A)
那实际上是
sin(time+delta)== f(sin(time), delta)
但它会在整个周期的 50% 内失败。
所以我希望这个
sin(time+delta)==f(sin(time), cos(time), delta)
也有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-17
    • 1970-01-01
    • 2015-06-19
    • 2022-06-28
    • 2014-07-17
    • 2016-06-06
    相关资源
    最近更新 更多