unity3d 在对象的局部方向上旋转对象时出现问题

btxsgosb  于 2022-12-13  发布在  其他
关注(0)|答案(1)|浏览(171)

你好,我是新来的论坛!我希望我是在正确的部分!我试图旋转一个相机(这罕见的球员POV)使用鼠标delta和im旋转相机在本地坐标,而不是世界坐标,我想避免万向节锁定效应。我在网上读到的地方,为此目的,我必须使用四元数,我读到了如何做到这一点。问题是轴旋转在局部方向上移动效果很好,但其中一个轴正在失去其局部方向,它会跟随世界坐标方向旋转。我将张贴的代码,我希望有人能帮助我,告诉我哪里我做错了事情。谢谢!

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

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

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

    //Calculation for RotZ
    if (Input.GetKey(KeyCode.Q)) {
        _rotZ += +_mouseZSensistivity * Time.deltaTime * 50;
        if (_rotZ > 25) _rotZ = 25;
    }
    else {
        if (_rotZ > 0) {
            _rotZ -= 2 * _mouseZSensistivity * Time.deltaTime * 50;
            if (_rotZ < 0) _rotZ = 0;
        }
    }
    if (Input.GetKey(KeyCode.E)) {
        _rotZ += -_mouseZSensistivity * Time.deltaTime * 50;
        if (_rotZ < -25) _rotZ = -25;
    }
    else {
        if (_rotZ < 0) {
            _rotZ -= 2 * -_mouseZSensistivity * Time.deltaTime * 50;
            if (_rotZ > 0) _rotZ = 0;
        }
    }

    Quaternion currentRotation = Quaternion.identity;
    currentRotation = currentRotation * Quaternion.AngleAxis(_rotX, transform.up);
    currentRotation = currentRotation * Quaternion.AngleAxis(-_rotY, transform.right);
    currentRotation = currentRotation * Quaternion.AngleAxis(_rotZ, transform.forward);
    _camera.transform.localRotation = currentRotation;

    //head.transform.position = _camera.transform.position;
    //head.transform.rotation = _camera.transform.rotation;
}

四元数的最后一部分是我试图计算Angular ,以便在局部坐标中正确旋转的地方。

2ul0zpep

2ul0zpep1#

您根本不需要使用四元数。
您可以使用transform.EulerAngles来代替transform.rotation,或使用transform.localEulerAngles来代替transform.LocalRotation。
我肯定是把大写搞砸了。
假设您想将相机沿着局部x轴旋转10度。

transform.localEulerAngles = transform.localEulerAngles.Add(10,0,0);

据我所知就这些。如果你想了解更多,transfrom.localEulerAngles
如果您的问题完全不同,请告诉我,我可以更改或删除我的答案。

相关问题