为什么 Unity 在全局方向上旋转 Y 轴,而在局部方向上旋转 Z 和 X 轴

问题描述 投票:0回答:0

说到旋转,在 Unity 中有一件事我真的无法理解。如果你能帮助我理解这个机制,请尽量让解释尽可能简单,因为我的数学不是很好,实际上我有点挣扎。当我在 Y 轴上对我的游戏对象应用旋转时,游戏对象旋转将其 Y 轴定位在全局坐标上,同时在 X 或 Z 轴上旋转 GO,它旋转将其轴定位在自坐标系上(因此基于其 X和 Z 轴在空间中定向)。我的意思是,它看起来很适合游戏玩法,因为我正在尝试为相机创建旋转(代表玩家视图),但为什么 Unity 以这种方式处理旋转?我会粘贴代码来展示我做事的方式,这样也许你会更容易理解发生了什么。

public class Player : MonoBehaviour
{
    [Header("Camera")]
    [SerializeField] private Camera _camera;
    [SerializeField] private Vector2 _xMinMaxRotation = new Vector2(-90, 90);
    [SerializeField] private Vector2 _yMinMaxRotation = new Vector2(-90, 90);
    [SerializeField] private float _mouseXSensistivity = 1;
    [SerializeField] private float _mouseYSensistivity = 1;
    [SerializeField] private float _mouseZSensistivity = 1;
    [SerializeField] private float _xStartRotation = 0;
    [SerializeField] private float _yStartRotation = 0;
    private Vector2 _mouseDelta;
    private float _rotY, _rotX, _rotZ;

    public GameObject head;

    // Start is called before the first frame update
    void Start() {
        Cursor.lockState = CursorLockMode.Locked;
        Debug.Log(transform.eulerAngles);
    }

    // Update is called once per frame
    void Update() {
        _mouseDelta = new Vector2(Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y"));
        MoveCamera();
        //Debug.Log(_mouseDelta.x + " " + _mouseDelta.y);
    }


    private void MoveCamera() {
        _rotX += _mouseDelta.x * _mouseXSensistivity * Time.deltaTime * 50;
        _rotX = Mathf.Clamp(_rotX, _xMinMaxRotation.x, _xMinMaxRotation.y);
        _rotY += _mouseDelta.y * _mouseYSensistivity * Time.deltaTime * 50;
        _rotY = Mathf.Clamp(_rotY, _yMinMaxRotation.x, _yMinMaxRotation.y);

        if (Input.GetKey(KeyCode.Q)) {
            _rotZ += _mouseZSensistivity * Time.deltaTime * 50;
            transform.rotation = transform.rotation * Quaternion.Euler(0, 0, _rotZ);

            if (_rotZ > 25) _rotZ = 25;
            transform.rotation = transform.rotation * Quaternion.Euler(0, 0, _rotZ);

        }
        else {
            if (_rotZ > 0) {
                _rotZ -= 2 * _mouseZSensistivity * Time.deltaTime * 50;
                transform.rotation = transform.rotation * Quaternion.Euler(0, 0, _rotZ);

                if (_rotZ < 0) _rotZ = 0;
                transform.rotation = transform.rotation * Quaternion.Euler(0, 0, _rotZ);

            }
        }
        if (Input.GetKey(KeyCode.E)) {
            _rotZ += -_mouseZSensistivity * Time.deltaTime * 50;
            transform.rotation = transform.rotation * Quaternion.Euler(0, 0, _rotZ);


            if (_rotZ < -25) _rotZ = -25;
            transform.rotation = transform.rotation * Quaternion.Euler(0, 0, _rotZ);
        }
        else {
            if (_rotZ < 0) {
                _rotZ += 2 * _mouseZSensistivity * Time.deltaTime * 50;
                transform.rotation = transform.rotation * Quaternion.Euler(0, 0, _rotZ);

                if (_rotZ > 0) _rotZ = 0;
                transform.rotation = transform.rotation * Quaternion.Euler(0, 0, _rotZ);
            }
        }
        transform.rotation = Quaternion.Euler(-_rotY, _rotX, _rotZ);
    }
}

请不要给我发关于 Unity 中旋转如何工作的文章。这种方法太笼统了,可能无法帮助我理解。

unity3d matrix vector rotation trigonometry
© www.soinside.com 2019 - 2024. All rights reserved.