【发布时间】: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