重现重力物理会产生不同的时间步长

时间:2012-03-01 02:07:34

标签: c# physics farseer

我正在写一个基于物理的游戏,它有一个行星,重力作用于各种物体,如导弹。 (使用Farseer Physics引擎)

对于主要的游戏玩法,我使用固定时间步长的单一物理模拟。 这一切都很好,效果很好。

这是问题所在。 我正在使用第二个物理模拟器具有更大的时间步长,以便将某些射弹路径投射到未来。基本上是一个包含行星和其他静态重力生成实体的平行宇宙 (因为我实时运行这些投影模拟,它需要快速,因此需要更长的时间步长。)

它产生的结果略有不同。

以下是每个时间步执行的基本代码:

 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))

我的问题: 是否可以在并行仿真器中使用不同的时间步复制主仿真器的结果?

我的数学不是很好,所以我无法通过可能的解决方案来思考问题。由于所涉及的非线性方程式,我猜测它是不可能的 如果是这种情况,是否有合理准确的方法来获得接近结果?

1 个答案:

答案 0 :(得分:1)

这是一个数学问题,而不是物理问题,但答案是否定的。模拟(任何模拟)都是近似值,并且高度依赖于一些变量。

在这种情况下,它看起来像一个基本的Euler method模拟。你看到的是两个模拟的global truncation error的差异 - 换句话说,每个模拟都有固有的,不同的误差特征。

例如,在“近距离”情况下,你会看到更多不同的模拟(当两个物体显着偏转时,误差会更大)。您将无法纠正它,因为校正将比两个模型组合更复杂(即所需的计算能力)。