Unity3D的世界坐标与局部坐标转化

Unity3D中分世界坐标(World Space)和局部坐标。而Transform组件上所显示Position,Rotation,Scale均为局部坐标。

本文均为个人理解,有误希望大神能指出得以学习。

局部坐标是一种相对坐标,相对层级视图(Hierarchy)中的任意对象,而Transform组件上保存的是相对自身的父对象的值。

在C#中可以通过Transform实例化的对象来访问对象本身的Position,Rotation,Scale。这里所访问的Position,Rotation变量是世界坐标系下的值。 

        transform.position;
        transform.rotation;
        transform.localScale;

若想获取与组件上的本地坐标则应访问transform.localPosition; transform.localRotation;

有时需求世界坐标或者局部坐标,然而无法很便利的直接访问的情况下,Unity提供一个便利的API可以在对象的世界坐标和局部坐标间相互转化。需要注意的是局部坐标是相对一个对象来说的,因此世界坐标转成局部坐标需要给定相对对象的transform,例如从世界坐标

### Unity3D 中的对象坐标系 #### 定义区别 在 Unity3D 开发环境中,存在两种主要的坐标系统:本地坐标系(Local Coordinate System)和全局坐标系(World Coordinate System)。这两种坐标系统的差异在于它们参照的不同基点。 - **本地坐标系**是指物体自身的坐标体系,在这个体系下,原点位于该物体中心位置。当一个子对象附加到父级游戏对象上时,子对象的位置、旋和平移都是相对于父级而言的[^1]。 - **全局坐标系**即世界坐标系,它代表整个场景中的绝对定位方式。任何处于此空间内的实体都遵循统一的标准方向和尺度测量标准。对于顶级 GameObjects 而言,其变换属性直接对应于世界坐标;而对于嵌套结构里的组件,则需通过一系列换才能获取最终的世界坐标表示形式。 #### 使用方法及示例 为了更好地理解如何操作这两个不同的坐标框架,下面给出了一些具体的实践案例: ##### 将屏幕坐标转化世界坐标 ```csharp // 获取鼠标点击处的世界坐标并打印出来 Vector3 pos = Camera.main.ScreenToWorldPoint(Input.mousePosition); Debug.Log("世界坐标: " + pos); pos.z = 0; // 把Z坐标置0,放到2D平面上来处理 ``` 这段代码展示了怎样利用 `ScreenToWorldPoint` 方法把输入设备上的触摸/光标事件映射至三维虚拟环境内相应的真实地点。 ##### 访问和设置Transform组件下的不同类型的坐标数据 ```csharp using UnityEngine; public class CoordSystemExample : MonoBehaviour { void Start() { Transform myTransform = transform; // 打印当前GameObject的局部位置 Debug.Log("本地坐标 (Position): " + myTransform.localPosition); // 设置新的局部位置 myTransform.localPosition = new Vector3(5, 0, 0); // 打印当前GameObject的世界位置 Debug.Log("全球坐标 (Position): " + myTransform.position); // 设置新的世界位置 myTransform.position = new Vector3(-5, 0, 0); } } ``` 上述脚本说明了访问以及更改目标物体在其所属层次关系链路里所占据的空间参数的方法。值得注意的是,改变 `.localPosition` 只会影响相对父节点的姿态调整,而修改`.position`则会直接影响到实际存在于大范围视图中的表现形态。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值