You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity中如何对四元数旋转的X轴角度实现区间限制

Unity 相机X轴俯仰旋转角度限制解决方案

核心思路

你当前的写法直接通过四元数乘法累加旋转,无法直接获取俯仰角度做范围限制。我们可以新增一个浮点变量单独存储X轴的俯仰角度,每次输入后先对角度值做范围裁剪,再转换为四元数赋值给目标旋转,就能实现角度限制。

修改步骤

  1. 新增3个变量:俯仰角度上下限、当前俯仰角度存储变量、鼠标灵敏度参数
  2. 替换原来直接对targetLocalRotation做四元数乘法的逻辑,改为先累加俯仰输入到角度变量,再用Mathf.Clamp裁剪范围
  3. 用裁剪后的角度直接赋值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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 04:06:03