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

Unity相机平移问题:仅单向移动且ScreenToWorldPoint返回X恒为0

相机平移问题的解决方案

问题原因分析

1. X坐标始终为0的原因

Input.mousePosition是屏幕空间坐标,其Z分量默认是0。ScreenToWorldPoint需要这个Z值确定屏幕点对应的世界空间深度——对于正交相机来说,这个值应等于相机到目标交互平面的距离(通常取相机位置Z值的相反数,因为正交相机一般朝向-z轴)。若Z值为0,转换后的世界坐标会被限制在相机近裁剪平面上,导致X/Y分量计算错误,出现X始终为0的情况。

2. 仅单方向平移的原因

本质和第一个问题同源:错误的世界坐标转换导致位移差值mouseWorldPosDiff异常,进而限制了相机的移动方向。

修正后的代码

private Vector3 mouseWorldPosStart;

private void Pan()
{
    // 右键按下时记录初始鼠标对应的世界位置(手动设置Z值)
    if (Input.GetMouseButtonDown(1))
    {
        Vector3 mouseScreenPos = Input.mousePosition;
        // 正交相机下,Z值设为相机到目标平面的距离,这里取相机位置Z值的相反数
        mouseScreenPos.z = -Camera.main.transform.position.z;
        mouseWorldPosStart = Camera.main.ScreenToWorldPoint(mouseScreenPos);
    }

    // 按住右键时计算位移并平移相机
    if (Input.GetMouseButton(1))
    {
        Vector3 newMouseScreenPos = Input.mousePosition;
        newMouseScreenPos.z = -Camera.main.transform.position.z;
        var newMousePosition = Camera.main.ScreenToWorldPoint(newMouseScreenPos);

        Vector3 mouseWorldPosDiff = mouseWorldPosStart - newMousePosition;
        // 每次平移后更新初始位置,避免累积位移偏差
        mouseWorldPosStart = newMousePosition;
        
        transform.position += mouseWorldPosDiff;
    }
}

额外说明

  • 若使用透视相机,Z值需设置为相机到交互平面的实际距离(比如地面所在平面的深度值)。
  • 代码中增加了mouseWorldPosStart = newMousePosition的更新逻辑,确保每帧都基于当前鼠标位置计算位移,避免持续按住右键时出现的位移累积错误。

内容的提问来源于stack exchange,提问作者tomy3

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 11:00:56