Unity学习笔记—本地坐标转世界坐标

先简单介绍一下我是一个程序员(菜鸟程序员),用C#开发,在开发的过程中会遇到一些问题,当时解决了但是在遇到可能还会在犯,所以启发我做这样一个学习笔记系列,一来是希望能够督促自己总结学习,二来是可以在变身之路上认识志同道合的朋友们一起成长,我写的不对的地方还望朋友们能够指出来,有什么问题可以留言,我们可以一起思考共同进步。
上周我在写UI组件的时候的时候遇到一个问题——UI界面的坐标和世界坐标之间的转换。今天我就先谈谈这个问题好了,其实主要是两个方法。我们今天想说说本地坐标到世界坐标吧

从自身坐标到世界坐标

 public Transform testTra ;
    public Transform parentTra;
    Vector3 localPos;
    Vector3 worldPos;

    void Awake()
    {
        localPos = testTra.localPosition;
        worldPos = parentTra.TransformPoint(localPos);
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            Debug.Log("localPos:" + localPos + "worldPos:" + worldPos);
        }
    }

核心用到的方法就是transform.TransformPoint( )

这个方法的返回值就是Vector3类型的世界坐标,transform就是相对的物体,括号里的就是相对这个transform的本地坐标,比方说我现在的位置吧,知道我相对于我的邻居的坐标:Pos1,和我相对于小区的坐标Pos2,转换成世界坐标,结果是一样的,怎么做呢?一种表示方法就是:我的邻居.TransformPoint(Pos1)这样能返回我的世界坐标,还有一种:小区.TransformPoint(Pos2)这样也能取得我的世界坐标。

看下图我穿件出来的一个红色的小球和一个平面

红色小球的坐标

平面的坐标

看右边的坐标,我把小球放到了平面的里面,红色小球相对于平面的位置是(-2, 0, 0), 白色平面的位置是(2, 0, 0)
在看一下最后书按下A输出的本地坐标是世界坐标分别是(-2, 0, 0)和(0, 0, 0)正确。本地坐标转世界坐标就是这么用的。

下一次我在说说世界坐标是怎么转换成本地坐标的。

Unity有世界坐标、本地坐标(localposition)、UI坐标(这个我好像还没怎么用)、屏幕坐标等等,之前的一个项目需要考虑世界坐标转换为本地坐标,后来经过一番尝试,找到了一种比较取巧的方法。

首先,世界坐标是指物体在场景中的坐标,当某个物体没有父物体时,它的position即为世界坐标的position,rotation同理;本地坐标是物体相对于它的父物体的坐标而言( 父物体又套父物体的我还没有研究),这个相对坐标是以父物体本身为坐标轴进行计算的,与世界坐标没有必然联系。而对于没有父物体的物体,可以认为不存在本地坐标这种说法。另外有一点需要注意:当某个物体有父物体时,它的inspector栏transform中的position实际是localposition,即本地坐标。

那么如何进行两种坐标的互换呢?首先,本地坐标转世界坐标已经有前辈提出了一种方法:点击打开链接。其核心用到的方法就是transform.TransformPoint( )。

之后我考虑如何将世界坐标转换为本地坐标(当然要相对某个“父”物体),没找到相关函数。后来脑瓜子一拍:子物体展示在inspector界面的不就是本地坐标嘛!所以有了如下的实现方式:在需要转换的世界坐标处建立一个空gameobject,将它的parent设置为你需要转换为对应本地坐标的“父”物体。然后空gameobject.transform.localPosition即为所求。

等等,为什么是localPosition而不是position呢?因为transform定义了这两个参数,分别代表它的本地坐标和世界坐标。

所以。。。。。。如果你想要获取一个子物体M的世界坐标,直接M.transform.position就搞定了!!!!!!

当然,如果你只有一个本地坐标想转换成世界坐标,又懒得为此创建一个空gameobject,那就用前文提到的前辈的方法吧~~

 
原文地址:https://www.cnblogs.com/qinshuaijun/p/8526969.html