【问题标题】:Programming projectile gravity around stationary bodies围绕静止物体编程弹丸重力
【发布时间】:2023-03-12 07:14:01
【问题描述】:

我想在这个视频中模仿重力:

Bombardier Gravity Gameplay Demo

身体是静止的,不会相互影响。射弹以设定的速度和角度发射。它们接近一颗行星,减速,然后急转弯并加速。

当我使用牛顿方程实现重力时,物体总是移动得更不稳定——加速和射击速度快得离谱。也许这是调整质量的问题。

只是好奇人们使用什么技术,如果 vanilla Newton 的技术很好,关于质量比的建议,以及任何你认为对这种运动编程很重要的东西。

【问题讨论】:

  • 使用径向重力时要做的一件好事是确保您有良好的碰撞检测或 max();在重力产生的力上,以确保 2 个物体不会直接相互穿过并因此获得巨大的速度提升。此外,您的物理步数越小越好。
  • “你的物理步骤越小越好” - 不正确。减少时间步长会增加集成所需的时间,并且没有人希望他们的模拟爬行。此外,存在运动缓慢的运动区域,在这种情况下,较大的时间步长很好。此外,过多地减少时间步长会使您接近硬件的浮点精度,在这种情况下,您的答案会受到舍入误差的严重影响,并且完全是虚假的。最好的方法是根据当前速度自动选择一个时间步长。

标签: physics game-physics gravity


【解决方案1】:

您的实施使射弹有时会加速并以惊人的速度发射的原因是,此问题涉及多个时间尺度和长度尺度,但您的集成步骤忽略了它们。与其调整质量,不如调整您的集成步骤以响应那些不同的时间和长度尺度,这样可以防止您的数字变得太大。

假设你有一个质量为 m 的射弹和许多质量为 Mk 的行星,它们位于固定位置矢量 Rk。如果弹丸的位置向量是r,那么牛顿方程给你

对于弹丸的加速度d^2r/dt^2

对于弹丸的速度 dr/dt,其中 E 是总能量(即运动常数)。

现在想象一下,你只有一个质量为 M 的行星,并且你的射弹在半长轴 a的椭圆轨道上绕着它运行> 和句点 T。那么开普勒第三定律告诉你

当然,你没有一颗行星,而且弹丸也不是在一个椭圆轨道上围绕这些行星运行。事实上,它的轨道甚至可能不是封闭的。尽管如此,与其调整行星的质量,不如考虑调整它们在射弹运动中负责的时间尺度和长度尺度。这些时间和长度尺度大约由上面的表达式给出,至少在那些轨道几乎是椭圆的情况下。因此,不要使用 Mk,而是使用

作为行星质量的代表。然后你要积分的方程变成

对于弹丸的加速度d^2r/dt^2

对于弹丸的速度dr/dt

现在,为什么这些比原始方程更好?因为您可以提前选择各种周期和半长轴,然后定义射弹轨道的各种时间和长度尺度。这些反过来又可以帮助您决定在轨道期间的各个点使用哪些积分步骤,这有助于为您提供更准确的轨道以及表现更好的数值问题来解决。

例如,假设您有 3 个行星。与其随意设置质量并希望最好,不如说您选择 a1 = 100 像素T1 = 5 秒a2 = 200 像素T2 = 10 秒a3 = 150 像素T3 = 30 秒。这些数字告诉你,大致上,第一个弹丸将在5秒内移动2pi x 100像素,也就是说,它的速度大约是120像素每秒。其他的以大约 120 像素/秒30 像素/秒 的速度移动。在 120 像素/秒,如果您想在每个时间步积分一个像素,则大约需要 每秒 100 个时间步,因此您的时间步长应该永远不会太多大于 0.01 秒

同样,这些不是确切的考虑因素,因为轨道不一定是封闭的,并且如上所述的开普勒第三定律仅适用于具有封闭轨道的二体问题。尽管如此,以上述形式构建方程并仔细选择和监控您的积分步骤以符合问题固有的时间尺度将使您的模拟更加稳定和准确。

有关实现常微分方程系统的自适应积分方法的实际帮助(这个问题就是一个例子),请查看adaptive Runge-Kutta methods

【讨论】:

  • 这需要我一点时间阅读和理解。感谢您发布!
  • 不客气。我已经编辑了我的答案,以添加更好的方程式渲染,以便它们更易于阅读,并在一些地方稍微澄清了文本。我希望这对您(和其他人)有用。
【解决方案2】:

一种非常简单、物理上不正确但有效的方法(甚至在 GPU 上的多体模拟中使用)是通过确保 -GmM/r^2 中的分母永远不会变为零来“消除奇点”。这可以通过在分母上简单地添加一个正常数来完成:

 |F| = G*m*M/(r^2 + c)

这让“行星”看起来不像无限密集的质量点,而是像模糊的物质云一样。这消除了弹丸突然加速到极端速度的问题。无论如何,人类玩家永远不会注意到任何差异。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    • 2018-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多