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

Unity中如何计算ScreenToWorld坐标转换系数

Unity 屏幕坐标转世界坐标预计算系数方案

针对需要在Awake/Start阶段完成转换逻辑预计算、后续逐帧直接复用系数完成屏幕点转世界点的需求,可按相机投影类型分别实现,全程无需逐帧调用Unity内置的ScreenToWorldPoint接口。


正交相机(2D项目通用)

正交相机的投影为完全线性变换,只要相机正交尺寸、屏幕分辨率、相机视口矩形不发生动态修改,预计算的转换系数永久有效。

Awake/Start阶段预计算逻辑

private Camera targetCam;
private float pixelToWorldScale;
private Vector3 screenZeroPointWorld;
private const float targetZ = 0f; // 替换为你需要的目标世界坐标Z值

void Awake()
{
    targetCam = Camera.main;
    // 单像素对应世界单位长度
    float orthoCamHeight = targetCam.orthographicSize * 2f;
    pixelToWorldScale = orthoCamHeight / Screen.height;
    // 屏幕(0,0)像素点对应的世界坐标基准值
    screenZeroPointWorld = targetCam.ScreenToWorldPoint(new Vector3(0, 0, targetCam.nearClipPlane));
}

逐帧转换逻辑

Vector3 ScreenToWorldFast(Vector2 screenPos)
{
    float worldX = screenZeroPointWorld.x + screenPos.x * pixelToWorldScale;
    float worldY = screenZeroPointWorld.y + screenPos.y * pixelToWorldScale;
    return new Vector3(worldX, worldY, targetZ);
}

透视相机(3D项目通用)

透视相机存在近大远小的透视畸变,但只要固定转换平面到相机的距离(即原ScreenToWorldPoint接口传入的Z深度值),该平面上的像素到世界坐标的映射依然是线性关系,可预计算系数复用。

Awake/Start阶段预计算逻辑

private Camera targetCam;
private Vector3 screenZeroPointWorld;
private Vector3 xAxisPerPixel;
private Vector3 yAxisPerPixel;
private const float convertDepth = 10f; // 替换为你实际使用的转换平面深度(点到相机的距离)

void Awake()
{
    targetCam = Camera.main;
    // 取固定深度下屏幕三个角点的世界坐标
    Vector3 leftBottom = targetCam.ScreenToWorldPoint(new Vector3(0, 0, convertDepth));
    Vector3 rightBottom = targetCam.ScreenToWorldPoint(new Vector3(Screen.width, 0, convertDepth));
    Vector3 leftTop = targetCam.ScreenToWorldPoint(new Vector3(0, Screen.height, convertDepth));
    // 预计算单像素在X/Y轴上的世界坐标步进值
    xAxisPerPixel = (rightBottom - leftBottom) / Screen.width;
    yAxisPerPixel = (leftTop - leftBottom) / Screen.height;
    screenZeroPointWorld = leftBottom;
}

逐帧转换逻辑

Vector3 ScreenToWorldFast(Vector2 screenPos)
{
    return screenZeroPointWorld + xAxisPerPixel * screenPos.x + yAxisPerPixel * screenPos.y;
}

使用注意事项

  • 预计算完成后,如果相机参数(正交尺寸、FOV、位置、旋转、视口矩形)、屏幕分辨率、转换目标深度发生变动,需要重新执行一次预计算逻辑,否则结果会出现偏差
  • 该方案的逐帧转换仅涉及基础浮点乘加运算,性能比内置ScreenToWorldPoint高3~5倍,适合大批量点位逐帧转换的场景
  • 禁止在预计算阶段缓存相机的变换矩阵自行做矩阵乘法,Unity不同版本的矩阵空间定义存在细微差异,用上述角点采样的方式兼容性最强,不会出现版本适配问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 22:06:26