有没有人有一个实现轨道力学的例子(最好是在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);
} 编辑标记孟德尔的答案正确,因为我指出我需要更新速度,而不是位置。我还需要将gPull的计算更改为
float gPull = shot.Mass * planet.Mass / distanceSqr * planet.gStr;发布于 2009-03-17 20:18:54
在最后一行中,您正在更新镜头的位置。你应该更新速度。
您可能想看看这个博客http://blog.mendeltsiebenga.com/post/Fun-with-planets.aspx No xna中的代码,但是工作轨道力学。(虽然我从来没有摆脱屏幕闪烁)
发布于 2009-03-17 20:17:52
牛顿-拉夫森迭代不是解决这个问题的稳定方法(也就是说,使用微分方程的积分器就不能正确地解决这个问题)。考虑使用第二个(或更高)顺序的解决方案:龙格-库塔很好,在这种情况下很容易实现。
从数值分析的角度看,轨道力学问题归结为求解耦合微分方程组的问题:
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之间的矢量位移。
发布于 2009-03-17 21:12:39
经过的物体不能进入轨道。轨道的一个特征是,你将以同样的速度返回相同的点(相对于正在运行的物体)。如果你从有效无限开始,你就会回到有效无穷大。
为了进入轨道,你需要在某一点上以与重力无关的方式改变速度,或者有更多的大物体。同样,你不能从表面将一个物体发射到轨道上:当卫星到达预期的高度时,你必须有一些东西(比如最后一枚火箭燃烧)。否则,它将试图返回到发射点,在表面上。
我的一些最糟糕的调试经验是当程序很好的时候,我的测试数据或计算被关闭。确保你知道该找什么。
https://stackoverflow.com/questions/655843
复制相似问题