Unity中的各种坐标系及相互转化(借鉴大神,仅作为笔记用)

 Unity作为一个3D开发引擎,他的各系坐标系错综复杂,学过矩阵的朋友可能还绕得开,没有学会的一不小心就掉进坐标坑里面了,其实各系坐标的区别在于所建立的坐标系参照不同,下面先了解下各大坐标吧,我尽量说的通俗点。

1.坐标系

   1.世界坐标系:以世界原点为坐标原点建立的三维坐标系,凡是在Unity的游戏对象均有自己的世界坐标系,且获取坐标的方法很简单(transform.position),这类似与现实世界我们常说的经纬度,常用来做定义位置,方向的标准。

  2.本地坐标(自身坐标):以自身为原点而建立的三维坐标系,该坐标为局部坐标,与世界坐标系一样,凡是Unity的游戏对象均有自己的自身坐标,获取坐标的方法也很简单(transform.localposition),常用来用于定义自身方向,初始局部位置来用,例如背包当更换物品是其实实在更换UI,而更换UI实则更换UI父对象,然后让transform.localposition=Vector3.zero让他等于其父对象的位置。

3.屏幕坐标:以屏幕左下角为原点建立的一个二维坐标系.以屏幕的左下角为(0,0),右上角为(Screen.width,Screen.height),这个坐标坑最多,也是我们经常最绕的一个坐标,这里就详解下,首先屏幕要知道是相对屏幕。举个例子,现实的投影仪大家很清楚,我们在天花板顶上放一个投影仪,然后投影的影像映射到墙面上或幕布上,这墙面或幕布的影像区域就是屏幕,当我们移动幕布的时候,屏幕的大小也在变化,这就跟我们幕布到投影仪的垂直距离有关,这个垂直距离就是我们的Z轴,后面的屏幕坐标转世界坐标会讲到。值得注意的一点屏幕的坐标跟分辨率的关系,当我们的分辨率是600*800的时候,但我们截取其中的200*200作为屏幕的话,那么屏幕的左下角坐标为(0,0),屏幕右上角坐标为(200,200)。屏幕坐标常用于鼠标交互,而获取的鼠标坐标就属于屏幕坐标(input.mouseposition)。

4.视口坐标:以相机屏幕左下角为原点建立的一个二维坐标系,左下角为(0,0),右上角为(1,1),它的Z轴即是摄像机的Z轴,上面的示例中投影仪屏幕上建立的坐标就是视口坐标,这个坐标大多用来过渡转化坐标作用,例如世界坐标转屏幕坐标,世界坐标转视口坐标,视口坐标转屏幕坐标。

还有GUI坐标,投影坐标,系统桌面坐标,网格坐标等这些基本很少用到,所以这里懒得去一一赘述了。

2.坐标转换

1.本地互转世界:Unity封装成方法transform.TransformVector,transform.TransformPoint,transform.TransformDirection,这个转换的意义不大,要获取直接可以通过上述讲的方法可直接获取。

2.屏幕坐标转世界坐标:有很多人和很多博客直接用Camera.main.ScreenToWorldPoint(Input.mouseposition)直接转,这样是不可以的,因为Input.mouseposition是一个屏幕坐标,没有Z轴,而我们的世界坐标需要Z轴的,类似于我们需要知道幕布到投影仪的距离我们才可以将幕布上的一个点转换到世界上来.

                 public Vector3 myscreenToworld(Vector3 mousepos,Transform targetTransform) {
        //先计算相机到目标的向量
        Vector3 dir = targetTransform.position - Camera.main.transform.position;
        //计算投影
        Vector3 normardir = Vector3.Project(dir, Camera.main.transform.forward);
        //计算是节点,需要知道处置屏幕的投影距离
        Vector3 worldpos = Camera.main.ScreenToWorldPoint(new Vector3(mousepos.x, mousepos.y, normardir.magnitude));
        return worldpos;
    }

3.世界转屏幕: 

Camera.main.WorldToScreenPoint()

世界转屏幕的过程是这样的:[世界->视口] *[视口->屏幕],学过矩阵的都知道最后可以变为[世界->屏幕],所以上面的是Unity进行了封装的结果,有兴趣的查找下底层自己转试下

4.世界转视口

Camera.main.WorldToViewportPoint()

5.视口转屏幕

Camera.main.ViewportToScreenPoint()或者自己手写Vector2 pos=new Vector2(Viewposition.x*Screen.width,Viewposition.y*Screen.hight).

猜你喜欢

转载自www.cnblogs.com/Damon-3707/p/11495358.html