我在Unity游戏引擎中使用太阳能系统进行4x游戏。我有行星,我想以椭圆形方式围绕它们的恒星运行。由于各种原因,行星不是星星的父级。游戏在3D空间中具有俯视图,因此轨道位于x和z平面上,y为零。
来自各个帖子,例如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
是要绕轨道运行的物体(实际上是轨道渲染器,后来也是行星,但反过来基于时间而不是实时)和xMod
是控制路径椭圆度的变量。 a
和aPlus
是控制角速度的任意变量。
这形成了一个基于xMod
的漂亮椭圆。问题是,当xMod
增加时,轨迹渲染器不会将行星平分,轨迹会更远离行星,这里的轨迹是绿松石色曲线:
在数学方面有些不熟,我试图绕过变量并投掷魔法'结果不一致的函数中的数字,例如:
z = orbitStar.position.z + ((dist - xMod) * Mathf.Cos(a));
和
z = orbitStar.position.z + (dist * Mathf.Cos(a)) + someOtherVariable;
如何校正距离xMod
正在移动路径,以便小道穿过地球?
答案 0 :(得分:0)
这一切都取决于地球的位置。如果我理解正确,你试图在中心点周围创建一个椭圆,然后尝试找出这个椭圆的参数,这样某个行星就在它的路径上。你需要考虑这个星球的坐标。
椭圆方程是
x = a * cos(t)
z = b * sin(t)
在你的情况下,
a = dist + modX b = dist
基本上,当z = 0时,行星必须处于距离“a”的位置。在x轴上,在椭圆上。同样地,如果行星在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'做