【问题标题】:2D orbital physics二维轨道物理
【发布时间】:2011-05-01 14:43:53
【问题描述】:

我正在为游戏开发 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 (时间)。您可能错误地将时间引入方程。
  • v = 方程中的 r 是什么?另外,您是否根据新的(略有不同的)半径调整输出速度?
  • 椭圆轨道?那么轨道实际上是一个封闭的椭圆?
  • 我已经更新了有关物理引擎如何工作的更多信息。是的,我似乎没有正确处理时间。
  • 叹息。我发现了错误 --- 在计算重力时,我忘记在将方向矢量应用于力之前对其进行归一化。所以各种非常奇怪的事情发生了;当我运行它时,我很惊讶这一切看起来如此合理。但好消息是,我只需要在我的白痴卡上再获得 5 分,然后我就有资格发布 YouTube cmets!谢谢大家。

标签: 2d physics game-physics gravity


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    是的,这些方程适用于 2D 空间,因为您的 2D 空间只是 3D 世界的 2D 表示。 (“真实”的 2D 宇宙会有不同的方程,但这与这里无关。)

    远射:您是否使用到行星表面的距离作为r?

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多