Управление вращением корабля, когда он вращается вокруг цели - PullRequest
1 голос
/ 24 февраля 2020

Я пытаюсь заставить свои корабельные сущности либо смотреть в направлении, куда они движутся, либо на цель, вокруг которой они вращаются. На данный момент я был бы счастлив с любым результатом. К сожалению, я просто, кажется, недостаточно понимаю основную математику, несмотря на все мои исследования Google о том, как выполнить sh this.

Это то, что у меня сейчас есть в моей 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 раза и в другую половину времени. enter image description here

1 Ответ

1 голос
/ 24 февраля 2020

Без второго параметра, 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);
}
...