几乎每场比赛都倾向于使用一些游戏循环。 Gafferongames有一篇关于如何制作精心设计的游戏循环的精彩文章:http://gafferongames.com/game-physics/fix-your-timestep/
在他的代码中,他使用integrate( state, t, deltaTime );
,我相信state
包含对象的位置,速度和加速度。他使用RK4将其从t
集成到t+deltaTime
。
我的问题是,当你可以使用运动学方程(here)来找到精确的值时,为什么要使用像RK4这样的数值积分技术?
这些方程在加速度恒定时起作用。您似乎很少会在时间步长内改变。看起来RK4是一种性能更低,精度更低,更复杂的解决方案。
编辑:我认为您可以为对象添加“加加速度”值,如果您真的想要,仍然可以找到加速度,速度和位移的精确表达式。
编辑2:嗯,我没有仔细阅读他的“整合基础知识”文章。我认为他正在对阻尼器和弹簧进行建模,这会在一个时间步长内造成非恒定的加速度。
答案 0 :(得分:6)
只要你添加许多游戏设计师想要的东西,比如(速度相关的)拖拽,位置相关的力等等,这些方程式就不再是精确可解的。
所以,如果你很乐意将你的力量限制在运动方程可以处理的那些力量上,那就去吧。如果你想要灵活的东西,那么数值整合是唯一的出路。
注意:如果你将力量在一个时间间隔内保持不变,当它们不是真正恒定时 - 那么你实际上是在使用一种数值积分形式。这也是一种不准确的整合形式。那么为什么不使用经过验证的数值方法呢? RK4是许多此类方法中的一种。
答案 1 :(得分:2)
在一个时间步长内将加速度(衍生物,实际)近似为常数是数值积分方法的工作原理。当导数不是常数时,你需要考虑通过将它们视为常数而引入的错误类型。
想象一下,将时间范围T
分成N
等宽的宽度h=T/N
。现在逐步整合动力学方程。使用RK4时,每步的本地错误为O(h^5)
,全局错误为O(h^4)
。
使用你提出的运动方程式,我们可以通过考虑位置的泰勒展开来评估误差,将项保持为二阶。该位置将在每个步骤中引入O(h^3)
错误,对应于您截断扩展的位置。这会产生本地错误O(h^3)
和全局错误O(h^2)
。
基于渐近误差,RK4的误差比运动方程更快地变为零多。它更准确。 RK4获得了需要完成的功能评估数量的非常好的准确性。