Unity 与 NGUI 坐标转换原理

在游戏中最常用到坐标转换的就是制作人物头顶的血条/名字 之类的显示,Unity提供了摄像机以下API供我们使用:

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() 得到的世界坐标。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值