前言:
最近项目中用到了很多自身坐标与世界坐标的转换,写代码的时候发现自己对于这部分的知识还不够清晰,故记下此文。
不同的坐标系
一、世界坐标
- 以世界空间下的原点的坐标系
- 通过transform.position调用
- 如果没有父物体,检视面板显示的就是世界坐标
二、自身坐标(又叫本地坐标)
- 以父物体空间为原点的坐标系
- 通过transform.localposition调用
- 如果有父物体,检视面板显示的就是自身坐标
三、屏幕坐标
- 以屏幕左下角为原点的二维坐标系.以屏幕的左下角为(0,0),右上角为(Screen.width,Screen.height)
- 坐标的右上角的值根据游戏视图的屏幕分辨率来决定
- 获取的鼠标坐标就是屏幕坐标(Input.mousePosition)
四、视口坐标
- 以屏幕左下角为原点的二维坐标系,左下角是(0,0),右上角是(1,1),是一个归一化的值
- Z轴是世界坐标的Z轴
- 多用来过渡转换坐标,如世界坐标转屏幕坐标:先从世界坐标转视口坐标,再从视口坐标转屏幕坐标
五、GUI坐标
- 以屏幕左上角为原点的二维坐标系,左上角是(0,0),右下角是(Screen.width,Screen.height)
六、桌面坐标
- 以左上角为原点的二维坐标系,左上角是(0,0),右下角是(桌面分辨率的宽,桌面分辨率的高)
- 用SetCursorPos设置鼠标坐标,用GetCursorPos得到鼠标坐标。
不同的坐标系之间的转换
一、自身转世界
- 世界坐标 = Transform对象.TransformPoint(自身坐标)
二、世界转自身
- 世界坐标通过把父物体设置为想要成为的自身坐标的父物体,得到的就是这个世界坐标转化后的自身坐标
三、世界转屏幕
- 通过调用Camera.main.WorldToScreenPoint()
- Unity底层是从世界转视口,再从视口转屏幕
四、世界转视口
- 通过调用Camera.main.WorldToViewPort()
五、视口转屏幕
- 通过调用Camera.main.ViewportToScreenPoint()
- 视口坐标乘以屏幕分辨率(Screen.width和Screen.hight)也可从视口坐标转为屏幕坐标
六、屏幕转视口
- 通过调用Camera.main.ScreenToViewportPoint()
七、视口转世界
- 通过调用Camera.main.ViewportToWorldPoint()