1

我试图让我的飞船实体要么看向他们正在移动的方向,要么看向他们正在绕行的目标。在这一点上,我会对任何一个结果感到满意。不幸的是,尽管我对如何实现这一点进行了所有谷歌研究,但我似乎对底层数学的理解还不够。

这是我目前在我的 RotateSystem 中拥有的

public void Execute(ref Translation shipPosition, ref Ship ship, ref Rotation rotation)
{

      ship.Theta += .0075f;
      float3 delta = new float3(
          ship.Radius * Mathf.Sin(ship.Theta) * Mathf.Cos(ship.Phi),
          ship.Radius * Mathf.Cos(ship.Theta),
          ship.Radius * Mathf.Sin(ship.Theta) * Mathf.Sin(ship.Phi));


      rotation.Value = Quaternion.Slerp(rotation.Value,
          Quaternion.LookRotation(ship.OrbitTarget + delta-shipPosition.Value),0.5f);


      shipPosition.Value = ship.OrbitTarget + delta;           

}

这样做的结果是,船只有 1/2 的时间面向其轨道目标,而另一半的时间则背对着轨道目标。 在此处输入图像描述

4

1 回答 1

1

如果没有第二个参数,则Quaternion.LookRotation假定您希望本地up尽可能接近Vector3.up。相反,使用从轨道体到轨道体的方向:

public void Execute(ref Translation shipPosition, ref Ship ship, ref Rotation rotation)
{

    ship.Theta += .0075f;
    float3 delta = new float3(
            ship.Radius * Mathf.Sin(ship.Theta) * Mathf.Cos(ship.Phi),
            ship.Radius * Mathf.Cos(ship.Theta),
            ship.Radius * Mathf.Sin(ship.Theta) * Mathf.Sin(ship.Phi));

    Vector3 previousPos = shipPosition.Value;

    shipPosition.Value = ship.OrbitTarget + delta;   

    rotation.Value = Quaternion.Slerp(rotation.Value, Quaternion.LookRotation(
            shipPosition.Value - previousPos,
            ship.OrbitTarget - shipPosition.Value), 0.5f);
}
于 2020-02-24T17:33:30.617 回答