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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 09:16:01