我正在写一个基于物理的游戏,它有一个行星,重力作用于各种物体,如导弹。 (使用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))
我的问题: 是否可以在并行仿真器中使用不同的时间步复制主仿真器的结果?
我的数学不是很好,所以我无法通过可能的解决方案来思考问题。由于所涉及的非线性方程式,我猜测它是不可能的 如果是这种情况,是否有合理准确的方法来获得接近结果?
答案 0 :(得分:1)
这是一个数学问题,而不是物理问题,但答案是否定的。模拟(任何模拟)都是近似值,并且高度依赖于一些变量。
在这种情况下,它看起来像一个基本的Euler method模拟。你看到的是两个模拟的global truncation error的差异 - 换句话说,每个模拟都有固有的,不同的误差特征。
例如,在“近距离”情况下,你会看到更多不同的模拟(当两个物体显着偏转时,误差会更大)。您将无法纠正它,因为校正将比两个模型组合更复杂(即所需的计算能力)。