首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >轨道力学

轨道力学
EN

Stack Overflow用户
提问于 2009-03-17 20:12:48
回答 4查看 5.7K关注 0票数 13

有没有人有一个实现轨道力学的例子(最好是在XNA中)?我目前使用的代码如下所示,但它在执行时“感觉不对”。物体只会向行星轻微弯曲,无论我如何调整变量,我都无法让它进入轨道,甚至部分轨道。

代码语言:javascript
复制
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的计算更改为

代码语言:javascript
复制
float gPull = shot.Mass * planet.Mass / distanceSqr * planet.gStr;
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-03-17 20:18:54

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

您可能想看看这个博客http://blog.mendeltsiebenga.com/post/Fun-with-planets.aspx No xna中的代码,但是工作轨道力学。(虽然我从来没有摆脱屏幕闪烁)

票数 10
EN

Stack Overflow用户

发布于 2009-03-17 20:17:52

牛顿-拉夫森迭代不是解决这个问题的稳定方法(也就是说,使用微分方程的积分器就不能正确地解决这个问题)。考虑使用第二个(或更高)顺序的解决方案:龙格-库塔很好,在这种情况下很容易实现。

从数值分析的角度看,轨道力学问题归结为求解耦合微分方程组的问题:

代码语言:javascript
复制
x_i'' + G m_i \sum_{i != j} m_j r_ji/(|r_ji|)^3 = 0

x是代表物体位置的三个矢量时,m是同一物体的质量,r_ji = x_j - x_i是物体ji之间的矢量位移。

票数 8
EN

Stack Overflow用户

发布于 2009-03-17 21:12:39

经过的物体不能进入轨道。轨道的一个特征是,你将以同样的速度返回相同的点(相对于正在运行的物体)。如果你从有效无限开始,你就会回到有效无穷大。

为了进入轨道,你需要在某一点上以与重力无关的方式改变速度,或者有更多的大物体。同样,你不能从表面将一个物体发射到轨道上:当卫星到达预期的高度时,你必须有一些东西(比如最后一枚火箭燃烧)。否则,它将试图返回到发射点,在表面上。

我的一些最糟糕的调试经验是当程序很好的时候,我的测试数据或计算被关闭。确保你知道该找什么。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/655843

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档