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

     
  • 相关阅读:
    HTML基础
    一次由任意文件漏洞开始的渗透测试过程
    谈一谈信息泄露这件事
    浅谈任意文件下载漏洞的利用
    [原创] 一次渗透测试过程--从外网进内网
    一次绕过360+诺顿的提权过程
    漏洞挖掘高级方法
    新型勒索软件Magniber正瞄准韩国、亚太地区开展攻击
    Microsoft Edge 浏览器远程代码执行漏洞POC及细节(CVE-2017-8641)
    Office远程代码执行漏洞CVE-2017-0199复现
  • 原文地址:https://www.cnblogs.com/qinshuaijun/p/8526969.html
Copyright © 2020-2023  润新知