【发布时间】:2014-09-07 17:44:14
【问题描述】:
我目前正在使用 C# 进行一个项目,我在其中玩弄行星引力,我知道这是一个要充分利用它的核心主题,但我喜欢挑战。我一直在阅读牛顿定律和开普勒定律,但我无法弄清楚的一件事是如何获得正确的引力方向。
在我的示例中,我只有 2 个身体。一颗卫星和一颗行星。这是为了简化它,所以我可以掌握它 - 但我的计划是让多个对象动态地相互影响,并希望最终得到一个有点现实的多体系统。
当你有一个轨道时,卫星就有一个引力,这当然是在行星的方向上,但那个方向不是一个常数。为了更好地解释我的问题,我将尝试使用一个示例:
假设我们有一颗卫星以 50 m/s 的速度移动,并以 10 m/s/s 的速度向地球加速,半径为 100 m。 (所有理论数字)如果我们说帧速率为 1,那么一秒钟后对象将向前 50 个单位,向下 10 个单位。
当卫星在一帧内移动多个单元并移动大约 50% 的半径时,在这一帧期间,重力方向发生了很大变化,但施加的力只是“向下”。这会产生很大的误差,尤其是当对象移动半径的很大百分比时。
在我们的示例中,我们可能需要我们的重力方向基于我们当前位置和这一帧结束时的位置之间的平均值。
如何计算这个?
我对三角学有基本的了解,但主要关注三角形。假设我很愚蠢,因为与你们中的任何人相比,我可能是。
(我提出了一个先前的问题,但最终删除了它,因为它产生了一些敌意,而且措辞基本上没有那么好,而且都是笼统的 - 这不是一个真正的具体问题。我希望这会更好。如果不是,那么请通知我,我是来学习的:))
仅供参考,这是我现在的运动功能:
foreach (ExtTerBody OtherObject in UniverseController.CurrentUniverse.ExterTerBodies.Where(x => x != this))
{
double massOther = OtherObject.Mass;
double R = Vector2Math.Distance(Position, OtherObject.Position);
double V = (massOther) / Math.Pow(R,2) * UniverseController.DeltaTime;
Vector2 NonNormTwo = (OtherObject.Position - Position).Normalized() * V;
Vector2 NonNormDir = Velocity + NonNormTwo;
Velocity = NonNormDir;
Position += Velocity * Time.DeltaTime;
}
如果我的措辞很糟糕,请让我重新措辞 - 英语不是我的母语,如果您不知道正确的技术术语,特定主题可能很难措辞。 :)
我有一种预感,这在开普勒第二定律中有所涵盖,但如果是这样,那么我不确定如何使用它,因为我没有完全理解他的定律。
感谢您的宝贵时间 - 这意味着很多!
(如果有人在我的函数中发现多个错误,请指出!)
【问题讨论】:
-
这是所有离散时间步长积分器的问题,并非专门针对模拟重力。您可能想在这里阅读一下:gafferongames.com/game-physics/integration-basics :)
-
@MagnusHoff 这太棒了。谢谢 - 当我尝试使用它来解决我的问题时,我会阅读并报告! :)
标签: c# vector physics trigonometry