我正在写一个基于物理的游戏,其中有行星与引力作用在各种物体上,如导弹。(使用Farseer物理引擎)
对于主要的游戏,我使用一个固定时间步长的单一物理模拟。这一切都很好,工作得很漂亮。
问题出在这里。我正在使用第二个物理模拟器和更大的时间步长,以投射某些抛射路径到未来。基本上是一个平行的宇宙,包含行星和其他静态的重力产生实体(因为我在实时地进行这些投影模拟,它需要更快,因此更大的时间步幅)。
结果略有不同。
下面是每个时间步骤执行的基本代码:
Vector2 force = GravityStrength / centerToCenterDist.LengthSquared() / Math.Sqrt(centerToCenterDist.LengthSquared()) * body1.Mass * body2.Mass * centerToCenterDist;
//GravityStrength is in addition to the Mass calculations我的平行宇宙时间步目前是(5.0 *时间步)。
我试图通过改变结果来纠正不同的结果:
force = (force * (timestep+1))我的问题:在并行模拟器中可以使用不同的时间步骤复制主模拟器的结果吗?
我的数学不是很好,所以我很难想出可能的解决办法。我猜这是不可能的,因为所涉及的非线性方程。
如果是这样的话,是否有一个相当准确的方法来获得接近的结果?
发布于 2012-03-01 02:29:36
这是一个数学问题,而不是物理问题,但答案是否定的。模拟(任何模拟)都是近似的,并且高度依赖于几个变量。
在这种情况下,它看起来像是一个基本的欧拉法模拟。您所看到的是两种模拟在全局截断误差上的不同--换句话说,每一种模拟都具有固有的、发散的错误特性。
例如,在“近进”情况下,您应该会看到更多不同的模拟(当两个物体明显偏转时,误差将更大)。您将无法更正它,因为更正将是更复杂的(即所需的计算能力)比两种模式的总和。
https://stackoverflow.com/questions/9509639
复制相似问题