全局坐标系(世界坐标系)
在Unity中创建的物体都是以全局坐标系中的坐标原点(0,0,0),来确定各自的位置的Unity中,如果一个游戏物体没有父物体,则 Inspector中transform 显示的为全局坐标Unity中,可以用 transform.position 取得一个物体的世界坐标局部坐标系(物体坐标系、模型坐标系)
每个物体都有自身独立的物体坐标系;当物体移动或改变方向时,和该物体相关联的局部坐标系本身将随之移动或改变方向Unity中模型Mesh保存的顶点坐标均为局部坐标系下的坐标,因此物体的改变并不会影响顶点的坐标
如果一个游戏物体是另一个的子物体,则该物体的坐标 在 Inspector 中 transform 显示的为其父物体的局部坐标。 其实子物体的坐标是相对于其父物体的原点坐标来计算的。可以通过 transform.localPosition 取得一个物体在其父物体的局部坐标系中的坐标如果该游戏物体没有父物体,那么 transform.localPosition 获得的依然是该物体在全局坐标系中的坐标。如果该物体有父物体,则获得是在其父物体的局部坐标系中的坐标。此时 检视视图中显示的为 localPosition 的值。
屏幕坐标系
屏幕坐标系是建立在屏幕上的二维坐标系;是以像素为单位,屏幕的左下角为(0, 0),右上角为 (Screen.width, Screen.height);z轴坐标为相机的世界坐标中z轴的负值鼠标位置坐标属于屏幕坐标 , 可以使用Input.mousePosition获得鼠标当前位置的坐标。通过该函数返回的是Vector3
类型的变量,但z
分量始终为0。手指触摸屏幕的坐标属于屏幕坐标 ; 可以使用Input.GetTouch(0).position 可以获得单个手指触摸屏幕时手指的坐标。
视口坐标系
视口坐标系是与屏幕坐标系息息相关的,它是将 Game视图的屏幕坐标系单位化,即左下角为(0, 0),右上角为(1, 1),z轴坐标是相机的世界坐标中z轴坐标的负值
假如说屏幕坐标系左下角是(0,0), 右上角是 (800,600)。 现在在一个点在屏幕坐标系上的坐标为 (200,450)。 现在我们把该点的坐标单位化为: x = =( 200/800 = 0.25), y == ( 450 / 600 = 0.75 ), 最终该点单位化的结果坐标为 (0.25,0.75,0)
如何获得视口坐标系?
世界坐标系可以转换为一个视口坐标系屏幕坐标系可以转换为一个视口坐标系
观察坐标(Eye Space)
在Game视图中的画面是由摄像机提供的,而基于某一个摄像机的坐标系即为观察坐标系;即把摄像机的位置看作原点位置
全局坐标系 和 局部坐标系 之间的相互转换
点击这里进入官网
Transform.Translate
public void Translate(Vector3 translation);public void Translate(Vector3 translation, Space relativeTo = Space.Self);
沿着 translation 的方向移动 | translation | 的距离,其结果将应用到 relativeTo 坐标系中。如果relativeTo为空 或设置为 Space.Self,则该 transform 则相对于自身的局部坐标轴进行移动。如果relativeTo是Space.World,则该transform是相对于世界坐标系进行移动。
可以通过以下操作来进行全局坐标系 和 局部坐标系 之间的转换:
Transform.TransformPoint: ( 局部 ——》 全局)
public Vector3 TransformPoint(Vector3 position);
将一个坐标点从局部坐标系转换到全局(世界)坐标系。请注意,返回的位置会受 scale 影响。 如果要处理方向,请使用Transform.TransformDirection。
public Vector3 TransformPoint(float x, float y, float z);
将位置x、y、z从局部空间转换为世界空间。
Transform.InverseTransformPoint:(全局——》 局部)
public Vector3 InverseTransformPoint(Vector3 position);
将某个坐标点从全局(世界)坐标系转换到局部坐标系。此函数基本上与Transform.TransformPoint相反,后者用于从局部坐标系转换到全局(世界)坐标系。请注意,返回的位置会受 scale 影响。 如果要处理方向,请使用Transform.InverseTransformDirection
public Vector3 InverseTransformPoint(float x, float y, float z);
将某x、y、z 表示的坐标点从全局(世界)坐标系转换到局部坐标系。
Transform.TransformDirection:( 局部 ——》 全局)
public Vector3 TransformDirection(Vector3 direction);
将一个方向从局部坐标系转换到全局坐标系。此操作不受transform 的 scale 或 position的影响。返回的向量与 direction 有同样的长度。
public Vector3 TransformDirection(float x, float y, float z);
将 x、y、z方向从局部空间转换为世界空间。
Transform.InverseTransformDirection (全局——》 局部)
public Vector3 InverseTransformDirection(Vector3 direction);
将一个方向从全局坐标系转换到局部坐标系。和 Transform.TransformDirection 相反。此操作不受 scale 影响。如果vector 表示的是空间中的某一个位置而不是方向,则应使用 Transform.InverseTransformPoint
public Vector3 InverseTransformDirection(float x, float y, float z);
将某个方向的 x, y, z从世界空间变换到局部空间。
Transform.TransformVector (局部 ——》 全局)
public Vector3 TransformVector(Vector3 vector);
将一个向量从局部坐标系转换到全局坐标系。此操作不受 transform 位置的影响,但受 scale 影响。 返回的新向量可能与原向量不同的长度。
public Vector3 TransformVector(float x, float y, float z);
将向量 x, y, z从局部空间变换到世界空间。
Transform.InverseTransformVector (全局 ——》局部)
public Vector3 InverseTransformVector(Vector3 vector);
将一个向量从全局坐标系转换到局部坐标系。是与 Transform.TransformVector. 相反的。此操作受 scale 影响。
public Vector3 InverseTransformVector(float x, float y, float z);
一个向量(x, y, z)从世界坐标空间到局部坐标空间。这个操作与Transform.TransformVector相反。此操作受 scale 影响。
Transform.forward, Transform.right, Transform.up:
当前物体的物体坐标系的z轴,x轴,y轴在世界坐标系上的指向。
Vector3.forward ,(0,0,1)的缩写在 transform.Translate() 中使用时,如果不表明坐标系,则为物体的局部坐标,即物体自身的正前方。Vector3.right,(1,0,0)的缩写。 Vector3.up ,(0,1,0)的缩写。
屏幕坐标系与全局坐标系之间的相互转换
点击这里进入官网
Camera.ScreenToWorldPoint
public Vector3 ScreenToWorldPoint(Vector3 position);
将屏幕坐标转换为世界坐标。屏幕空间的坐标是以像素来表示的。屏幕左下角为(0,0); 右上角是(pixelWidth,pixelHeight).z的 位置是以世界单位衡量的到 Camera 的距离。
Camera.WorldToScreenPoint
public Vector3 WorldToScreenPoint(Vector3 position);public Vector3 WorldToScreenPoint(Vector3 position, Camera.MonoOrStereoscopicEye eye);
将全局坐标转换为屏幕坐标。屏幕空间的坐标是以像素来表示的。屏幕左下角为(0,0); 右上角是(pixelWidth,pixelHeight).z的 位置是以世界单位衡量的到 Camera 的距离。
Input.mousePosition:
public static Vector3 mousePosition;
获得鼠标在屏幕坐标系中的坐标(只读),它是以像素为单位的。屏幕或窗口的左下角是(0,0)。 屏幕或窗口的右上角位于(Screen.width,Screen.height)。注意:即使鼠标不在 Game 视图中,也会返回鼠标的位置,例如,即使当Cursor.lockState设置为CursorLockMode.None时也是如此。当以窗口模式运行且光标未被限制时,小于0或大于屏幕尺寸(Screen.width,Screen.height)的位置值表示鼠标光标在游戏窗口之外。
屏幕坐标系与视口坐标系之间的相互转换
Camera.ScreenToViewportPoint
public Vector3 ScreenToViewportPoint(Vector3 position);
将屏幕坐标转换为视口坐标。屏幕坐标的坐标是以像素来表示的。屏幕左下角为(0,0); 右上角是(pixelWidth,pixelHeight).z的 位置是以世界单位衡量的到 Camera 的距离。
Camera.ViewportToScreenPoint
public Vector3 ViewportToScreenPoint(Vector3 position);
将视口坐标转换为屏幕坐标视口坐标是相对于Camera 的 normalized 的。Camera 的左下角是(0,0); 右上角是(1,1)。z 的 位置是以世界单位衡量的到 Camera 的距离。
全局坐标系与视口坐标系 之间的相互转换
Camera.WorldToViewportPoint
public Vector3 WorldToViewportPoint(Vector3 position);public Vector3 WorldToViewportPoint(Vector3 position, Camera.MonoOrStereoscopicEye eye);
将全局坐标转换为视口坐标视口坐标是相对于Camera 的 normalized 的。Camera 的左下角是(0,0); 右上角是(1,1)。z 的 位置是以世界单位衡量的到 Camera 的距离。
Camera.ViewportToWorldPoint
public Vector3 ViewportToWorldPoint(Vector3 position);
将视口坐标转换为全局坐标。视口坐标是相对于Camera 的 normalized 的。Camera 的左下角是(0,0); 右上角是(1,1)。z 的 位置是以世界单位衡量的到 Camera 的距离。请注意,ViewportToWorldPoint 将x-y屏幕位置转换为3D空间中的x-y-z位置。
如果觉得《Unity中屏幕坐标 视口坐标和世界坐标 局部坐标与其之间的相互转换》对你有帮助,请点赞、收藏,并留下你的观点哦!