Unity3D : 本地坐标系,世界坐标系,和TransformPoint,TransformVector,TransformDirection的区别

目录

一、世界坐标系与本地坐标系

二、srcGameObject.transform.TransformPoint(Vector3  vec)

三、srcGameObject.transform.TransformVector(Vector3  vec)

四、srcGameObject.transform.TransformDirection(Vector3  vec)

五:示例


一、世界坐标系与本地坐标系

        世界坐标很好理解,就是模型的 transform.position,通常在无父物体的情况下,创建出来的模型默认位置就是世界坐标系的原点。

        每个物体都有自身的坐标系,此坐标系就是本地坐标系。本地坐标系的原点在模型确认后就无法更改,在Unity中本地坐标系的原点大多都在物体的重心处。两者坐标系如图所示

 注意,transform.localposition就是在父物体的本地坐标系下的本物体坐标。

二、srcGameObject.transform.TransformPoint(Vector3  vec)

       传的参数是在srcGameObject的本地坐标系下的vec点的相对位置,返回的是vec世界坐标。此函数受srcGameObject的scale缩放的影响。例如在一个物体旁边创建一个紧贴着原物体的新物体。

 Vector3 thePosition = srcObject.transform.TransformVector(Vector3.right * 1);
 newobject =
Unity中,理解不同坐标系之间的变换关系是进行3D开发的基础。以下是几种主要的坐标系及其相互转换方法。 ### 模型坐标系(Local Space) 模型坐标系也称为局部坐标系,是以物体自身为中心定义的位置方向。每个对象都有自己的局部坐标系,其位置、旋转缩放属性都是相对于父对象或场景原点而言的。 - **Transform组件**提供了`position`, `rotation`, `scale`属性来控制物体在局部坐标系中的位置姿态。 - 当一个物体作为另一个物体的子物体时,它的局部坐标系会基于父物体的坐标系进行变换。 ### 世界坐标系(World Space) 世界坐标系是一个全局坐标系,所有物体的位置、旋转缩放最终都会被转换到这个坐标系下以确定它们在场景中的实际表现。 - 使用`Transform.TransformPoint()`方法可以将一个点从局部坐标系转换到世界坐标系。 - 相反地,使用`Transform.InverseTransformPoint()`方法可以从世界坐标系转回局部坐标系。 - 对于向量,可以使用`Transform.TransformDirection()``Transform.InverseTransformDirection()`来进行方向上的转换。 ### 视窗坐标系(Viewport Space) 视窗坐标系是指摄像机视角下的坐标系统,通常用于UI元素或者屏幕空间的操作。它是一个归一化的坐标系统,范围从(0,0)到(1,1),其中(0,0)代表屏幕左下角,而(1,1)代表右上角。 - 将世界坐标转换为视窗坐标可以通过`Camera.WorldToViewportPoint()`函数实现。 - 反向转换则通过`Camera.ViewportToWorldPoint()`完成。 ### 屏幕坐标系(Screen Space) 屏幕坐标系与视窗坐标系类似,但它直接对应于实际像素尺寸,而不是归一化值。这对于处理鼠标输入或特定分辨率下的UI布局非常有用。 - 从世界坐标到屏幕坐标的转换可以使用`Camera.WorldToScreenPoint()`。 - 逆向转换则是利用`Camera.ScreenToWorldPoint()`。 ### 坐标系间的变换示例 下面是一些简单的代码示例,展示如何在这些坐标系之间进行基本的转换: #### 从局部坐标转换到世界坐标 ```csharp // 获取当前物体的Transform组件 Transform myTransform = GetComponent<Transform>(); // 定义一个局部坐标点 Vector3 localPosition = new Vector3(1.0f, 0.0f, 0.0f); // 转换到世界坐标 Vector3 worldPosition = myTransform.TransformPoint(localPosition); ``` #### 从世界坐标转换到视窗坐标 ```csharp // 获取主摄像机 Camera mainCamera = Camera.main; // 定义一个世界坐标点 Vector3 worldPosition = new Vector3(0.0f, 0.0f, 10.0f); // 转换到视窗坐标 Vector3 viewportPosition = mainCamera.WorldToViewportPoint(worldPosition); ``` #### 从屏幕坐标转换到世界坐标 ```csharp // 获取主摄像机 Camera mainCamera = Camera.main; // 定义一个屏幕坐标点(例如鼠标点击位置) Vector3 mousePosition = Input.mousePosition; mousePosition.z = 10.0f; // 设置z轴深度 // 转换到世界坐标 Vector3 worldPosition = mainCamera.ScreenToWorldPoint(mousePosition); ``` 以上就是Unity中几种常见坐标系及其相互转换的基本概念方法。了解并掌握这些知识对于创建复杂的交互式3D应用至关重要[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值