我正在为一款游戏开发2D物理引擎。目前,我已经成功实现了重力和质量的计算,使用一种简单的迭代方法(我知道我最终需要升级);我可以手动推动物体并观察它们移动,一切都按照我的期望工作。
现在,我想提前在游戏世界中设置一个卫星,在一个简单的圆形轨道上绕行行星。为了做到这一点,我需要计算出给定行星质量和所需距离的卫星的初始速度向量;这应该很简单,但我无论如何都不能让它正常运行。
标准的物理教科书告诉我,绕质量为 M 的物体的圆形轨道所需的轨道速度是:
(当然,适当使用向量。)
目前我每帧执行一次物理计算,大约每秒进行500-700次。我知道这样会很快积累误差,但至少可以让我开始做。
(顺便说一下,我找不到一个现成的物理引擎来处理轨道力学 - 大多数2D物理引擎如Chipmunk和Box2D更专注于刚体结构。有人能推荐一个我可以看看的吗?)
现在,我想提前在游戏世界中设置一个卫星,在一个简单的圆形轨道上绕行行星。为了做到这一点,我需要计算出给定行星质量和所需距离的卫星的初始速度向量;这应该很简单,但我无论如何都不能让它正常运行。
标准的物理教科书告诉我,绕质量为 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更专注于刚体结构。有人能推荐一个我可以看看的吗?)