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/世界坐标的转换的更多相关文章

  1. 屏幕坐标和世界坐标的转换+对象池技术(3D打地鼠小游戏)

    游戏中可能经常会遇到需要某个物体跟着鼠标移动,然后又需要把物体放在某个鼠标指定的位置 实现方式 Camera.main.WorldToScreenPoint Camera.main.ScreenToW ...

  2. Android开发系列之屏幕密度和单位转换

    由于Android的开源性,所以目前市面上面Android手机的分辨率特别多,这样的话就给我适配带来了一定的难度.要想做好适配,我们首先应该明白什么是分辨率.PPI.屏幕大小等概念,还有在不同的屏幕密 ...

  3. openGL 坐标系的互相转换

    openGL坐标系包括旋转,平移,缩放被塞在一个矩阵里面. 坐标系之间的转换基础是矩阵的运算. 每个矩阵代表的坐标系,就是是原点坐标系通过旋转.平移,缩放得到的坐标系. 当一个矩阵右乘一个向量或是还有 ...

  4. UGUI世界坐标转换为UI本地坐标(游戏Hud的实现)

    实现世界坐标的原理是: 世界坐标和UGUI的坐标分属两个坐标系,他们之间是无法进行转换的,需要通过屏幕坐标系来进行转换(因为屏幕坐标是固定的),即先将游戏场景中的世界坐标通过游戏场景Camera转化为 ...

  5. Unity 坐标系转换

    在Unity中我们通常会用到以下几个坐标系下的点: 世界坐标系:World Space 简单来讲,我们通过 transform.position | transform.rotation 获取得到的位 ...

  6. (十)WebGIS中地理坐标与屏幕坐标间的转换原理

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.前言 地图本身是拥有坐标的,一般可以大致分为平面坐标和经纬度坐标, ...

  7. Android 7.1 屏幕旋转流程分析

    Android 7.1   屏幕旋转流程分析 一.概述 Android屏幕的旋转在framework主要涉及到三个类,结构如图 PhoneWindowManager:为屏幕的横竖屏转换的管理类. Wi ...

  8. Android 屏幕适配扫盲、教程

    转载请注明出处:http://blog.csdn.net/my_truelove/article/details/66584865 訪问 ruicb.com,一键抵达我的博客! 扫描左側或右下方二维码 ...

  9. osg实例介绍

    osg实例介绍 转自:http://blog.csdn.net/yungis/article/list/1 [原]osgmotionblur例子 该例子演示了运动模糊的效果.一下内容是转自网上的:原理 ...

随机推荐

  1. CORS (Cross Origin Resources Share) 跨域

    CORS 跨域 1 什么是跨域问题 基于安全考虑,浏览器会限制使用脚本发起任何跨域请求. 所谓的跨域请求,就是与当前页面的 http/ip/port 不一样的请求. 但在实际运用中,跨域获取数据的需求 ...

  2. CSS盒子模型之CSS3可伸缩框属性(Flexible Box)

    CSS盒子模型(下) 一.CSS3可伸缩框(Flexible Box) 可伸缩框属性(Flexible Box)是css3新添加的盒子模型属性,有人称之为弹性盒模型,它的出现打破了我们经常使用的浮动布 ...

  3. hdu2102

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u014303647/article/details/27705195 题目链接: pid=2102& ...

  4. 【转】numpy.random.randn()与rand()的区别

    转自: https://blog.csdn.net/u010758410/article/details/71799142 numpy中有一些常用的用来产生随机数的函数,randn()和rand()就 ...

  5. Kafka设计解析(三)Kafka High Availability (下)

    转载自 技术世界,原文链接 Kafka设计解析(三)- Kafka High Availability (下) 摘要 本文在上篇文章基础上,更加深入讲解了Kafka的HA机制,主要阐述了HA相关各种场 ...

  6. Carthage 的使用

    第一步,当然是安装 Carthage,网上找吧 第二步,找到你要用的那个仓库,eg:https://github.com/jiutianhuanpei/SHBPlayer 第三步,cd 到工程根目录下 ...

  7. 【js】插件—动效Velocity.js

    Velocity.js——加速JavaScript动画 一款替代jQuery的$ .animate()动效的插件.兼容IE8和Android2.3及以上. 相比较优点: 1.它比JQuery更快,并实 ...

  8. 原型和原型对象(__proto__和prototype)转

    看了之后我总算对原型继承有了更深刻的理解,做爱分享的姑娘,原文链接:理解Javascript 原型 我(个人)不喜欢的,就是讲原型时上来就拿类做比较的,所以我不会这样讲.不过我的确讲过构造器函数,在这 ...

  9. 一份可以落地靠谱iOS开发规范

    列出来的都是个人觉得在团队合作,代码阅读,代码维护中比较重要的一些点,没有什么空格 间距华而不实的东西在里面.涉及 命名规范.编码规范.代码管理规范 命名规范 项目名都遵循大驼峰命名.例如:MSMob ...

  10. 大数据入门:Maven项目的创建及相关配置

    目录 Maven项目的创建及相关配置 一.Maven的介绍 1.Maven是什么: 2.Maven作用: 3.Maven项目的目录结构: 4.Maven的三点坐标: 5.maven的pom文件: 6. ...