2D轨道物理学

15
我正在为一款游戏开发2D物理引擎。目前,我已经成功实现了重力和质量的计算,使用一种简单的迭代方法(我知道我最终需要升级);我可以手动推动物体并观察它们移动,一切都按照我的期望工作。
现在,我想提前在游戏世界中设置一个卫星,在一个简单的圆形轨道上绕行行星。为了做到这一点,我需要计算出给定行星质量和所需距离的卫星的初始速度向量;这应该很简单,但我无论如何都不能让它正常运行。
标准的物理教科书告诉我,绕质量为 M 的物体的圆形轨道所需的轨道速度是:
v = sqrt( G * M / r )

然而,应用适当的向量后,卫星的速度仍然不够快,并会进入一个明显椭圆形轨道。随机调整显示,在某些情况下偏差约为3倍。

我的重力模拟代码使用传统的:

F = G M m / r^2

在我的宇宙中,G被设定为1。

有人能确认这些公式在二维空间中仍然成立吗?我看不出任何理由,但此时此刻我真的想知道问题是出在我的代码还是我的假设上...


更新:我的物理引擎工作原理如下:

for each time step of length t:
  reset cumulative forces on each object to 0.
  for each unique pair of objects:
    calculate force between them due to gravity.
    accumulate force to the two objects.
  for each object:
    calculate velocity change dV for this timestep using Ft / m.
    v = v + dV.
    calculate position change dS using v * t.
    s = s + dS.

(当然,适当使用向量。)
目前我每帧执行一次物理计算,大约每秒进行500-700次。我知道这样会很快积累误差,但至少可以让我开始做。
(顺便说一下,我找不到一个现成的物理引擎来处理轨道力学 - 大多数2D物理引擎如Chipmunk和Box2D更专注于刚体结构。有人能推荐一个我可以看看的吗?)

没有理由它不能在2D中工作。但请注意,您的方程式中没有t(表示时间)。您可能在错误地将时间引入方程式中。 - Jared Updike
你在v = 方程中使用什么作为r?此外,您是否根据新的(略有不同的)半径调整输出速度? - Jared Updike
一个椭圆形轨道?所以这个轨道实际上是一个封闭的椭圆形? - Beta
我已经更新了有关物理引擎如何工作的更多信息。是的,看起来很可能我处理时间不正确。 - David Given
这个伪代码看起来是正确的,如果时间增量太大,我会期望卫星螺旋式地向外移动,而不是坠落。还有其他问题。 - Beta
6
叹气,我发现错误了——在计算重力时,我忘记将方向矢量归一化后再施加到力上。所以发生了各种奇怪的事情;当我运行它时,我很惊讶它看起来如此真实。但好消息是,我只需要再获得五个白痴卡点,然后就有资格发布YouTube评论了!谢谢大家。 - David Given
2个回答

10

你需要确保你的delta t迭代时间值足够小。为了获得你期望的行为,你肯定需要调整常数。在你的情况和大多数情况下,迭代模拟是一种积分形式,其中错误会快速且不可预测地累积。


3

是的,这些方程适用于2D空间,因为你的2D空间只是3D世界的2D表示。(一个“真正”的2D宇宙将有不同的方程,但这在这里不相关。)

可能性很小:你是否将距离行星表面作为r?

如果不是这样,请尝试将时间步长减半;如果这有很大的影响,请继续减少它,直到行为停止改变。

如果这没有任何影响,请尝试将初始速度设为零,然后观察它下落几次并测量其加速度,以查看是否为GM/r2。如果答案仍然不清楚,请发布结果,我们将尝试解决问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接