围绕静止物体编程弹丸重力

时间:2015-04-07 15:04:03

标签: physics game-physics gravity

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

Bombardier Gravity Gameplay Demo

尸体是静止的,彼此不会相互影响。弹丸以设定的速度和射速发射。角度。他们接近一颗行星,减速,然后扭转并加速。

当我使用牛顿方程实现重力时,物体总是变得更加笨拙 - 加快速度和快速射击速度。也许这是调整质量的问题。

只是好奇人们使用什么技术,如果香草牛顿好,关于质量比率的建议,你认为对编程这种动作很重要的任何其他东西。

2 个答案:

答案 0 :(得分:2)

你实施射弹有时加速并快速射击的原因是这个问题涉及多个时间尺度和长度尺度,但你的整合步骤对他们来说是遗忘的。不要调整群众,最好调整整合步骤,以响应各种时间和长度尺度,这样可以防止数字过大。

假设您有一个质量 m 的单个射弹和一些质量 Mk 的行星,位于固定位置矢量 R ķ。如果射弹的位置向量是 r ,则牛顿方程给你

enter image description here

用于射弹的加速 d ^ 2 r / dt ^ 2

enter image description here

对于射弹的速度 d r / dt ,其中 E 是总能量(这是动作的常数)。

现在想象一下,你只有一颗质量为 M 的行星,并且你的弹丸在半长轴的椭圆轨道上绕轨道运行 a 和期间 T 。然后开普勒第三定律告诉你

enter image description here

当然,你没有一颗行星,而且这颗行星并没有在一个椭圆轨道上绕行星运行。事实上,它的轨道甚至可能都没有关闭。不过,而不是调整行星'群众,考虑调整他们在射弹运动中负责的时间尺度和长度尺度。这些时间和长度尺度大致由上面的表达式给出,至少在轨道几乎是椭圆形的情况下。因此,不要使用 Mk ,而是使用

enter image description here

作为行星群众的代理人。您想要整合的方程式变为

enter image description here

用于射弹的加速 d ^ 2 r / dt ^ 2

enter image description here

投射物的速度 d r / dt

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

例如,假设你有3颗行星。你可以选择 a1 = 100像素 T1 = 5秒 a2 = 200像素,而不是任意设置它们的质量和希望。 , T2 = 10秒 a3 = 150像素 T3 = 30秒。这些数字告诉你,粗略地说,第一个射弹将在 5秒中移动 2pi x 100像素,也就是说,它的速度大约每秒120像素< / em>的。其他的大约 120像素/秒 30像素/秒。在 120像素/秒时,如果您想要每个时间步长集成一个像素,那么您每秒需要大约 100个时间步长,所以您的时间步长永远不应该比 0.01秒大得多。

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

对于实现常微分方程组的自适应积分方法的实际帮助(这个问题的一个例子),请看adaptive Runge-Kutta methods

答案 1 :(得分:1)

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

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

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