Unity 与 NGUI 坐标转换原理
2017-01-24 01:21
537 查看
在游戏中最常用到坐标转换的就是制作人物头顶的血条/名字 之类的显示,Unity提供了摄像机以下API供我们使用:
1、将世界坐标转换到屏幕坐标
Camera.WorldToScreenPoint()
2、将屏幕坐标转换到世界坐标
Camera.ScreenToWorldPoint()
比如在游戏中的主角,我们知道他的世界坐标,通过场景摄像机,调用 WorldToScreenPoint 将坐标转换到屏幕坐标。然后通过NGUI的摄像机,将屏幕坐标转换到世界坐标。屏幕坐标,其实起的是一个临时变量的作用。
转自http://blog.csdn.net/huutu http://liveslives.com/
这两个API调用起来很方便,但是多少会有些稀里糊涂,下面通过对3D 世界中 摄像机的一些介绍,来解除一些迷惑。
首先来看看透视摄像机,这一般是我们的场景摄像机,朝向主角的。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/24/49128cc1bfe81cad84d4ae1176997ef3)
场景摄像机位于 (0,0,-10) ,FOV是 60度。,近裁剪面位于 (0,0,-6) 。
有一个Cube位于 (5,0,0) 的位置。
根据三角函数算出,摄像机的视野宽度为 5.77 ,即 B 坐标(5.77,0.0) 。
将B 作为 (1,0,0) ,那么Cube位于 (5/5.77,0,0),即(0.866,0,0)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/24/a75c23c1c750aa6fe33e6d6cae527894)
摄像机看到的场景,渲染到屏幕上。
假设屏幕分辨率为400x400。
那么Cube 在屏幕上的坐标是 (200*0.866,0,0),即 (173.2,0,0)
因为屏幕坐标左下角为原点的,所以 世界坐标转屏幕坐标实际是 (200+173.2,0,0),即(373.2,0,0)。
(373.2,0,0) 这就是我们调用 Camera.WorldToScreenPoint() 获得的屏幕坐标。
转自http://blog.csdn.net/huutu http://liveslives.com/
下面来看下正交摄像机,正交摄像机在3D 游戏中一般用来作为UI摄像机。显示人物名字 称号之类的。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/24/2826f4dd42d4c213323345e1802a45af)
Camera 位于 (0,0,0) 的位置,Camera Size设置为 1,Near Plane 设置为 0,Far Plane 设置为 1。
在 (0.5,0,1) 的位置有一个Cube。
同样屏幕分辨率时 400x400,那么Cube在屏幕上位置是 (200,0)。
那么 屏幕坐标 (373.2,0,0),对应的世界坐标就是 (173.2/200.0 , 0,0) ,即 (0.865 , 0,0) 。
(0.865 , 0,0) 这就是我们调用 Camera.ScreenToWorldPoint() 得到的世界坐标。
1、将世界坐标转换到屏幕坐标
Camera.WorldToScreenPoint()
2、将屏幕坐标转换到世界坐标
Camera.ScreenToWorldPoint()
比如在游戏中的主角,我们知道他的世界坐标,通过场景摄像机,调用 WorldToScreenPoint 将坐标转换到屏幕坐标。然后通过NGUI的摄像机,将屏幕坐标转换到世界坐标。屏幕坐标,其实起的是一个临时变量的作用。
转自http://blog.csdn.net/huutu http://liveslives.com/
这两个API调用起来很方便,但是多少会有些稀里糊涂,下面通过对3D 世界中 摄像机的一些介绍,来解除一些迷惑。
首先来看看透视摄像机,这一般是我们的场景摄像机,朝向主角的。
场景摄像机位于 (0,0,-10) ,FOV是 60度。,近裁剪面位于 (0,0,-6) 。
有一个Cube位于 (5,0,0) 的位置。
根据三角函数算出,摄像机的视野宽度为 5.77 ,即 B 坐标(5.77,0.0) 。
将B 作为 (1,0,0) ,那么Cube位于 (5/5.77,0,0),即(0.866,0,0)
摄像机看到的场景,渲染到屏幕上。
假设屏幕分辨率为400x400。
那么Cube 在屏幕上的坐标是 (200*0.866,0,0),即 (173.2,0,0)
因为屏幕坐标左下角为原点的,所以 世界坐标转屏幕坐标实际是 (200+173.2,0,0),即(373.2,0,0)。
(373.2,0,0) 这就是我们调用 Camera.WorldToScreenPoint() 获得的屏幕坐标。
转自http://blog.csdn.net/huutu http://liveslives.com/
下面来看下正交摄像机,正交摄像机在3D 游戏中一般用来作为UI摄像机。显示人物名字 称号之类的。
Camera 位于 (0,0,0) 的位置,Camera Size设置为 1,Near Plane 设置为 0,Far Plane 设置为 1。
在 (0.5,0,1) 的位置有一个Cube。
同样屏幕分辨率时 400x400,那么Cube在屏幕上位置是 (200,0)。
那么 屏幕坐标 (373.2,0,0),对应的世界坐标就是 (173.2/200.0 , 0,0) ,即 (0.865 , 0,0) 。
(0.865 , 0,0) 这就是我们调用 Camera.ScreenToWorldPoint() 得到的世界坐标。
相关文章推荐
- Unity 移动方式总结
- Unity 脚本<1>
- Unity 脚本<2>
- Unity 查找
- Unity 3D 的四种坐标系
- Unity如何区分安卓、苹果设备是手机与平板?
- 联机Unity Profile性能调试技巧
- Unity GL 画圆
- [置顶] Unity Mesh(三) Mesh画球
- [Unity] 使用Profiler.BeginSample()定位性能热点
- Unity插件 - MeshEditor(九) 模型涡流扭曲特效(黑洞吸引特效)
- 【疑难】Visual Studio Community 2015在新建项目时出现弹窗警告“未将对象引用设置到对象的实例”且无法创建项目
- Unity3D面试——真实的面试,unity3d面试
- Unity3D中目标相对自身的前后左右方位判断
- TYPESDK手游聚合SDK客户端设计思路与架构之四:unity开发平台部分结构设计和思路
- Unity3d面试6
- Unity Editor 编辑器扩展 十四 将TortoiseSVN的基础操作内嵌Unity
- (三)Hololens Unity 开发之 语音识别
- Unity接入第三方SDK发布android闪退
- unity3D+opencv环境配置