有没有人有一个实施轨道力学的例子(最好是在XNA中)?我目前使用的代码如下,但它执行时并没有"感觉正确".物体只是稍微向地球弯曲,无论我调整多少变量,我都无法进入轨道,甚至是部分轨道.
shot.Position += shot.Velocity; foreach (Sprite planet in planets) { Vector2 directionToPlanet = (planet.Position - shot.Position); directionToPlanet.Normalize(); float distance = Vector2.DistanceSquared(shot.Position, planet.Position); float gPull = (float)(planet.gravityStrength * (planet.Mass * shot.Mass) / distance) + planet.gravityField; shot.Position += new Vector2(directionToPlanet.X * gPull, directionToPlanet.Y * gPull); }
编辑 标记Mendelt的答案是正确的,指出我需要更新速度,而不是位置.我还需要将gPull的计算更改为
float gPull = shot.Mass * planet.Mass / distanceSqr * planet.gStr;
Mendelt.. 8
在最后一行中,您将更新镜头的位置.你应该更新速度.
您可能需要查看此博客中的代码http://blog.mendeltsiebenga.com/post/Fun-with-planets.aspx没有xna,但是工作轨道机制.(虽然我从来没有摆脱屏幕闪烁)
在最后一行中,您将更新镜头的位置.你应该更新速度.
您可能需要查看此博客中的代码http://blog.mendeltsiebenga.com/post/Fun-with-planets.aspx没有xna,但是工作轨道机制.(虽然我从来没有摆脱屏幕闪烁)
Newton-Raphson迭代不是一种解决这个问题的稳定方法(也就是说,使用如此简单的微分方程积分器,你无法做到正确).考虑使用第二个(或更高)订单解决方案:Runge-Kutta很好,在这种情况下很容易实现.
从数值分析的角度来看,轨道力学问题减少到求解耦合微分方程组的问题:
x_i'' + G m_i \sum_{i != j} m_j r_ji/(|r_ji|)^3 = 0
其中x
三个向量代表物体的位置,m
它们是相同物体的质量,r_ji = x_j - x_i
是物体j
和物体之间的向量位移i
.