之前写了一篇关于在物体头顶上显示名字的随笔。

估计难懂的点就在各种坐标的转换。

这里详细(就我这水平,怎么可能详细~~~)解说一下。额.............

用另一种方式举个栗子吧。

还是实现在物体的头顶或某个部位显示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 。

我们先把主角物体的世界坐标转换成屏幕坐标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)。

但是呢,仔细看两个的视口坐标是相对于哪个相机的~

思路也就是这样:把这个物体的世界坐标相对应的世界相机的视口坐标找到,再把这个坐标对应到UI相机上,然后求出来这个UI相机上这个位置的视口坐标在3D世界里的位置。

杀了我吧~~~~~~~~~~~~~~~~~~~~~~~~~凌乱成一朵烟花。

												

【Unity】稍微说一下关于各种坐标的转换。比如WorldToScreenPoint的更多相关文章

  1. Unity 屏幕坐标到UGUI RectTransform本地坐标的转换

    public static bool ScreenPointToLocalPointInRectangle(RectTransform rect, Vector2 screenPoint, Camer ...

  2. arcgis server 中Web墨卡托投影与WGS-84坐标的转换

    arcgis server 中Web墨卡托投影坐标与WGS-84坐标的转换 //经纬度转墨卡托 function lonlat2mercator(lonlat){ var mercator={x:0, ...

  3. 使用ArcGIS实现WGS84经纬度坐标到北京54高斯投影坐标的转换

    [摘 要] 本文针对从事测绘工作者普遍遇到的坐标转换问题,简要介绍ArcGIS实现WGS84经纬度坐标到北京54高斯投影坐标转换原理和步骤. [关键词] ArcGIS 坐标转换 投影变换 1 坐标转换 ...

  4. unity中mesh属性的uv坐标讨论

    http://blog.sina.com.cn/s/blog_427cf00b0102vp0j.html 之前在做连连看游戏中,也用到贴图坐标,当时我们讲到,不管是平铺(Tiling)还是偏移(Off ...

  5. 关于Unity中的世界坐标和局部坐标

    1.物体的局部坐标的方向(物体自身的方向) transform.forward. transform.right. transform.up 2.物体的世界坐标的方向 Vector3.forward. ...

  6. 【Unity笔记】屏幕坐标和鼠标坐标

    屏幕坐标:左下角为原点. void Update(){ // 获取物体的屏幕坐标,世界坐标->屏幕坐标 Vector3 screenPos = Camera.main.WorldToScreen ...

  7. Unity Scene视图下 输出物体坐标等信息

    using UnityEditor; using UnityEngine; [CustomEditor(typeof(GameObject))] public class MyEditor : Edi ...

  8. Flex各类型坐标转换(全局、本地、内容坐标间转换)

    Flex包含3种坐标:全局坐标.本地坐标.内容坐标 全局坐标:stage级别,坐标原点为舞台的左上角,如MouseEvent的stageX.stageY坐标. 本地坐标:组件级别的坐标系,相对坐标,坐 ...

  9. Unity 通过Animation实现控件位置的转换

    Unity版本:4.5.1 NGUI版本:3.6.5 参考链接:http://blog.csdn.net/unity3d_xyz/article/details/23035521,作者:CSDN in ...

随机推荐

  1. 激活win10企业版,亲测可用,(win7步骤相同,请自行测试)

    其他版本我没试过,亲们可以尝试! win7神key win7神key1:2HYJ4-V71WM-BAF6Y-G2BTH-X8QOD win7神key2:9LM54-Z3LQ1-5IRAN-T4JNI- ...

  2. 「AHOI2014/JSOI2014」宅男计划

    「AHOI2014/JSOI2014」宅男计划 传送门 我们首先要发现一个性质:存货天数随买食物的次数的变化类似于单峰函数. 具体证明不会啊,好像是二分加三分来证明?但是没有找到明确的严格证明. 感性 ...

  3. 获取当前表中的最大自增id的下一个自增id值

    SELECT auto_increment FROM information_schema.`TABLES` WHERE TABLE_SCHEMA='{$db_name}' AND TABLE_NAM ...

  4. java集合体系结构总结

    好,首先我们根据这张集合体系图来慢慢分析.大到顶层接口,小到具体实现类. 首先,我想说为什么要用集合?简单的说:数组长度固定,且是同种数据类型.不能满足需求.所以我们引入集合(容器)来存储任意数据类型 ...

  5. JavaScript - Compiling Vs Transpiling

    参考 https://blog.csdn.net/napolunyishi/article/details/20473799 https://www.stevefenton.co.uk/2012/11 ...

  6. word2vec词向量处理中文语料

    word2vec介绍 word2vec官网:https://code.google.com/p/word2vec/ word2vec是google的一个开源工具,能够根据输入的词的集合计算出词与词之间 ...

  7. UDP通讯代码

    UDP客户端代码: import socket # 创建套接字 socket.AF_INET:IPV4 socket.SOCK_DGRAM:UDP协议 udp_client=socket.socket ...

  8. static的特性

    1,static方法就是没有this的方法.在static方法内部不能调用非静态方法,反过来是可以的.而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法.这实际上正是static ...

  9. 理解错误的 Arrays.asList()

    简介 Arrays.asList() 作用是将一个数组转换为一个List 集合. String[] myArray = { "Apple", "Banana", ...

  10. Windows驱动开发-DPC定时器

    DCP是一种使用更加灵活的定时器,可以对任意间隔时间进行定时.DPC定时器的内部使用了一个定时器对象KTIMER,当你设定了定时器之后,从设定开始起经过这个时间之后操作系统会将一个DPC定时器的例程插 ...