2

我正在编写一个基于物理的游戏,其中有重力作用于各种物体(如导弹)的行星。(使用 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))

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

我的数学不是很好,所以我很难通过可能的解决方案来思考这个问题。我猜这是不可能的,因为涉及非线性类型的方程。
如果是这种情况,是否有一种相当准确的方法来获得接近的结果?

4

1 回答 1

1

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

在这种情况下,它看起来像一个基本的欧拉方法模拟。您所看到的是两个模拟的全局截断误差的差异——换句话说,每个模拟都有固有的、不同的误差特征。

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

于 2012-03-01T02:29:36.397 回答