保持轨道椭圆的距离

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了保持轨道椭圆的距离相关的知识,希望对你有一定的参考价值。

我在Unity游戏引擎中使用太阳能系统进行4x游戏。我有行星,我想以椭圆形方式围绕它们的恒星运行。由于各种原因,行星不是星星的父级。游戏在3D空间中具有俯视图,因此轨道位于x和z平面上,y为零。

继各种帖子之后,例如thisthisthis我在一个共同例程中汇总了以下代码:

    while (true)
    {
        yield return new WaitForFixedUpdate();
        x = orbitStar.position.x + ((dist + xMod) * Mathf.Sin(a));
        z = orbitStar.position.z + (dist * Mathf.Cos(a));
        orbitLines.position = new Vector3(x, 0, z);
        a += aPlus * Time.fixedDeltaTime;
    }

orbitStar是行星在轨道上运行的恒星,dist是到达恒星的距离,orbitLines是被轨道运行的物体(实际上是一个轨迹渲染器,后来也是行星,但反过来的时间不是实时)而xMod是变量它控制着路径的椭圆程度。 aaPlus是控制角速度的任意变量。

这形成了一个基于xMod的漂亮椭圆。问题是,当xMod增加时,轨迹渲染器不会将行星一分为二,这条轨迹离行星更远,这里的轨迹是绿松石色曲线:

enter image description here

在数学方面有点笨拙我试图绕过变量并在函数上抛出“魔术”数字,结果不一致,例如:

z = orbitStar.position.z + ((dist - xMod) * Mathf.Cos(a));

z = orbitStar.position.z + (dist * Mathf.Cos(a)) + someOtherVariable;

我怎样才能纠正距离xMod正在移动的距离,以便小径穿过这个星球?

答案

这一切都取决于地球的位置。如果我理解正确,你试图在中心点周围创建一个椭圆,然后尝试找出这个椭圆的参数,这样某个行星就在它的路径上。你需要考虑这个星球的坐标。

椭圆方程是

x = a * cos(t) z = b * sin(t)

在你的情况下,

a = dist + modX b = dist

基本上,当z = 0时,行星必须在x轴上的距离'a'处于椭圆上。同样地,如果行星处于x = 0,则它必须在距离'b'处在椭圆上。

所以问题是:你的星球在哪里?如果行星是固定的,那么a和b就有无数的解,使不同的日食通过它。您可以选择您喜欢的a和b之间的比率并求解上面的等式来找到'a'的值:

x = a * cos(t) z = a *比率* sin(t)

- >你知道x,y和比率。 t仍然是可变的。解决一个

另一方面,如果您想选择椭圆路径然后将行星放在其上,只需选择a和b并通过计算找到行星x和z

x = a * cos(t) z = b * sin(t)

并选择和任意't',它代表行星在日食周围的位置

这个link可以帮助您想象'a'和'b'变量

以上是关于保持轨道椭圆的距离的主要内容,如果未能解决你的问题,请参考以下文章

如何使手动计算的轨道路径与Qt的椭圆绘制方法一致?

Matlab&Mathematica对三维空间上的点进行椭圆拟合

早上距离太远近,还是中午距离太阳近?

移动椭圆的板绘图代码

月亮围绕地球的运动

卫星通信1