繁体   English   中英

保持轨道椭圆的距离

[英]Maintain distance for orbital ellipse

我正在Unity游戏引擎中使用太阳能系统制作4倍游戏。 我有一些想要以椭圆形式绕其恒星运行的行星。 出于各种原因,行星不属于恒星。 游戏位于3D空间中,具有自顶向下的视图,因此轨道位于ay为零的x和z平面上。

在各种帖子(例如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是要orbitLines的对象(实际上是轨迹渲染器,后来也是行星,但又是基于时间的,不是实时的),而xMod是变量控制路径的椭圆度。 aaPlus是控制角速度的任意变量。

这基于xMod形成了一个漂亮的椭圆。 问题在于,随着xMod的增加, xMod迹渲染器不会将星球一分为xMod ,尾迹向远离行星的方向移动,这里的尾迹是绿松石色曲线:

在此处输入图片说明

在数学方面有些无能为力,我尝试在变量周围变乱,并在函数上抛出“魔术”数字,结果不一致,例如:

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

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

我该如何校正xMod沿轨迹移动的距离,以使轨迹穿过行星?

这一切都取决于行星在哪里。 如果我理解正确,则您正在尝试围绕中心点创建一个椭圆,然后尝试找出该椭圆的参数,以便某个行星处于其路径上。 您需要考虑这个星球的坐标。

椭圆方程为

x =一个* cos(t)
z = b * sin(t)

就你而言

a = dist + modX b = dist

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

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

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

->您知道x,y和比率。 t保持可变。 解决一个

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

x =一个* cos(t)
z = b * sin(t)

并选择和任意的“ t”,它表示行星围绕日食的位置

链接可以帮助您直观地了解变量“ a”和“ b”的作用

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM