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

在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这个投影面上面,边角的坐标则去到个位数级别。

【Unity3D】世界坐标与屏幕坐标相关推荐

  1. 【Unity3D日常开发】Unity3D中实现屏幕坐标和3维空间坐标的转化

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有 ...

  2. Cocos Creator 世界坐标转屏幕坐标

    Cocos creator某一坐标转屏幕坐标(screen position),以前都是屏幕坐标转世界坐标. 先上代码为敬(只是提供一种思路,有更好的实现和建议欢迎留言) //Scene的设计分辨率是 ...

  3. [Unity][UGUI][NGUI]地图指示UI屏幕边缘显示

    UGUI和NGUI 的屏幕坐标 指示UI 的localRotation.z NGUI NGUI_ui.transform.localPosition = new Vector3(x, y, 0); U ...

  4. ThreeJS 屏幕坐标与世界坐标互转

    文章目录 屏幕坐标系和标准设备坐标 屏幕坐标转世界坐标 世界坐标转屏幕坐标   要理解坐标系间的转换过程,需要提前了解: ThreeJS 中的几种坐标系 屏幕坐标系和标准设备坐标系   不想看链接中的 ...

  5. Unity3D的四种坐标系

    [Unity3D的四种坐标系] 1.World Space(世界坐标):我们在场景中添加物体(如:Cube),他们都是以世界坐标显示在场景中的.transform.position可以获得该位置坐标. ...

  6. 【浅墨Unity3D Shader编程】之一 夏威夷篇:游戏场景的创建 第一个Shader的书写

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/40723789 作者:毛星云(浅墨) ...

  7. Unity3D学习日记6

    1.坐标转换 解析: [1]物体的世界坐标到屏幕坐标的转换 // cb代表场景中的一个方块物体,得到的vector3中的z为相机离cube物体的远近 Camera.main.WorldToScreen ...

  8. Unity3d八 Unity使用的坐标系

    unity recttransform 和transform有什么区别http://www.jianshu.com/p/dbefa746e50d 前言 需要在代码中调整改变UI控件的属性,比如位置.大 ...

  9. 【Unity3D Shader编程】之一 夏威夷篇:游戏场景的创建 第一个Shader的书写

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/40723789 作者:毛星云(浅墨) ...

最新文章

  1. MySQL00-这都不知道还TM学啥MySQL
  2. mongodb--常用命令
  3. lombok中的@Data注解与MyBatis的懒加载机制冲突解决
  4. 牛客网_PAT乙级1007_A除以B (20)
  5. 圆弧半径计算图解_刀尖圆弧半径补偿G40,G41,G42 左补偿右补偿你真的能搞清楚吗...
  6. Android Studio apk 打包流程
  7. linux线程能删除自身吗,Linux内核本身和进程的区别 内核线程、用户进程、用户...
  8. DataSource数据源定义
  9. C# string byte[] 转换
  10. Content-type 对照表
  11. 测试简单读取opml
  12. 携程机票业务数据仓库实践
  13. 【爬虫】链接二手房信息爬取
  14. 子桓说:成人的世界,有钱就意味着一切
  15. 根据四个点坐标排列出左上右上右下左下位置关系
  16. matlab--积分计算
  17. CF85D Sum of Medians
  18. 飞控学习常见典型问题集QA——无名创新(2022年4月15日)
  19. ko 绑定html,WeX5的正确打开方式(3)——绑定机制
  20. Oracle AWR报告指标全解析-11011552

热门文章

  1. 【Docker】1、认识 Docker 和安装 Docker
  2. 【PlayStation】〖问题〗PS4手柄不识别,可能是你安装了向日葵软件
  3. (可远程)ESP8266读DHT11温湿度,APP inventor制作app实时显示
  4. 社区|京品高科智能售卖解决方案
  5. 20台工作站的计算机局域网络,服务器、工作站与普通电脑有什么区别?
  6. 计算机基础win7桌面操作,计算机基础1实验报告win7基本操作.doc
  7. 解决问题:/etc/rc.local文件配置的开机启动项不生效
  8. 小工具 - 剪切板计算器
  9. 安装 Windows 10 SDK (10.0.10586)
  10. java 迭代器的优缺点_java迭代器和for循环优劣详解