矢量方向的重力在圆形轨道

CDK*_*CDK 12 c# physics trigonometry vector

我目前正在C#中开展一个项目,在那里我玩行星万有引力,我知道这是一个关于它的最重要的话题,但我喜欢挑战.我一直在阅读牛顿定律和Keplers定律,但有一点我无法弄清楚如何获得正确的引力方向.

在我的例子中,我只有2个身体.卫星和行星.这是为了简化它,所以我可以把握它 - 但我的计划是让多个物体相互动态相互作用,并希望最终得到一个有点逼真的多体系统.

当你有一个轨道时,那么卫星就有一个引力,那就是在行星的方向,但那个方向并不是一个常数.为了更好地解释我的问题,我将尝试使用一个例子:

假设我们有一颗卫星以50米/秒的速度移动,并以10米/秒/秒的速度朝着地球加速,半径为100米.(所有理论数字)如果我们然后说帧率是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;
}
Run Code Online (Sandbox Code Playgroud)

如果我说得很糟糕,请让我重新措辞部分 - 英语不是我的母语,当你不知道正确的技术术语时,特定的主题可能很难说.:)

我有一种预感,这是在keplers第二定律中涵盖的,但如果是,那么我不知道如何使用它,因为我不完全理解他的定律.

谢谢你的时间 - 这意味着很多!

(如果有人看到我的功能出现多重错误,那么请指出它们!)

Eri*_*ert 14

我目前正在C#中开展一个项目,我在那里玩行星万有引力

这是一种同时学习模拟技术,编程和物理的有趣方式.

我无法弄清楚的一件事是如何获得正确的引力方向.

我假设你没有试图模拟相对论引力.地球不在太阳轨道上,地球在八分钟前太阳出现的轨道上.纠正引力不是瞬时的事实可能是困难的.(更新:根据评论,这是不正确的.我知道什么;我在第二年牛顿动力学后停止了物理学,并且对张量微积分只有最模糊的理解.)

你会在这个早期阶段做得最好,假设引力是瞬时的,并且行星是所有质量都在中心的点.重力矢量是从一点到另一点的直线.

假设我们有一颗卫星以50米/秒的速度移动......如果我们说帧速率是每秒一帧,那么一秒后物体将是50个单位,10个单位向下.

让我们说清楚一点吧.力等于质量乘以加速度.你可以计算出身体之间的力量.你知道他们的群众,所以你现在知道每个身体的加速度.每个身体都有一个位置和一个速度.加速度会改变速度.速度改变了位置.因此,如果粒子开始向左移动速度为50米/秒,向下移动速度为0米/秒,然后你施加一个使其加速10米/秒/秒的力,那么我们可以计算出更改为速度,然后改变位置.正如您所注意到的那样,在第二秒结束时,与现有的大小相比,位置和速度都会发生巨大的变化.

当卫星在一个框架中移动多个单位并且大约半径的50%时,重力方向在该框架内已经移动很多,但施加的力仅仅是"向下".这会产生很大的误差,特别是如果物体移动半径的很大一部分.

正确.问题是帧速率非常低,无法正确建模您所描述的交互.如果对象快速改变方向,您需要运行模拟,以便查看十分之一,百分之一秒或几秒钟.时间步长通常称为模拟的"delta t",而你的太大.

对于行星体,你现在所做的就像试图通过每隔几个月模拟它的位置来模拟地球,并假设它同时在一条直线上移动.你需要每隔几分钟,而不是每隔几个月实际模拟一下它的位置.

在我们的例子中,我们可能需要我们的重力方向基于我们当前位置和该帧结束时的位置之间的平均值.

你可以做到这一点,但简单地减少计算的"delta t"会更容易.然后,帧的开始和结束方向之间的差异要小得多.

一旦你完成了整理,那么你可以使用更多的技术.例如,您可以检测帧之间的位置变化太多,然后返回并以较小的时间步重做计算.如果位置几乎没有变化,那么增加时间步长.

一旦你得到的是排序,有很多的,你可以在物理模拟使用更先进的技术,但我会通过获取基本时间步进真正坚实的开始.更先进的技术本质上是你对"在时间步长上做更聪明的插值"的想法的变化 - 你在这里是正确的轨道,但你应该在跑步之前走路.

  • Re*地球不在太阳轨道上,地球在八分钟前太阳出现的轨道上.*这是非常错误的,1805年由拉普拉斯首次发现.110年后,爱因斯坦知道了这一点.他的广义相对论并没有这么说.完整的一般相对论公式将使这成为PDE而不是ODE问题.一阶参数化后牛顿近似仍然存在于ODE领域,对太阳系非常有效; 参见[太阳,月亮和行星的轨道星历表]第3页的方程式8-1(http://iau-comm4.jpl.nasa.gov/XSChap8.pdf). (2认同)

CDK*_*CDK 0

所以我找到了一个解决方案,它可能不是最聪明的,但它有效,并且在阅读了 Eric 的答案和 Marcus 的评论后,我很自然地想到了它,你可以说它是两者的结合:

这是新代码:

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) * Time.DeltaTime;

float VRmod = (float)Math.Round(V/(R*0.001), 0, MidpointRounding.AwayFromZero);
if(V > R*0.01f)
{
    for (int x = 0; x < VRmod; x++)
    {
        EulerMovement(OtherObject, Time.DeltaTime / VRmod);
    }
}
else
    EulerMovement(OtherObject, Time.DeltaTime);

}

public void EulerMovement(ExtTerBody OtherObject, float deltaTime)
    {

            double massOther = OtherObject.Mass;

            double R = Vector2Math.Distance(Position, OtherObject.Position);

            double V = (massOther) / Math.Pow(R, 2) * deltaTime;

            Vector2 NonNormTwo = (OtherObject.Position - Position).Normalized() * V;

            Vector2 NonNormDir = Velocity + NonNormTwo;
            Velocity = NonNormDir;



            //Debug.WriteLine("Velocity=" + Velocity);
            Position += Velocity * deltaTime;
    }
Run Code Online (Sandbox Code Playgroud)

解释一下:

我得出的结论是,如果问题是卫星在一帧中的速度太大,那么为什么不将其分成多个帧呢?这就是“它”现在所做的。

当卫星的速度超过当前半径的1%时,它会将计算分成多个部分,使其更加精确。这当然会降低高速工作时的帧率,但对于这样的项目来说是可以的。

不同的解决方案仍然很受欢迎。我可能会调整触发量,但最重要的是它有效,然后我就可以担心让它变得更平滑!

感谢所有看过的人,以及所有帮助我自己找到结论的人!:) 人们能像这样提供帮助真是太棒了!