核心用到的方法就是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,那就用前文提到的前辈的方法吧~~