相对于自协和(非全局协和)旋转对象

Rotate an object relative to self cordinates (not global cordinates)

提问人:Vincent Mazzarella 提问时间:3/11/2023 更新时间:3/11/2023 访问量:30

问:

首先对不起,但我的英语说得不太好。所以我希望我能够尽我所能解释自己。正如标题所说,我正在尝试旋转一个对象,以便对象根据其轴的旋转方式旋转。我知道我的目的很奇怪,但事实是,我只是想玩轮换,以便理解它们。实际上在互联网上搜索,我找到了如何做到这一点,但问题是我需要使用钳制值,所以我需要找到另一种方法来做到这一点。我将粘贴代码,以便您更好地理解。请随时向我建议另一种解决我问题的方法。

 [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;

    void Start() {
        Cursor.lockState = CursorLockMode.Locked;
    }

    void Update() {
        _mouseDelta = new Vector2(Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y"));
        MoveCamera();
    }


    private void MoveCamera() {
        if (_mouseDelta.x != 0) {

            _rotX = _mouseDelta.x * _mouseXSensistivity * Time.deltaTime * 50;
            _rotX = Mathf.Clamp(_rotX, _xMinMaxRotation.x, _xMinMaxRotation.y);
            transform.rotation = transform.rotation * Quaternion.Euler(0, _rotX, 0);
        }
        if (_mouseDelta.y != 0) {
            _rotY = _mouseDelta.y * _mouseYSensistivity * Time.deltaTime * 50;
            _rotY = Mathf.Clamp(_rotY, _yMinMaxRotation.x, _yMinMaxRotation.y);
            transform.rotation = transform.rotation * Quaternion.Euler(-_rotY, 0, 0);
        }

        //Calculation for RotZ
        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.localRotation或localEulerAngles之类的东西。想象一下,如果我有一个角色,而不是使用世界坐标来旋转他的 POV,我想使用它自己的轴方向来做到这一点。我可以使用转换方法。旋转并将自定向作为第二个参数传递,它会起作用。但是我想找到一种方法在 y 轴上旋转我的游戏对象,直到达到某些限制。例如,将值限制为最小值 -90 和最大值 90。正如我所说,可以自由地更改我的代码,并向我建议您认为的最佳选择。多谢。

unity-game-engine 数学 矢量 旋转 三角函数

评论

0赞 MvG 3/11/2023
我对 Unity 的了解还不够,无法判断这是否是您需要的答案,但通常局部转换和全局转换之间的差异对应于您将它们组合在一起的顺序。因此,您当前写入的位置尝试交换该乘法的顺序。transform.rotation * Quaternion.Euler(…)
0赞 Vincent Mazzarella 3/11/2023
感谢您的回复!是的,这也是我学到的,但正如我所说,我的目标是找到一种方法来将轴旋转夹在最小值和最大值上,然后我需要一种方法来使用夹紧值在其相对坐标系上旋转对象!

答: 暂无答案