随机旋转发生,我不明白

Random rotation happening, I don't get it

我有一个场景是这样的: 我有播放器对象,它是一个 Z 锁定的立方体,我使用脚本使用各种 AddForce 调用来移动它。里面最重要的方法是这个:

public void SetDirections(Vector3 down)
    {
    down.Normalize();
    this.down = down;
    forward = Vector3.Cross(down, new Vector3(0, 0, 1));
    }

同一脚本中与旋转相关的其他代码是这样的:

void Turning ()
    {
    // Irányitó gombok hatására a Taxi elforduljon 180fokot
    Vector3 lookDirection = forward;

    // balra forditás
    if (inputh > 0)
        {
        faceLeft = false;
        }

    // jobbra forditás
    if (inputh < 0)
        {
        faceLeft = true;
        }

    if (faceLeft)
        {
        lookDirection *= -1;
        }

    transform.LookAt(transform.position + lookDirection, new Vector3(0, 1, 0));
    }

我在场景中的另一个物体上有这个位:

public class RotateGravity : MonoBehaviour
{
public GameObject Taxi;
public float MinLimit, MaxLimit;
private TaxiController tControl;
private Rigidbody tRigidbody;
private Transform tTransform;

void Start()
    {
    tControl = Taxi.GetComponent<TaxiController>();
    tRigidbody = Taxi.GetComponent<Rigidbody>();
    tTransform = Taxi.GetComponent<Transform>();
    }


void OnTriggerStay()
    {
    Vector3 originalDown = tControl.Down;
    Vector3 newDown = tTransform.position - gameObject.transform.position;

    if (Vector3.SignedAngle(newDown, new Vector3(1, 0, 0), new Vector3(0, 0, 1)) > MinLimit &&
        Vector3.SignedAngle(newDown, new Vector3(1, 0, 0), new Vector3(0, 0, 1)) < MaxLimit)
        {
        newDown.Normalize();
        tControl.SetDirections(newDown);
        float angle = Vector3.SignedAngle(originalDown, newDown, new Vector3(0, 0, 1));
        tRigidbody.velocity = Quaternion.AngleAxis(angle, new Vector3(0, 0, 1)) * tRigidbody.velocity;
        }

    Debug.Log("Stay: " + newDown);
    }

void OnTriggerExit()
    {
    float angle = Vector3.Angle(tTransform.position - gameObject.transform.position, new Vector3(1, 0, 0));
    Vector3 newDown;
    float newAngle;
    
    if (Mathf.Abs(angle - MinLimit) < Mathf.Abs(angle - MaxLimit))
        {
        newDown = Quaternion.AngleAxis(MinLimit, new Vector3(0, 0, -1)) * new Vector3(1, 0, 0);
        newAngle = MinLimit;
        }
        else
        {
        newDown = Quaternion.AngleAxis(MaxLimit, new Vector3(0, 0, -1)) * new Vector3(1, 0, 0);
        newAngle = MaxLimit;
        }

    Debug.Log("Exit: " + newDown + " " + newAngle);

    tControl.SetDirections(newDown);
    tRigidbody.velocity = Quaternion.AngleAxis(newAngle, new Vector3(0, 0, 1)) * tRigidbody.velocity;
    }
}

基本上这个想法是当玩家沿着物体移动时重力方向会改变,所以只要向右移动它就会围绕物体旋转,介于 MinLimit 和 MaxLimit 角度之间。它是做什么的。最后我想把方向固定在这些限制上,这就是奇怪的事情发生的地方。在我的示例中,我将 MinLimit 设置为 0,将 MaxLimit 设置为 90。这意味着玩家从左侧水平进入,重力从 (0, -1, 0) 变为 (1, 0, 0)。除了,最后玩家对象围绕其前向矢量旋转 90 度。

有人可以解释我哪里出错了吗?我讨厌 Unity 中的旋转 :(

在下面的视频中,红色球体只是玩家对象下方的一个指示器,以更好地显示其朝向。 https://www.youtube.com/watch?v=z4p9UQb7inA

好吧,我没有在 Turning() 方法中正确设置向上矢量,它指向正 Y 方向,所以当我的前向最终相同时,它不知道将对象旋转到哪里在那个轴上。我很笨我将向上向量设置为指向 -1 * 向下,结果很成功。