首页 文章

保持轨道椭圆的距离

提问于
浏览
0

我在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 正在移动轨迹,以便小径穿过行星?

1 回答

  • 0

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

    椭圆方程是

    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 * ratio * sin(t)

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

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

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

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

    link可能会帮助您可视化'a'和'b'所做的变量

相关问题