Unity_屏幕/Viewport/世界坐标的转换
Unity_屏幕/Viewport/世界/UI坐标的转换
参考:
https://www.jianshu.com/p/b5b6ac9ab145 -- 世界、视口、屏幕坐标转换
https://docs.unity3d.com/ScriptReference/RectTransformUtility.ScreenPointToLocalPointInRectangle.html -- API
不同坐标系:
世界坐标系: World Space
transform.position/ transform.rotation都是基于世界坐标系的
游戏场景的原点世界坐标为(0,0,0)
观察坐标: Eye Space
在Game视图中的画面是由摄像机提供的,而基于某一个摄像机的坐标系即为观察坐标系
即把摄像机的位置作为原点位置
视口坐标: View Port
针对整个游戏画面,左下角为(0,0),右上角为(1,1)
设计分屏功能时可以通过设置摄像机所占的视口空间来控制
屏幕坐标: Screen Space
与游戏画面的分辨率有关,注意是游戏屏幕画面的分辨率
屏幕的左下角为(0,0), 右上角为(Screen.width, Screen.height)
获取鼠标位置(Input.mousePosition)时的坐标即为屏幕坐标,返回的为Vector3(x,y,0)
常见方法:
// 1.屏幕转世界坐标
Vector3 Camera.main.ScreenToWorldPoint(new Vector3(screenPos.x , screenPos.y , zInfo));
// 世界转屏幕坐标
Vector3 Camera.main.WorldToScreenPoint(new Vector3(worldPos.x , worldPos.y , worldPos.z));
// 2.世界转视口坐标
Vector3 Camera.main.WorldToViewportPoint();
// 视口转世界坐标
Vector3 Camera.main.ViewportToWorldPoint(new Vector3(viewPortPos.x , viewPortPos.y , zInfo));
// 3.视口转屏幕坐标
Vector3 Camera.main.ViewportToScreenPoint();
// 屏幕转视口坐标
Vector3 Camera.main.ScreenToViewportPoint();
屏幕坐标与世界坐标的转换:
注意: z表示的是世界坐标相对于摄像机的深度信息
例: 世界坐标(0, 0, 1),摄像机位置(0, 0, -10) -- WorldToScreenPoint()返回结果为(Screen.width/2, Screen.height/2, 1-(-10))
视口坐标和世界坐标的转换也类似:
z也表示的为深度信息(距离)
应用:
1. 有些游戏会对物体的运动范围进行限制,防止跑出边界,比如雷电
思路:
用世界坐标和视口坐标的转化
将物体的视口坐标限制在(0,0,x)~(1,1,x)内/ 或用(0,0,x)(1,1,x)的视口坐标算出物体的世界坐标的x和y的限制(四条边界)
注意:
上述雷电游戏由于摄像机使用了正交投影,所以z轴数据没有关系
但是如果使用的是透视投影,则在不同深度下的边界范围会发生变化,因此需要输入正确的z轴数据
屏幕坐标转UI坐标:
方法: 将屏幕上的一点screenPoint,转换为UI RectTransform的局部空间中的坐标
public static bool ScreenPointToLocalPointInRectangle(RectTransform rect, Vector2 screenPoint, Camera cam, out Vector2 localPoint);
参数详解:
RectTransform rect: The RectTransform to find a point inside
Camera cam: The camera associated with the screen space position
1. For a RectTransform in a Canvas set to Screen Space-Overlay mode, cam parameter should be null.
2. When ScreenPointToLocalPointInRectangle is used from within an event handler that provides a PointerEventData,
the correct camera can be obtained by using PointerEventData.enterEventData (for hover)
or PointerEventData.pressedEventCamera (for click)
it will auto use the correct camera( or null) for the given event
out Vector2 localPoint: Point in local space of the rect
return: returns true if the plane of the RectTransform in hit, regardless of whether the point is inside the rect
整个平面,而不是矩形内部
Unity_屏幕/Viewport/世界坐标的转换的更多相关文章
- 屏幕坐标和世界坐标的转换+对象池技术(3D打地鼠小游戏)
游戏中可能经常会遇到需要某个物体跟着鼠标移动,然后又需要把物体放在某个鼠标指定的位置 实现方式 Camera.main.WorldToScreenPoint Camera.main.ScreenToW ...
- Android开发系列之屏幕密度和单位转换
由于Android的开源性,所以目前市面上面Android手机的分辨率特别多,这样的话就给我适配带来了一定的难度.要想做好适配,我们首先应该明白什么是分辨率.PPI.屏幕大小等概念,还有在不同的屏幕密 ...
- openGL 坐标系的互相转换
openGL坐标系包括旋转,平移,缩放被塞在一个矩阵里面. 坐标系之间的转换基础是矩阵的运算. 每个矩阵代表的坐标系,就是是原点坐标系通过旋转.平移,缩放得到的坐标系. 当一个矩阵右乘一个向量或是还有 ...
- UGUI世界坐标转换为UI本地坐标(游戏Hud的实现)
实现世界坐标的原理是: 世界坐标和UGUI的坐标分属两个坐标系,他们之间是无法进行转换的,需要通过屏幕坐标系来进行转换(因为屏幕坐标是固定的),即先将游戏场景中的世界坐标通过游戏场景Camera转化为 ...
- Unity 坐标系转换
在Unity中我们通常会用到以下几个坐标系下的点: 世界坐标系:World Space 简单来讲,我们通过 transform.position | transform.rotation 获取得到的位 ...
- (十)WebGIS中地理坐标与屏幕坐标间的转换原理
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.前言 地图本身是拥有坐标的,一般可以大致分为平面坐标和经纬度坐标, ...
- Android 7.1 屏幕旋转流程分析
Android 7.1 屏幕旋转流程分析 一.概述 Android屏幕的旋转在framework主要涉及到三个类,结构如图 PhoneWindowManager:为屏幕的横竖屏转换的管理类. Wi ...
- Android 屏幕适配扫盲、教程
转载请注明出处:http://blog.csdn.net/my_truelove/article/details/66584865 訪问 ruicb.com,一键抵达我的博客! 扫描左側或右下方二维码 ...
- osg实例介绍
osg实例介绍 转自:http://blog.csdn.net/yungis/article/list/1 [原]osgmotionblur例子 该例子演示了运动模糊的效果.一下内容是转自网上的:原理 ...
随机推荐
- 洛谷 P1251 餐巾计划问题(线性规划网络优化)【费用流】
(题外话:心塞...大部分时间都在debug,拆点忘记加N,总边数算错,数据类型标错,字母写错......) 题目链接:https://www.luogu.org/problemnew/show/P1 ...
- SSH环境搭建,配置整合初步(一)
1,新Webproject.并把编码设为utf-8(全部的都是uft8数据库也是,就不会乱码了)2.加入框架环境JunitStruts2Hibernate Spring3,整合SSHStruts2与S ...
- python伪装网页访问
# -*- coding:utf8 -*-#import urllib.request#url =' http://www.douban.com/'#webPage=urllib.request.ur ...
- vue打包以后,除了首页意外,其余页面是空白
针对vue项目打包以后,除了首页意外,其余页面是空白的,需要在服务端进行配置. 原因是router中,mode是history引起的 如果是nginx,改成如下: location / { root ...
- node-webkit,nwjs 系统托盘【Tray】实践
参照自:https://www.cnblogs.com/xuanhun/p/3678943.html Tray包含title.tooltip.icon.menu.alticon五个属性. title属 ...
- IntelliJ IDEA使用技巧整理
1 .写代码时用 Alt-Insert ( Code|Generate… )可以创建类里面任何字段的 getter 与 setter 方法. 2 .右键点击断点标记(在文本的左边栏里)激活速查菜单,你 ...
- vue+vux-ui+axios+mock搭建一个简单vue框架
1.首先感谢同事 2.之前一直在做angularjs的项目,目前vue火热,所以自己搭建了一个的vue框架,在此作为记录 vue+vux-ui这里就不介绍了,有很多博客都写的很详细了. 下面简单记录下 ...
- 【 腾讯敏捷转型No.4 】为什么敏捷团队不要超过15人
早期,腾讯公司的架构是比较简单的.从上至下分别是:公司——商业单元(BU)——部门——组——员工,每个部门基本上就是负责一个大的产品,每个组都是按照专业进行分工和管理,例如:产品组.终端组.后台组.设 ...
- Ubuntu 18.04安装MongoDB 4.0
首先,导入包管理的公钥. Ubuntu包管理工具(即dpkg和apt)要求发行商使用GPG密钥签署包,从而确保包的一致性和真实性. sudo apt-key adv --keyserver hkp:/ ...
- mysql8.0版本skip-grant-tables出现的新问题
MySQL 初始化 mysqld --initialize 的时候会有密码,就这个样子, 可是毕竟总有人跟我一样,不熟悉安装过程,没有注意这一密码这一项,导致你现在不知道密码的尴尬处境,或者说你是正常 ...