太空飞行模拟器如何预测飞行路径?



我正在尝试使用 Unity 制作一款游戏,该游戏使用在轨火箭并且可以过渡到不同的行星,但我需要实时预测火箭路径,具体取决于火箭分配的当前速度/方向,就像太空飞行模拟器一样。

在向刚体添加引力时,我设法获得了逼真的物理和轨道:

var sateliteCords = Satelite.transform.position;
var planetCords = gameObject.transform.position;
var distance = sateliteCords - planetCords;
distanceFromSatelite = Vector3.Distance(Satelite.transform.position, gameObject.transform.position);
F = (Gravity * Mass) / Mathf.Pow(distanceFromSatelite,2);
forces = (distance / Mathf.Sqrt(Mathf.Pow(distance.x, 2)+ Mathf.Pow(distance.y, 2)+ Mathf.Pow(distance.z, 2))) * -F;
Satelite.GetComponent<Rigidbody>().AddForce(forces * Time.deltaTime, ForceMode.Force);

但我不知道如何预测未来的时间点来给我轨道形状。

我尝试过用Time.timeScale = 50;"加速模拟",但还不够快。 我在某处读到,我需要一份从统一更新中独立运行的太阳系的副本,并从那里计算火箭轨迹,但我不知道如何处理。

在物理模拟方面,我有点菜鸟,所以你们中的一位天才可以帮忙吗?

以下是您的代码实际执行的操作:

var sateliteCords = Satelite.transform.position;
var planetCords = gameObject.transform.position;
var distance = sateliteCords - planetCords;
distanceFromSatelite = distance.magnitude;
F = (Gravity * Mass) / Mathf.Pow(distanceFromSatelite,2);
forces = distance / distanceFromSatellite * -F;
Satelite.GetComponent<Rigidbody>().AddForce(forces * Time.deltaTime, ForceMode.Force);

您可以通过执行以下操作来进一步减少它:

var distance = sateliteCords - planetCords;
distanceSqrMag = distance.sqrMagnitude;
F = (Gravity * Mass) / distanceSqrMag;
forces = distance.normalized * -F;
Satelite.GetComponent<Rigidbody>().AddForce(forces * Time.deltaTime, ForceMode.Force);

现在代码简单多了,我可以找到一个关键错误。ForceMode.Force 已经将 Force 乘以 Time.deltaTime。你想要的是切换到ForceMode.Impulse,或者删除deltaTime。

F = (Gravity * Mass) / distanceSqrMag;
forces = distance.normalized * -F;
Satelite.GetComponent<Rigidbody>().AddForce(forces, ForceMode.Force);

或者更好的是,假设质量是卫星的质量,重力不是一个一般常数,而只是你星球的局部重力。力模式.力将力除以施加它的刚体的质量。

F = Gravity / distanceSqrMag;
forces = distance.normalized * -F;
Satelite.GetComponent<Rigidbody>().AddForce(forces, ForceMode.Acceleration);

现在一切都解决了,你可以通过做一些事情来做一个非常简单的近似

,比如
var currentPos = _rigidBody.position;
var prevPos = currentPos;
var currentVelocity = _rigidBody.velocity;
var planetCords = gameObject.transform.position;
for (int i = 0; i < stepCount; i++)
{
var distance = planetCords - currentPos;
var forceMag = Gravity / distance.sqrMagnitude;
forces = distance.normalized * forceMag;
currentVelocity  += forces * Time.fixedDeltaTime;
currentPos += currentVelocity * Time.fixedDeltaTime;
//Replace by a TrailRenderer you reset each frame
Debug.DrawLine(prevPos, currentPos, Color.Red, Time.deltaTime);
prevPos = currentPos;
}

请注意,这段代码未经测试,我可能在这里或那里犯了一个错误,但这就是它的要点。

不要担心轨迹有任何差异,这正是 Unity 用来预测位置的方法。当您获得所需的所有计算能力时,无需进行花哨的计算。

如果您想要多个单体重力模拟,这很简单。要么应用所有行星的引力,要么简单地应用最近行星的引力,同时考虑到它的质量。如果你的行星少于十几颗,我推荐前者。

你不需要圆锥,或高等数学,或任何类似的东西。你不是坎巴拉太空计划。有时蛮力是最好的解决方案。

最新更新