Unity3D由于是在三维世界中编程,而最终的结果是需要反馈到肉眼所示的2D屏幕之上的。这就产生了一种比较需要考虑的问题,尤其在一些涉及屏幕与unity3d的3D世界交互的情况。网络上对于这方面的文字,大部分罗列了许许多多文字与代码或者API,甚至连什么视口坐标也带上了。其实在于我个人看来,关键是世界坐标与屏幕坐标之间的互转。下面就来和大家介绍下Unity3D中的世界坐标与屏幕坐标。

在Unity3D中一打开就会有一个主照相机Main Camera,根据版本不同的初始坐标会在不同的位置。拿Unity3D 4.x的(0,-1,-10)做例子,他的视距,默认是0.3~1000。

主摄像机会对外无间断的发出投影面,将投影面所截取得到的东西,通通投影到屏幕。比如下图,这是一张极其简单的图,(0,-1,-10)的主摄像机将(0,0,0)的正方体投影出来的结果。

现在这个正方体的世界坐标是(0,0,0),如果我们要获取屏幕坐标该怎么做呢?这注定需要用脚本来获取的,而且根据上面的示意图大家也可以知道,屏幕的大小的不同导致最后产生出来的屏幕坐标是不同的。因为Unity3D对屏幕坐标定义是这样的:

以下脚本展示了屏幕坐标和世界坐标的互转:

using UnityEngine;

using System.Collections;

public class CoordinateChange : MonoBehaviour

void Start()

Debug.Log("屏幕宽:" + Screen.width + "高:" + Screen.height);//获取屏幕的长和宽

Vector2 screenPos = Camera.main.WorldToScreenPoint(new Vector3(0, 0, 0));//世界坐标(0,0,0),一般可以用transform.position获取->屏幕坐标

//屏幕坐标->世界坐标

Debug.Log(screenPos.x + "," + screenPos.y);

Vector3 worldPos1 = Camera.main.ScreenToWorldPoint(new Vector3(0, 0, Camera.main.nearClipPlane));

Debug.Log(worldPos1.x + "," + worldPos1.y + "," + worldPos1.z);

Vector3 worldPos2 = Camera.main.ScreenToWorldPoint(new Vector3(Screen.width, Screen.height, -Camera.main.transform.position.z));

Debug.Log(worldPos2.x + "," + worldPos2.y + "," + worldPos2.z);

运行结果如下:

上面脚本有几点需要说明的:

1、Camera.main.XX能够直接对主摄像机操作,无须像网上部分文章需要利用的GameObject.Find之类的找主摄像机。

2、世界坐标与屏幕坐标互转直接就是用WorldToScreenPoint/ScreenToWorldPoint两个方法,这方法凡是照相机对象就有。在部分设置多摄像机编程的程序,就是转换到调用的摄像机所对应的屏幕的世界。

3、WorldToScreenPoint世界坐标转屏幕坐标,很好理解,大家也看到(0,0,0)这个世界的三维坐标转到的(431.5,174.4537)这个屏幕的二维坐标Vector2 screenPos。这里屏幕宽:863高:422,处于(0,0,0)的长方体被投影到屏幕的中央偏下的位置,这和实际是吻合的。

当然实际操作中,其实这个屏幕坐标的多少对于我们来说是没意义的,但这个屏幕坐标所处的位置是在屏幕的百分之多少是很有意义的。所以,这一般还要配合Screen.width/height求屏幕的宽和高用。

4、对于ScreenToWorldPoint,屏幕坐标转世界坐标,可能有人会有疑问,屏幕坐标不是一个二维坐标,怎么这里试图对一个三维坐标转换?还在Z轴附带一些奇怪奇怪的位置。这里的Z轴,是投影面底部所处的Z轴位置距离摄像机Z轴的多少。上面的投影示意图,已经可以说明投影面是多个的,但只会投影到一个2D屏幕平面而已,世界中的物体/对象只能有一个,那么就形成一种 一个世界坐标只会对应一个屏幕坐标,一个屏幕坐标可能对应多个世界坐标。所以我们要补上一个Z轴,告诉程序,我要的是哪个屏幕坐标。

这里展示了将(0,0)这个左下角的屏幕坐标,转到距离摄像机最近的投影面上面,要拿这个投影面,如脚本所示,可以直接用Camera.main.nearClipPlane来取。还展示了将(Screen.width, Screen.height)这个右上角的屏幕坐标,放到Z轴为0,也就是世界屏幕的这个位置,因为摄像机所处的Z=-10,要放到世界坐标z=0,所以这里的Z轴要填上-Camera.main.transform.position.z,刚好就是-10-0。结果如上图所示。

理论上,投影面距离摄像头越近,他的投影面越小。所以大家看到如果转到距离摄像机最近的投影面上面,边角的坐标是0.x级别的,放到z=0这个投影面上面,边角的坐标则去到个位数级别。

unity 获取屏幕角坐标_Unity3D世界坐标与屏幕坐标相关推荐

  1. unity获取脚本组件_Unity3D【脚本】获取游戏物体的Animator组件,并且修改动画属性 | 学步园...

    using UnityEngine; using System.Collections; public class PlayAminitors : MonoBehaviour { public Gam ...

  2. unity获取麦克风音量_Unity3d:检查麦克风输入音量

    我想在可视化表示中使用用户在Unity3d中输入的麦克风音量 . 所以我'd like to get a value between 0 and 1 that tell how loud the us ...

  3. Unity 获取鼠标点击转换世界坐标

    /// <summary> /// 获取鼠标点击坐标 /// </summary> Vector3 screenPosition;//将物体从世界坐标转换为屏幕坐标 Vecto ...

  4. unity urp 获取屏幕深度法向颜色纹理以及从深度纹理重构世界空间坐标

    之前写过如何从屏幕空间获取uv,但是讲的不完善,https://blog.csdn.net/qq_30100043/article/details/125883016 而且还没有说如何使用深度重新构建 ...

  5. 【Unity3D】世界坐标与屏幕坐标

    Unity3D由于是在三维世界中编程,而最终的结果是需要反馈到肉眼所示的2D屏幕之上的.这就产生了一种比较需要考虑的问题,尤其在一些涉及屏幕与Unity3D的3D世界交互的情况.网络上对于这方面的文字 ...

  6. Visual C++——获取屏幕大小、窗口大小、对话框大小和位置、控件大小和位置

    解决方案 获取屏幕大小 //下边两个函数获取的是显示屏幕的大小,但不包括任务栏等区域int cx = GetSystemMetrics(SM_CXFULLSCREEN); int cy = GetSy ...

  7. Python获取屏幕分辨率大小

    获取屏幕大小有两种方法可以办到: 1.wxPython里的 2.win32api  1 # coding:gb2312  2 # wxApp.py   3 # author: aoogur  4 im ...

  8. Android 获取屏幕尺寸与密度

    遇到一个问题,我的地图浮标图片在WVGA手机上正好,在QVGA上就显的太大,所以我要根据屏幕的不同调整浮标的大小使其在QVGA大小合适.有的同事提出了依据分辨率来区分不同的屏幕,但是单WVGA就支持好 ...

  9. android获取导航栏宽高,Android获取屏幕的宽高度、状态栏、标题栏、导航栏、编辑区域高度...

    目录 0.相关文章: 1.获取屏幕款高度 代码: /** * 获取屏幕宽度 * * @param context 上下文对象 * @return int */ public static int ge ...

  10. android利用反射调用截屏api,Android利用反射机制调用截屏方法和获取屏幕宽高的方法...

    想要在应用中进行截屏,可以直接调用 View 的 getDrawingCache 方法,但是这个方法截图的话是没有状态栏的,想要整屏截图就要自己来实现了. 还有一个方法可以调用系统隐藏的 screen ...

最新文章

  1. python培训学费多少钱-深圳龙华新区python编程培训机构,从哪几方面选择好学校...
  2. 编辑距离:最长公共子序列-LCS问题
  3. poj 2262 Goldbach's Conjecture(筛素数)
  4. 我们的开源项目-2013年度开源社区线下聚会《JEECG微云快速开发平台-SAAS企业应用在线开发与微信移动应用》PPT分享
  5. Notepad++如何对比文件 Notepad++对比两个文件代码方法
  6. C Tricks(九)—— 获取文件大小与申请数组空间
  7. 并查集算法学习(转)
  8. -fembed-bitcode is not supported on versions of iOS prior to 6.0 iOS
  9. 学生管理系统(软件工程)
  10. you-get遇到的坑
  11. Windows账户设置指南
  12. Windows Terminal 快速安装
  13. 风电场气象服务器是什么系统,气象站资料在风电场前期工作中到底有多重要?...
  14. Analyzing Crash Reports——分析崩溃报告之一
  15. 中文垂直搜索引擎、行业搜索引擎大全(最新计137家) (转贴)
  16. vue移动端高德地图的使用及实现最简单的地图功能
  17. js中使用正则表达式 禁止输入英文逗号
  18. win7一直卡在正在启动windows
  19. 《笨办法学python》学习心得
  20. 【Unity VR开发】结合VRTK4.0:手柄操作运动与旋转

热门文章

  1. 【机器学习基石】感知机模型+PLA(二)
  2. MINI2440 TD35 P35触摸屏不能使用? 让我们来把一线触控改四线触控
  3. Amos24程序安装及注意事项
  4. 什么是OFD格式文档?一文教你读懂OFD格式文档
  5. 全能电子地图下载器 离线地图 介绍(支持几十种地图下载) 最新版 3.6 (2015.6.13)
  6. Linux svn 命令每次都要输入密码o(╯□╰)o
  7. gsp计算机管理权限,新gsp计算机权限设置
  8. CH579 SPI WS2812B
  9. 人人商城小程序微信支付配置
  10. 易语言高级表格如何右击选择当前项,再弹出右击菜单?