Unity中屏幕坐标 视口坐标与世界坐标的关系

Unity涉足深了,会越来越觉得视口坐标和屏幕坐标越来越有意义
对这方面不了解会导致做功能及改问题的时候一筹莫展
而官方文档对此的记录不甚详细
这里参考了下面的文章,以及一些实验,对世界坐标 屏幕坐标和视口坐标的基本关系做个记录
Unity中屏幕坐标、视图坐标和世界坐标的相互转换

UGUI中某个UI元素的transform.position表示的坐标就是屏幕坐标

在官方文档中可以发现
视口坐标和屏幕坐标都是左下角是原点

常用的api有

//1.屏幕转世界坐标
Vector3 Camera.main.ScreenToWorldPoint(new Vector3(screenPos.x , screenPos.y , zInfo));
//2.世界转屏幕坐标
Vector3 Camera.main.WorldToScreenPoint(new Vector3(worldPos.x , worldPos.y , worldPos.z));
//3.世界转视口坐标
Vector3 Camera.main.WorldToViewportPoint();
//4.视口转世界坐标
Vector3 Camera.main.ViewportToWorldPoint(new Vector3(viewPortPos.x , viewPortPos.y , zInfo));
//5.视口转屏幕坐标
Vector3 Camera.main.ViewportToScreenPoint();
//6.屏幕转视口坐标
Vector3 Camera.main.ScreenToViewportPoint();

首先屏幕分辨率是1024*768
新建一个cube,transform如下图
在这里插入图片描述
新建一个摄像机,transform如下图
在这里插入图片描述
这时 cube在视野中心
在这里插入图片描述
新建Test脚本,挂载在摄像机下面

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour
{
    public GameObject testGo;

    // Start is called before the first frame update
    void Start()
    {
        Debug.LogError("WorldToScreenPoint " + Camera.main.WorldToScreenPoint(testGo.transform.position));
        Debug.LogError("WorldToViewportPoint " + Camera.main.WorldToViewportPoint(testGo.transform.position));

    }
}

指定testGo为cube
运行游戏,看到打印为
在这里插入图片描述
这里很明显在视野中心的时候 第一行的返回值x y分别是屏幕分辨率宽和高的一半
而第二行的x和y均是0.5
z均是10

我们让摄像机围绕Y轴旋转180度,这时cube刚好在摄像机后面,如图
在这里插入图片描述
我们来看下打印的情况
在这里插入图片描述
x和y不变,z均变成了-10

我们再将摄像机的旋转角度改成30度,看下打印值
在这里插入图片描述
这里稍微总结一下
WorldToScreenPoint和WorldToViewportPoint返回值的z值的含义
上面的结果为什么是8.7呢,图解一下就知道了
在这里插入图片描述
cos30 约等于 8.7
z值的含义其实是物体与摄像机的距离在摄像机的z轴方向上的投影
z值的大小是投影的长度
计算公式是
(物体到摄像机的距离连城的直线的长度 * 这条直线与摄像机z轴正方向所在直线的夹角的余弦值)的绝对值
z值的符号是投影的在摄像机的z轴正方向和是z轴负方向,正方形为+,负方向为-
总的来说
带符号的z值的计算公式就是
物体到摄像机的距离连城的直线的长度 * 这条直线与摄像机z轴正方向所在直线的夹角的余弦值


接下来我们把cube放置在屏幕边缘的位置
在这里插入图片描述

打印结果为
在这里插入图片描述
将cube移动到视野之外
在这里插入图片描述
1.25刚好是1280/1024
这里总结一下
WorldToViewportPoint返回的表示视口坐标的x和y值是
WorldToScreenPoint屏幕坐标的x和y值除以屏幕分辨率的宽和高得到的值

发布了84 篇原创文章 · 获赞 13 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_43149049/article/details/103103081