前言
对于我这个Unity初学者来说,在学习过一段时间的Unity相关知识后,对于Unity中坐标系的概念不是很明确清楚,是时候做一下坐标系相关知识的总结了。
1、世界坐标系
世界坐标是按照笛卡尔坐标系定义出来的绝对坐标系,下面的各种坐标系都建立在世界坐标的基础上。我们知道二维平面内任意一个点可以用二维坐标(x,y)来表示,如果将这个概念延伸到三维空间内,那么三维空间内任意一个点都可以用三维坐标(x,y,z)来表示。Unity3D采用的是左手坐标系。在Unity3D中我们可以使用transform.position来获取场景中一个物体的世界坐标,通常情况下编辑器中的Inspector窗口是以世界坐标来描述一个3D物体的位置的,除非当一个3D物体存在父物体的时候,它会以相对坐标来描述其位置。
注意:
1、在Unity中,可通过Transform.forward来表示正方向,Vector3.forward也可以表示正方向,这两者的区别在于:
Vector3.forward的值永远是(0,0,1),而transform.forward的值则是根据当前物体的自身坐标系Z轴,不一定等于(0,0,1) 怎么理解呢,举个例子,首先一个物体的transform.position,一定是该物体在世界坐标的位置,相应的transform.localPosition才是该物体的局部坐标,那么transform.position += Vector3.forward时,就等于在向世界坐标的Z轴前进,而transform.position += transform.forward时,则等于再向局部坐标的Z轴前进。
2、在改变有父物体的子物体的坐标时,要是想改变的是局部坐标就要使用localPosition,如果使用position 则会认为修改的是世界坐标,而子物体的相对坐标会根据父物体的坐标和子物体position 自动转化的。
transform.position += Vector3.forward;
transform.position += transform.forward;
GameObject go = GameObject.Instantiate(onePrefab);
go.transform.parent = oneTransform;
go.transform.localPosition = Vector3.zero;
2、屏幕坐标系
屏幕坐标是以像素来定义的,它的范围是以左下角为(0,0),右上角为(Screen.width,Screen.height)定义的这样一个矩形。屏幕坐标是一个3D坐标,Z轴是以相机的世界单位来衡量的。屏幕坐标和相机之间满足:Screen.width=Camera.pixelWidth和Screen.height=Camera.pixelHeight这两个条件。例如我们将相机正对着场景中的原点(0,0,0),相机的Z轴分量为-10,按照屏幕坐标的定义,假设屏幕为800X640的大小,则此时原点转化为屏幕坐标后应该是(400,320,10)。在Unity3D中我们可以使用WorldToScreenPoint来将一个世界坐标转换为屏幕坐标。鼠标位置Input.mousePosition获取的是屏幕坐标。
例如场景分辨率1024x768,如果屏幕被缩小至100x100,那么点击右上角是100x100,而不是分辨率的1024x768。
现在运行下面这行代码就是得出我当前游戏视窗的屏幕分辨率。
void Start()
{
Debug.Log("当前窗口的分辨率为:" + Screen.width + "X" + Screen.height);
Debug.Log("当前屏幕的分辨率为:" + Screen.currentResolution);
}
3、视口坐标系
视口坐标是标准化后的屏幕坐标。标准化的概念我们可以引申到向量的标准化中,比如一个向量(x,y)将过标准化后可以得到一个单位向量(x’,y’)。类似地,视口坐标是以0到1间的数字来表示的,它的范围是以左下角为(0,0),右上角为(1,1)定义的这样一个矩形。视口坐标是一个3D坐标,Z轴是以相机的世界单位来衡量的。通过对比可以发现视口坐标和屏幕坐标特别的相似,所以这里大家可以对比着来学习。同样以屏幕坐标中的例子来将这里的转换,例如我们将相机正对着场景中的原点(0,0,0),相机的Z轴分量为-10,按照屏幕坐标的定义,假设屏幕为800X640的大小,则此时原点转化为视口坐标后应该是(0.5,0.5,10)。在Unity3D中我们可以使用WorldToViewportPoint来将一个世界坐标转换为视口坐标。文章来源:https://www.toymoban.com/news/detail-793929.html
4、GUI坐标系
该坐标是从左上角开始计算的,左上角(0,0),右下角为(Screen.width,Screen.height);文章来源地址https://www.toymoban.com/news/detail-793929.html
屏幕坐标系和世界坐标系转换函数:
Camera.ScreenToWorldPoint(Vector3 position); // 屏幕坐标系转换为世界坐标系
Camera.WorldToScreenPoint(Vector3 postion); // 世界坐标系转换为屏幕坐标系
屏幕坐标系和视口坐标系转换函数
Camera.ScreenToViewportPoint(Vector3 position); // 屏幕坐标系转换成视口坐标系
Camera.ViewportToScreenPoint(Vector3 position); // 视口坐标系转换成屏幕坐标系
世界坐标系和视口坐标系转换函数
Camera.WorldToViewportPoint(Vector3 position); // 世界坐标系转换成视口坐标系
Camera.ViewportToWorldPoint(Vector3 position); // 视口坐标系转换成世界坐标系
到了这里,关于【Unity基础概念--坐标系】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!