实例详解Unity各种坐标的转换
来源:互联网 发布:农村淘宝县级运营中心 编辑:程序博客网 时间:2024/05/21 22:58
实现在物体的头顶或某个部位显示UI并跟随物体的移动改变位置。
先把栗子端上来:
public Transform Boy;//帅帅的主角
public Transform UI;//对主角死缠烂打的UI君
Camera cam;//主相机
void Update ()
{
UI.localPosition = cam.WorldToScreenPoint(Boy.position) - new Vector3(Screen.width / 2, Screen.height / 2, 0);
}
好长一串儿代码急死人。听我慢慢道来~
首先无非就是求UI的localPosition 。(这就是屏幕坐标)
下图就是上面公式减法的由来2208/2 =1104,1380/2 = 690; Image.localPosition = new Vector3(1140,690,0);
我们先把主角物体的世界坐标转换成屏幕坐标cam.WorldToScreenPoint(Boy.position)。然后这个值就变成了主角显示在屏幕上的坐标,相对应的就好比是Screen.width这种,对,它们是一个次元的。
然并卵,我们的UI的坐标可是相对于UI Root来的~
怎么办呢~
注意看这张我截取的NGUI的小破图:
,UI Root下边的子UI们的(0,0,0)是在屏幕的正中心。而屏幕坐标系的(0,0,0)呢~在屏幕的左下角,所以它们之间,差了半个屏幕的宽和高。
真相只有一个,用得到的物体的屏幕坐标减去半个屏幕的宽和高,就可以得到ui的相对坐标啦~~~~~~~~~~~~~~~~~~~~~~~~
那么,之前那个栗子是什么意思呢:
Vector3 pos = cam.WorldToViewportPoint(Boy.position); UI.transform.position = UIcam.ViewportToWorldPoint(pos);
第一句是先得到主角相对于视窗的视口坐标。
第二句是将得到的视口位置再转化为世界坐标。
纳尼?
额,视口坐标是相对于相机的。相机的左下为(0,0);右上是(1,1)。
但是呢,仔细看两个的视口坐标是相对于哪个相机的~
思路也就是这样:把这个物体的世界坐标(position)相对应的世界相机的视口坐标找到,我们称这个坐标为A(A= pos 只是pos是相对于世界相机上的位置),再把这个A坐标对应到UI相机上,我们把A对应到UI相机上的坐标称为B(B= pos 只是pos是相对于UI相机上的位置),然后求出来这个UI相机上这个位置的视口坐标B在3D世界里的位置,我们称这个位置为C,C就是上面的UI.transform.position。
- 实例详解Unity各种坐标的转换
- 【Unity】关于transform.TransformPoint的坐标转换
- Unity里的坐标转换+动态载入
- Unity 的局部坐标转换到世界坐标的接口
- Unity 世界坐标 和 NGUI 屏幕坐标间的转换
- unity中世界坐标和绝对坐标之间的转换
- Unity世界坐标与本地坐标的一种转换方法
- unity 坐标转换
- unity坐标转换问题
- Unity坐标转换问题
- unity中的坐标转换
- MFC各种坐标转换
- Unity 世界坐标转换到NGUI坐标
- Unity 世界坐标转换到NGUI坐标
- Unity 世界坐标转换到NGUI坐标
- unity世界坐标与相对坐标转换
- Unity 坐标转换 世界坐标转换到NGUI坐标
- 齐次坐标详解与普通坐标之间的转换
- no known conversion for argument 1 from 'class-name' to 'class-name&'
- android 嵌入unity页面注意事项
- Android之shape的使用
- Zookeeper实现参数的集中式管理
- Spring boot入门一 环境搭建HelloWorld
- 实例详解Unity各种坐标的转换
- ubuntu16.04下面使用redshift
- 着色器glsl
- 重建二叉树
- 李沐等:MXNet设计和实现简介
- Hashmap踩坑
- ubuntu16.04使用nginx、uwsgi部署django应用
- nginx 502 解决记录(php-fpm 启动失败)
- 《笨办法学python》加分习题26——我的答案