Unity中相机垂直旋转180度后水平输入反转问题求助
解决太空自由视角相机水平输入反转问题
问题原因
你当前的代码通过直接累加欧拉角并赋值给transform.rotation,本质是基于世界坐标系分别绕X轴(俯仰)和Y轴(偏航)旋转。当相机垂直旋转180度后,相机局部的左右方向与世界坐标系的左右完全相反,此时水平鼠标输入对应的世界Y轴旋转就会和你视角预期的方向反转。
解决方案
改用基于相机局部坐标系的旋转方式,确保鼠标输入始终匹配当前视角的方向,同时避免欧拉角带来的万向锁问题。
方案1:使用Transform.Rotate(简单直观)
using UnityEngine; public class FreeLookCamera : MonoBehaviour { public float sensitivity = 2.0f; void Start() { Cursor.lockState = CursorLockMode.Locked; Cursor.visible = false; } void Update() { float mouseX = Input.GetAxis("Mouse X") * sensitivity; float mouseY = Input.GetAxis("Mouse Y") * sensitivity; // 绕相机局部X轴处理俯仰(鼠标向上=相机抬头) transform.Rotate(Vector3.right, -mouseY); // 绕相机局部Y轴处理偏航(鼠标向右=相机右转) transform.Rotate(Vector3.up, mouseX); } }
方案2:使用四元数叠加(性能更优,适合复杂场景)
四元数能避免欧拉角的万向锁问题,旋转逻辑更严谨:
using UnityEngine; public class FreeLookCamera : MonoBehaviour { public float sensitivity = 2.0f; void Start() { Cursor.lockState = CursorLockMode.Locked; Cursor.visible = false; } void Update() { // 加入Time.deltaTime保证帧率无关 float mouseX = Input.GetAxis("Mouse X") * sensitivity * Time.deltaTime; float mouseY = Input.GetAxis("Mouse Y") * sensitivity * Time.deltaTime; // 创建俯仰(绕局部X轴)和偏航(绕局部Y轴)的四元数 Quaternion pitch = Quaternion.AngleAxis(-mouseY, transform.right); Quaternion yaw = Quaternion.AngleAxis(mouseX, transform.up); // 先叠加俯仰,再叠加偏航(局部旋转顺序) transform.rotation *= pitch; transform.rotation *= yaw; } }
说明
两种方案都能实现无限制的太空自由视角:
- 鼠标上下移动控制相机俯仰(抬头/低头)
- 鼠标左右移动控制相机偏航(左转/右转)
- 无论相机旋转到任何角度,鼠标输入的方向始终与你当前视角的直观方向一致,不会出现反转现象
内容的提问来源于stack exchange,提问作者wobbl
相关产品推荐
相关产品推荐

