(Unity)UGUI坐标与世界坐标的转换——UI物体跟随场景3D物体

首先本文参考了https://blog.csdn.net/jbl20078/article/details/78401664,感谢博主的奉献

对于UGUI坐标与世界坐标系的转换,由于都是以渲染到屏幕上,故以屏幕坐标为桥梁转换。

    要使UI物体跟随3D物体,首先应该考虑的是:UI物体的坐标要跟随3D物体的坐标,所以要把3D物体的坐标赋值给UI物体,但由于两者都处理于不同坐标系与不同的摄像机(同一摄像机下就不用讲了,直接来)渲染下,要如何赋值呢?这里就要用到屏幕坐标来转。

        //世界坐标转成UI中父节点的坐标, 并设置子节点的位置
        public void World2UI(Vector3 wpos, RectTransform uiParent, RectTransform uiTarget){
,            Vector3 spos = m_sceneCamera.WorldToScreenPoint(wpos);
            m_tempV2.Set(spos.x, spos.y);
            Vector2 retPos;
            RectTransformUtility.ScreenPointToLocalPointInRectangle(uiParent, m_tempV2, m_uiCamera, out retPos);
            uiTarget.anchoredPosition = retPos;
        } 

讲下,这里遇到到的大坑是对于摄像机的:

首先是取得3D物体的坐标屏幕坐标,这里是通过

m_sceneCamera.WorldToScreenPoint(wpos);

来转,wpos就是3D物体的Position,但里面转的Camera一定要是渲染该3D物体的像机,不能用Canvas的相机除非Canvas和3D场景相机是同一个,但也有不是同一个但两个相机的投影模式是一样的,范围也是一样的也能转换成功。这也好理解,不同摄像机的投影模式和渲染范围不一至,转出的结果肯定也是不一样的。

    最后转出的方法为以下方法,下面用的必须是UI所使用的Camera

   RectTransformUtility.ScreenPointToLocalPointInRectangle(uiParent, m_tempV2, m_uiCamera, out retPos);

在这两个摄像机上面兜了好久,刚开始都是用UI摄像机来转一直不成功,最后感谢坐旁边大神的帮忙

你可能感兴趣的:(Unity3D)