文章

Unity 坐标系相关

Unity 坐标系相关

Unity 中的几种坐标系

世界坐标系

World Coordinate System,世界坐标就是物体的 transform.position,通常在无父物体的情况下,创建出来的物体默认位置就是世界坐标系的原点。


本地坐标系

Local Coordinate System,本地坐标系是相对于物体自身的坐标系,Unity 中可能有多种叫法:本地坐标系、自身坐标系、物体坐标系、模型坐标系。在 Unity 中本地坐标系的原点大多都在物体的中心处,也可以根据实际情况设定,比如人体小臂的自身坐标系原点一般在肘关节处,大臂的自身坐标系原点一般在肩关节处。


局部坐标系

在 Unity 编辑器中,设置的就是本物体的局部坐标,也是父物体的本地坐标系


注意!!!本地坐标系 ≠ 局部坐标系,Unity 开发中一般使用 position 和 localPosition。

在 Unity 编辑器的 Hierarchy 面板中,所显示的 Transform 组件的 Position、Rotation、Scale,对应的是物体的 localPosition、localRotation、localScale,局部坐标系相当于父物体的本地坐标系。对于无父物体的物体而言,就是基于世界坐标系。


Unity 官方文档对于 Rotate 方法绕轴旋转顺序的描述

Description

Applies a rotation of eulerAngles.z degrees around the z-axis, eulerAngles.x degrees around the x-axis, and eulerAngles.y degrees around the y-axis (in that order).


不管物体绕哪个坐标系旋转,都要在旋转前,先把参照系平移到与物体自身坐标系原点重合,然后再旋转。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
// Space.World(Applies transformation relative to the world coordinate system.)
// 物体调用 rotate 方法时设置 Space.World 参数,就是绕物体世界坐标系旋转
//
// Space.Self(Applies transformation relative to the local coordinate system.)
// 物体调用 rotate 方法时设置 Space.Self 参数,就是绕物体自身坐标系旋转
// 点击一个物体,切换到旋转模式进行旋转节点,也是基于自身坐标系
cube.transform.Rotate(10, 20, 30, Space.Self);


// 局部坐标 转 世界坐标
public Vector3 TransformPoint(Vector3 position);


// 世界坐标 转 局部坐标
public Vector3 InverseTransformPoint(Vector3 position);





// 1、基于自身坐标系,方法内部按照 z-x-y 顺规旋转,每个轴旋转时参考的都是调用 Rotate 方法那一时刻的自身坐标系
cube1.transform.Rotate(30, 40, 50); // 默认是 Space.Self

// 2、当基于自身坐标系时,可分解成3次旋转,都基于自身坐标系且依次沿着 y-x-z 轴旋转,结果和第 1 一样
cube1.transform.Rotate(0, 45, 0);
cube1.transform.Rotate(45, 0, 0); // 基于上一步绕 y 轴旋转后的结果
cube1.transform.Rotate(0, 0, 45); // 基于上一步绕 x 轴旋转后的结果

// 3、指定基于世界坐标系,方法内部按照 z-x-y 顺规旋转,每个轴旋转时参考的是固定不变的世界坐标系
cube2.transform.Rotate(45, 45, 45, Space.World);

// 4、基于世界坐坐标系时,可分解成3次旋转,都基于世界坐坐标系且依次沿着 z-x-y 轴旋转,结果和第 3 一样
cube2.transform.Rotate(0, 0, 45, Space.World);
cube2.transform.Rotate(45, 0, 0, Space.World);
cube2.transform.Rotate(0, 45, 0, Space.World);


void Update()
{
    // 物体 cube1 绕自身坐标系的 y 轴旋转
    cube1.transform.Rotate(0, 10 * Time.deltaTime, 0, Space.Self);
}


参考

本文由作者按照 CC BY 4.0 进行授权