[英]Maintain distance for orbital ellipse
我正在Unity游戏引擎中使用太阳能系统制作4倍游戏。 我有一些想要以椭圆形式绕其恒星运行的行星。 出于各种原因,行星不属于恒星。 游戏位于3D空间中,具有自顶向下的视图,因此轨道位于ay为零的x和z平面上。
在各种帖子(例如this , this和this)之后,我将以下代码合并到一个例程中:
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
是变量控制路径的椭圆度。 a
和aPlus
是控制角速度的任意变量。
这基于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.