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 都更专注于刚性结构。有人能推荐一个我可以看的吗?)

4

2 回答 2

10

您需要确保您的 delta t 迭代时间值足够小。您肯定必须修改常量才能获得您期望的行为。在您的情况和大多数情况下,迭代模拟是一种集成形式,其中错误会快速且不可预测地累积。

于 2010-10-27T23:40:12.613 回答
3

是的,这些方程在 2D 空间中成立,因为您的 2D 空间只是 3D 世界的 2D 表示。(一个“真实的”二维宇宙会有不同的方程,但这在这里不相关。)

长镜头:您是否使用到行星表面的距离作为 r?

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

如果这没有区别,请尝试将初始速度设置为零,然后观察它下落几次迭代并测量它的加速度以查看它是否为 GM/r 2。如果答案仍然不清楚,请发布结果,我们将尝试找出答案。

于 2010-10-28T12:27:46.153 回答