Bootstrap

unity3d————坐标转换(世界转本地)

this.transform.InverseTransformPoint

1. 世界坐标系与局部坐标系
  • 世界坐标系:Unity3D 中的全局参考框架,所有游戏对象的位置、旋转和缩放都是相对于这个框架来定义的。
  • 局部坐标系:每个游戏对象都有自己的局部坐标系,这个坐标系是相对于该游戏对象的位置、旋转和缩放来定义的。
2. InverseTransformPoint 的作用

当你有一个在世界坐标系中的点,并且你想知道这个点在当前游戏对象的局部坐标系中的位置时,你可以使用 InverseTransformPoint 方法。

3. 使用方法

Vector3 worldPoint = new Vector3(x, y, z); // 世界坐标系中的点  
Vector3 localPoint = this.transform.InverseTransformPoint(worldPoint);

4. 实际应用

5. 注意事项

  • worldPoint:这是一个 Vector3 类型的变量,表示你想转换的世界坐标系中的点。
  • localPoint:这也是一个 Vector3 类型的变量,它将包含转换后的局部坐标系中的点。
  • 碰撞检测:如果你想知道一个世界空间中的点是否与某个游戏对象的局部空间中的某个区域相交,你可以先将这个点转换到该游戏对象的局部空间中,然后进行判断。
  • UI 定位:在将 UI 元素定位到世界空间中的特定位置时,可能需要先将世界坐标转换为局部坐标,以便在 UI 的局部坐标系中进行布局。
  • 摄像机视角:在处理摄像机视角和屏幕空间坐标时,有时需要将世界坐标转换为摄像机的局部坐标,以便进行进一步的计算。
  • 转换是基于当前游戏对象的 Transform 组件的,包括位置、旋转和缩放。
  • 如果游戏对象被缩放了,转换后的点可能会受到缩放的影响。
  • 这个方法不会改变原始点的位置,而是返回一个新的 Vector3 对象,表示在局部坐标系中的位置。

 this.transform.InverseTransformDirection
 this.transform.InverseTransformVector 

在Unity3D中,this.transform.InverseTransformDirectionthis.transform.InverseTransformVector是两个与坐标转换相关的API,它们都将世界坐标系(或全局坐标系)中的方向或向量转换到当前游戏对象的局部坐标系中。尽管这两个方法听起来很相似,但它们在处理向量时有着细微的差别。下面我将详细解释这两个API。

1. this.transform.InverseTransformDirection

作用

InverseTransformDirection方法用于将方向从世界坐标系转换到当前游戏对象的局部坐标系中。这个转换考虑了游戏对象的旋转,但不考虑其位置和缩放。

使用场景
  • 当你想要知道一个世界空间中的方向在当前游戏对象的局部空间中是如何表示的时,可以使用这个方法。
  • 这在处理角色的朝向、摄像机的视角方向或任何需要基于局部坐标系来判断方向的情况下都非常有用。
示例
Vector3 worldDirection = new Vector3(1, 0, 0); // 假设这是世界空间中的一个方向  
Vector3 localDirection = transform.InverseTransformDirection(worldDirection);

在这个例子中,localDirection将会是worldDirection在当前游戏对象的局部坐标系中的表示。

2. this.transform.InverseTransformVector

作用

InverseTransformVector方法也用于将向量从世界坐标系转换到局部坐标系中,但它与InverseTransformDirection的不同之处在于,它不仅考虑了旋转,还考虑了缩放。然而,需要注意的是,尽管方法名中包含“Vector”,但这个操作实际上并不改变向量的大小(长度),而是将其方向从世界空间转换到局部空间,并考虑了缩放因素对接方向的影响。这里的“向量”更多地是指具有方向和大小的量,但在转换过程中大小是不变的。

使用场景
  • 当你需要将一个世界空间中的力或速度向量应用到当前游戏对象上,并且希望这个向量能够正确地根据游戏对象的旋转和缩放来影响对象时,可以使用这个方法。
  • 这在处理物理碰撞、移动对象或应用力时非常有用。
示例
Vector3 worldVector = new Vector3(1, 0, 0); // 假设这是世界空间中的一个向量  
Vector3 localVector = transform.InverseTransformVector(worldVector);

在这个例子中,localVector将会是worldVector在当前游戏对象的局部坐标系中的方向表示,但大小(长度)保持不变。

注意事项

  • 这两个方法都不会改变原始向量的值,而是返回一个新的Vector3对象来表示转换后的结果。
  • 在使用这些方法时,要确保你理解它们之间的差异,特别是当处理涉及缩放的游戏对象时。
  • 转换是基于当前游戏对象的Transform组件的,包括其位置、旋转和缩放。但是,对于方向转换来说,位置是不相关的,而缩放只在InverseTransformVector中考虑。

 

;