当前位置:  开发笔记 > 编程语言 > 正文

轨道力学

如何解决《轨道力学》经验,为你挑选了2个好方法。

有没有人有一个实施轨道力学的例子(最好是在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,但是工作轨道机制.(虽然我从来没有摆脱屏幕闪烁)



1> Mendelt..:

在最后一行中,您将更新镜头的位置.你应该更新速度.

您可能需要查看此博客中的代码http://blog.mendeltsiebenga.com/post/Fun-with-planets.aspx没有xna,但是工作轨道机制.(虽然我从来没有摆脱屏幕闪烁)


该链接已移至http://www.mendeltsiebenga.com/2009/01/fun-with-planets.html.

2> dmckee..:

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.

推荐阅读
手机用户2502852037
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有