Unity中如何对四元数旋转的X轴角度实现区间限制
Unity 相机X轴俯仰旋转角度限制解决方案
核心思路
你当前的写法直接通过四元数乘法累加旋转,无法直接获取俯仰角度做范围限制。我们可以新增一个浮点变量单独存储X轴的俯仰角度,每次输入后先对角度值做范围裁剪,再转换为四元数赋值给目标旋转,就能实现角度限制。
修改步骤
- 新增3个变量:俯仰角度上下限、当前俯仰角度存储变量、鼠标灵敏度参数
- 替换原来直接对
targetLocalRotation做四元数乘法的逻辑,改为先累加俯仰输入到角度变量,再用Mathf.Clamp裁剪范围 - 用裁剪后的角度直接赋值
targetLocalRotation
完整修改后代码
public class CameraController : MonoBehaviour { public float cameraSmoothness = 5f; // 俯仰角度限制范围,可在Inspector面板自行调整 public float minPivotAngle = -80f; public float maxPivotAngle = 80f; // 鼠标旋转灵敏度,可自行调整 public float mouseSensitivity = 2f; private Quaternion targetGlobalRotation; // 存储当前X轴俯仰角度 private float currentPivotX = 0f; private void Start(){ targetGlobalRotation = transform.rotation; // 可选:如果初始相机自带俯仰角度,新增初始化逻辑处理欧拉角0-360转±180的问题 float initX = transform.localEulerAngles.x; currentPivotX = initX > 180 ? initX - 360 : initX; } private void Update(){ // 左右Y轴旋转逻辑保持不变,乘以灵敏度控制旋转速度 targetGlobalRotation *= Quaternion.Euler( Vector3.up * Input.GetAxis("Mouse X") * mouseSensitivity); // 俯仰X轴旋转改为角度变量累加+范围裁剪 currentPivotX += -Input.GetAxis("Mouse Y") * mouseSensitivity; currentPivotX = Mathf.Clamp(currentPivotX, minPivotAngle, maxPivotAngle); Quaternion targetLocalRotation = Quaternion.Euler(currentPivotX, 0, 0); transform.rotation = Quaternion.Lerp( transform.rotation, targetGlobalRotation * targetLocalRotation, cameraSmoothness * Time.deltaTime); } }
注意事项
- 建议
minPivotAngle和maxPivotAngle的取值范围控制在[-90, 90]之间,超出这个范围会出现相机俯仰翻转、视角颠倒的问题 - 如果需要更顺滑的旋转效果,可以把
Quaternion.Lerp替换为Quaternion.Slerp
内容的提问来源于stack exchange,提问作者Rex Tool
相关产品推荐
相关产品推荐

