我开始学习如何进行DIY物理学,并且我有一个关于在最基本的层面上实现集成的问题(即,这不是 Euler vs. RK4问题)。
我遇到的几乎每个示例都具有一些integrate()
功能,该功能获取自上次更新以来的时间步长,并自上次更新以来更新加速度(和/或速度和/或位置)。
最简单的形式: position += velocity * deltaTime
但是,我不明白为什么通过更改功能就可以很容易地获得这样的积累。例如:getPosition = makeNewFunction()
可以返回带有签名的东西Time -> Position
,并且该函数的内部工作是通过适当的数学公式生成的。
这样,就没有积累……只要需要获取位置,它就会在当前时间调用该函数。
我的新手理解是,这样做还可以避免由于累积而产生的错误……那为什么不起作用,我还缺少什么?
(之前我确实整理了这个想法的基本概念证明,尽管它同时也在测试其他一些东西,所以它不是最干净的例子:https : //github.com/dakom/ball-bounce-frp)
编辑1:如评论中所述,可能很重要的一点是要指出,我还没有学会改变加速度,或者处理急动和其他需要比恒定加速度更高阶积分的事情。
编辑2:这是该思想的一些基本示例代码,以及伪javascript语法-注意,getKinematicPosition
由于部分应用,因此它返回的只是时间->位置的新功能:
我会坚持在这里工作,但可能还有其他原因,例如getVelocity
,我想...
getKinematicPosition = initialVelocity => acceleration => time =>
((.5 *acceleration) * (time * time)) + (initialVelocity * time);
getPosition = getKinematicPosition ([0,0,0]) (GRAVITY);
onTick = totalTime => {
position = getPosition (totalTime);
onCollision = () => {
getPosition = changeTheFunction(totalTime);
//changeTheFunction uses totalTime to base updates from 0
//it could use getKinematicPosition or something else entirely
}
}