1

我有一个问题,我正在制作一个平滑的相机移动脚本,但我不知道如何正确夹紧相机旋转。

实际上,相机是玩家对象的子对象。

当按下 WASD 时,播放器会旋转,但由于脚本,相机不会跟随此旋转。

            var mouseDelta = new Vector2(Input.GetAxisRaw("Mouse X"), Input.GetAxisRaw("Mouse Y"));

            mouseDelta = Vector2.Scale(mouseDelta, CursorSensitivity); //new Vector2(CursorSensitivity.x * smoothing.x, CursorSensitivity.y * smoothing.y));

            if (m_doSmooth)
            {
                _smoothMouse.x = Mathf.Lerp(_smoothMouse.x, mouseDelta.x, 1f / smoothing.x);
                _smoothMouse.y = Mathf.Lerp(_smoothMouse.y, mouseDelta.y, 1f / smoothing.y);

                // Find the absolute mouse movement value from point zero.
                _mouseAbsolute += _smoothMouse;
            }
            else
                _mouseAbsolute += mouseDelta;

            if (clampInDegrees.x > 0)
                _mouseAbsolute.x = Mathf.Clamp(_mouseAbsolute.x, -clampInDegrees.x, clampInDegrees.x);

            if (clampInDegrees.y > 0)
                _mouseAbsolute.y = Mathf.Clamp(_mouseAbsolute.y, -clampInDegrees.y, clampInDegrees.y);

            Camera.transform.rotation = Quaternion.AngleAxis(-_mouseAbsolute.x, Vector3.up) //transform.InverseTransformDirection(Vector3.up))
                * Quaternion.AngleAxis(_mouseAbsolute.y, Vector3.right);

好吧,问题很简单,固定的旋转值是全局的,因为我们设置 Camera.transform.rotation而不是Camera.transform.localRotation.

这会发生:链接到视频

该脚本根据玩家轮换来钳制值。

所以如果我们在玩家的 X 轴上有一个旋转 (eulerAngle) 90 度,并且钳制值是从 90 到 -90,那么钳制的旋转将是 0, 180,而不是 -90, 90。

但如果我改变rotation这种localRotation情况:链接到视频

我还尝试了以下方法:

            Vector3 euler = Camera.transform.eulerAngles;

            if (clampInDegrees.x > 0)
                euler.x = ClampAngle(euler.x, -clampInDegrees.x, clampInDegrees.x);

            if (clampInDegrees.x > 0)
                euler.y = ClampAngle(euler.y, -clampInDegrees.y, clampInDegrees.y);

            Camera.transform.eulerAngles = euler;

设置后localRotation......但这只会做出奇怪的事情。例如,当在旋转钳位时达到最小钳位值时,将返回最大钳位值。

4

0 回答 0