unity 获取屏幕角坐标_Unity3D世界坐标与屏幕坐标
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世界坐标与屏幕坐标相关推荐
- unity获取脚本组件_Unity3D【脚本】获取游戏物体的Animator组件,并且修改动画属性 | 学步园...
using UnityEngine; using System.Collections; public class PlayAminitors : MonoBehaviour { public Gam ...
- unity获取麦克风音量_Unity3d:检查麦克风输入音量
我想在可视化表示中使用用户在Unity3d中输入的麦克风音量 . 所以我'd like to get a value between 0 and 1 that tell how loud the us ...
- Unity 获取鼠标点击转换世界坐标
/// <summary> /// 获取鼠标点击坐标 /// </summary> Vector3 screenPosition;//将物体从世界坐标转换为屏幕坐标 Vecto ...
- unity urp 获取屏幕深度法向颜色纹理以及从深度纹理重构世界空间坐标
之前写过如何从屏幕空间获取uv,但是讲的不完善,https://blog.csdn.net/qq_30100043/article/details/125883016 而且还没有说如何使用深度重新构建 ...
- 【Unity3D】世界坐标与屏幕坐标
Unity3D由于是在三维世界中编程,而最终的结果是需要反馈到肉眼所示的2D屏幕之上的.这就产生了一种比较需要考虑的问题,尤其在一些涉及屏幕与Unity3D的3D世界交互的情况.网络上对于这方面的文字 ...
- Visual C++——获取屏幕大小、窗口大小、对话框大小和位置、控件大小和位置
解决方案 获取屏幕大小 //下边两个函数获取的是显示屏幕的大小,但不包括任务栏等区域int cx = GetSystemMetrics(SM_CXFULLSCREEN); int cy = GetSy ...
- Python获取屏幕分辨率大小
获取屏幕大小有两种方法可以办到: 1.wxPython里的 2.win32api 1 # coding:gb2312 2 # wxApp.py 3 # author: aoogur 4 im ...
- Android 获取屏幕尺寸与密度
遇到一个问题,我的地图浮标图片在WVGA手机上正好,在QVGA上就显的太大,所以我要根据屏幕的不同调整浮标的大小使其在QVGA大小合适.有的同事提出了依据分辨率来区分不同的屏幕,但是单WVGA就支持好 ...
- android获取导航栏宽高,Android获取屏幕的宽高度、状态栏、标题栏、导航栏、编辑区域高度...
目录 0.相关文章: 1.获取屏幕款高度 代码: /** * 获取屏幕宽度 * * @param context 上下文对象 * @return int */ public static int ge ...
- android利用反射调用截屏api,Android利用反射机制调用截屏方法和获取屏幕宽高的方法...
想要在应用中进行截屏,可以直接调用 View 的 getDrawingCache 方法,但是这个方法截图的话是没有状态栏的,想要整屏截图就要自己来实现了. 还有一个方法可以调用系统隐藏的 screen ...
最新文章
- python培训学费多少钱-深圳龙华新区python编程培训机构,从哪几方面选择好学校...
- 编辑距离:最长公共子序列-LCS问题
- poj 2262 Goldbach's Conjecture(筛素数)
- 我们的开源项目-2013年度开源社区线下聚会《JEECG微云快速开发平台-SAAS企业应用在线开发与微信移动应用》PPT分享
- Notepad++如何对比文件 Notepad++对比两个文件代码方法
- C Tricks(九)—— 获取文件大小与申请数组空间
- 并查集算法学习(转)
- -fembed-bitcode is not supported on versions of iOS prior to 6.0 iOS
- 学生管理系统(软件工程)
- you-get遇到的坑
- Windows账户设置指南
- Windows Terminal 快速安装
- 风电场气象服务器是什么系统,气象站资料在风电场前期工作中到底有多重要?...
- Analyzing Crash Reports——分析崩溃报告之一
- 中文垂直搜索引擎、行业搜索引擎大全(最新计137家) (转贴)
- vue移动端高德地图的使用及实现最简单的地图功能
- js中使用正则表达式 禁止输入英文逗号
- win7一直卡在正在启动windows
- 《笨办法学python》学习心得
- 【Unity VR开发】结合VRTK4.0:手柄操作运动与旋转
热门文章
- 【机器学习基石】感知机模型+PLA(二)
- MINI2440 TD35 P35触摸屏不能使用? 让我们来把一线触控改四线触控
- Amos24程序安装及注意事项
- 什么是OFD格式文档?一文教你读懂OFD格式文档
- 全能电子地图下载器 离线地图 介绍(支持几十种地图下载) 最新版 3.6 (2015.6.13)
- Linux svn 命令每次都要输入密码o(╯□╰)o
- gsp计算机管理权限,新gsp计算机权限设置
- CH579 SPI WS2812B
- 人人商城小程序微信支付配置
- 易语言高级表格如何右击选择当前项,再弹出右击菜单?