Unity学习总结篇(1)关于各种坐标系
目录
一、世界坐标系(World Space)
二、物体坐标系(Local Space)
世界坐标 ↔ 本地坐标
三、屏幕坐标系(Screen Space)
四、视口坐标系(Viewport Space)
世界坐标 ↔ 视口坐标
屏幕坐标 ↔ 视口坐标
结:
Unity 坐标系转换 API 与属性总结表
一、世界坐标系(World Space)
全局参考系,原点为场景原点 (0, 0, 0),所有对象的位置、旋转、缩放均基于此坐标系。
核心属性:
transform.position:世界坐标系中的位置。
transform.rotation:四元数表示的世界旋转。
transform.eulerAngles:欧拉角形式的世界旋转。
transform.lossyScale:世界坐标系中的缩放(只读,因层级缩放影响)。
二、物体坐标系(Local Space)
相对于父对象的位置,若无父对象则与世界坐标系一致。
核心属性:
transform.localPosition:父对象坐标系中的位置。
transform.localRotation:相对于父对象的旋转(四元数)。
transform.localEulerAngles:本地欧拉角。
transform.localScale:相对于父对象的缩放。
世界坐标 ↔ 本地坐标
// 世界坐标转本地坐标
Vector3 localPos = transform.InverseTransformPoint(worldPos);// 本地坐标转世界坐标
Vector3 worldPos = transform.TransformPoint(localPos);// 方向与向量转换(忽略位置)
Vector3 localDir = transform.InverseTransformDirection(worldDir);
Vector3 worldDir = transform.TransformDirection(localDir);// 本地向量 → 世界向量
Vector3 worldVector = transform.TransformVector(localVector);// 世界向量 → 本地向量
Vector3 localVector = transform.InverseTransformVector(worldVector);
三、屏幕坐标系(Screen Space)
基于屏幕像素的坐标系,左下角为 (0, 0),右上角为 (Screen.width, Screen.height)。
核心属性:
Input.mousePosition:鼠标在屏幕坐标系中的位置。
Screen.width / Screen.height:屏幕分辨率。
世界坐标 ↔ 屏幕坐标
// 世界坐标转屏幕坐标(z 值为距摄像机深度)
Vector3 screenPos = Camera.main.WorldToScreenPoint(worldPos);// 屏幕坐标转世界坐标(需指定深度)
Vector3 worldPos = Camera.main.ScreenToWorldPoint(new Vector3(screenPos.x, screenPos.y, cameraDepth));
四、视口坐标系(Viewport Space)
归一化坐标系,范围 [0, 1],左下角 (0, 0),右上角 (1, 1),基于摄像机视口。
世界坐标 ↔ 视口坐标
// 世界坐标转视口坐标
Vector3 viewportPos = Camera.main.WorldToViewportPoint(worldPos);// 视口坐标转世界坐标
Vector3 worldPos = Camera.main.ViewportToWorldPoint(viewportPos);
屏幕坐标 ↔ 视口坐标
// 视口坐标转屏幕坐标
Vector3 screenPos = Camera.main.ViewportToScreenPoint(viewportPos);// 屏幕坐标转视口坐标
Vector3 viewportPos = Camera.main.ScreenToViewportPoint(screenPos);
结:
Unity 坐标系转换 API 与属性总结表
属性/方法 | 参数 | 返回值 | 作用 | 是否受缩放影响 | 父子级关系影响 |
---|---|---|---|---|---|
世界坐标系相关属性 | |||||
transform.position | - | Vector3 | 获取/设置世界坐标系中的位置 | 否(仅自身位置) | 是(综合父级变换) |
transform.rotation | - | Quaternion | 获取/设置世界坐标系中的旋转(四元数) | 否 | 是 |
transform.eulerAngles | - | Vector3 | 获取/设置世界坐标系中的欧拉角 | 否 | 是 |
transform.lossyScale | - | Vector3 | 获取世界坐标系中的缩放(累积父级缩放) | 是(综合父级缩放) | 是 |
物体坐标系相关属性 | |||||
transform.localPosition | - | Vector3 | 获取/设置父物体坐标系中的位置 | 否 | 是(仅父级影响) |
transform.localRotation | - | Quaternion | 获取/设置父物体坐标系中的旋转(四元数) | 否 | 是 |
transform.localEulerAngles | - | Vector3 | 获取/设置父物体坐标系中的欧拉角 | 否 | 是 |
transform.localScale | - | Vector3 | 获取/设置相对于父物体的缩放 | 是 | 是 |
世界 ↔ 本地坐标转换方法 | |||||
transform.TransformPoint | localPoint | Vector3 | 本地坐标 → 世界坐标(包含位置、旋转、缩放) | 是 | 是 |
transform.InverseTransformPoint | worldPoint | Vector3 | 世界坐标 → 本地坐标 | 是 | 是 |
transform.TransformDirection | localDirection | Vector3 | 本地方向 → 世界方向(仅受旋转影响) | 否 | 是 |
transform.InverseTransformDirection | worldDirection | Vector3 | 世界方向 → 本地方向 | 否 | 是 |
transform.TransformVector | localVector | Vector3 | 本地向量 → 世界向量(受旋转和缩放影响) | 是 | 是 |
transform.InverseTransformVector | worldVector | Vector3 | 世界向量 → 本地向量 | 是 | 是 |
世界 ↔ 屏幕坐标转换方法 | |||||
Camera.WorldToScreenPoint | worldPos | Vector3 | 世界坐标 → 屏幕坐标(包含深度值) | 否 | 否 |
Camera.ScreenToWorldPoint | screenPos (含深度) | Vector3 | 屏幕坐标 → 世界坐标 | 否 | 否 |
世界 ↔ 视口坐标转换方法 | |||||
Camera.WorldToViewportPoint | worldPos | Vector3 | 世界坐标 → 视口坐标(归一化) | 否 | 否 |
Camera.ViewportToWorldPoint | viewportPos | Vector3 | 视口坐标 → 世界坐标 | 否 | 否 |
屏幕 ↔ 视口坐标转换方法 | |||||
Camera.ViewportToScreenPoint | viewportPos | Vector3 | 视口坐标 → 屏幕坐标 | 否 | 否 |
Camera.ScreenToViewportPoint | screenPos | Vector3 | 屏幕坐标 → 视口坐标 | 否 | 否 |