• 【Unity】稍微说一下关于各种坐标的转换。比如WorldToScreenPoint


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

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

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

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

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

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



  • 相关阅读:
    adb 连接 Android 手机的两种方式
    Jmeter GUI及NON GUI下实现分布式
    史上最全最细 App 自动化环境部署
    不懂Java代码,照样把jmeter指定数据写入execl
    Dockerfile 让你轻松创建属于你的镜像 (下)
    Dockerfile 让你轻轻松松创建属于你的镜像 (上)
    Python vs Java (一):史上最全变量类型区别,99.99%的人都收藏了
    浏览器F12调试器定位系统前后端bug
    cookie,session
    App 抓包提示网络异常怎么破?(抓包HTTPS)
  • 原文地址:https://www.cnblogs.com/Feiyuzhu/p/4655626.html
Copyright © 2020-2023  润新知