将 sin 计算转换为使用每帧增量
Convert sin calculation to use per-frame delta
我目前有一个使用 sin 函数更新值的函数,以及一个 timeFactor double,用于跟踪自程序启动以来经过了多少时间:
double timeFactor;
double delta;
while(running) {
delta = currentTime - lastTime;
timeFactor += delta;
var objectX = sin(timeFactor);
}
但是,我需要将此代码转换为使用 delta 而不是 timeFactor。
IE。为了更新到 sin(time+delta),我只想使用 sin(time) 的当前值和根据 delta 值计算的任何值。
IE。计算 sin(time+delta) == f(sin(time),delta)
我该怎么做?
来自数学:
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 的副本
("persistent" 如 "keeps value across executions of update code",
与 "only keeps value during update code" 中的 "temporary" 相比;
这是为了避免使用 "global" 属性,这意味着糟糕的数据设计)
更新代码:
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(时间+delta)== f(sin(time), delta)
但它会在整个周期的 50% 内失败。
所以我希望这个
sin(时间+delta)==f(sin(时间), cos(时间), delta)
也有帮助。
我目前有一个使用 sin 函数更新值的函数,以及一个 timeFactor double,用于跟踪自程序启动以来经过了多少时间:
double timeFactor;
double delta;
while(running) {
delta = currentTime - lastTime;
timeFactor += delta;
var objectX = sin(timeFactor);
}
但是,我需要将此代码转换为使用 delta 而不是 timeFactor。
IE。为了更新到 sin(time+delta),我只想使用 sin(time) 的当前值和根据 delta 值计算的任何值。
IE。计算 sin(time+delta) == f(sin(time),delta)
我该怎么做?
来自数学:
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 的副本
("persistent" 如 "keeps value across executions of update code", 与 "only keeps value during update code" 中的 "temporary" 相比; 这是为了避免使用 "global" 属性,这意味着糟糕的数据设计)
更新代码:
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(时间+delta)== f(sin(time), delta)
但它会在整个周期的 50% 内失败。
所以我希望这个
sin(时间+delta)==f(sin(时间), cos(时间), delta)
也有帮助。