【Unity】关于transform.TransformPoint的坐标转换

文章转自马尧shawn

之前在做项目的时候,有一个需求。需要对UI的操作对象进行一个位移动画,移动到另一参照物上。由于UI结构比较复杂,操作对象与参照对象,分别是不同父物体下的子物体,这就涉及到了本地坐标和世界坐标的转换。查了下API,发现Unity已经提供好了相应的接口,就是Transform.TransformPoint。于是只要理清相对坐标的概念,就非常的好处理了。


如图,创建了4个GameObject(Cube),我现在的目的是,再不改变obj4的父物体对象的情况下,让obj4与obj1重叠。由于obj4是obj3的子物体,那么obj4在Inspector面板下展示的坐标是相对obj3的本地坐标。如果想让obj4与obj1重叠,只局限于本地坐标的计算,是不可能得出想要的结果的。

我们必须通过转换成世界坐标系,再转换回本地坐标系得出想要的结果。

由于obj1使我们的目标,它相对于我们想要移动的对象的世界坐标为:

V1 =目标对象.transform.TransformPoint(操作对象.transform.localPosition);


世界坐标已经找到,再将此相对的世界坐标转换成操作对象的本地坐标:

操作对象.transform.InverseTransformPoint(v1);


所得的结果就是现在obj4与obj1重叠所需的本地坐标了。

为了方便测试,简单的写了点编辑器,证明结论正确。



最终测试代码如下:


 
 
  1. using UnityEngine;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. public class InversePosition : MonoBehaviour
  5. {
  6. public List<Transform> posList;
  7. [ HideInInspector]
  8. public Transform selectTransform;
  9. [ HideInInspector]
  10. public Transform targetTransform;
  11. void Start()
  12. {
  13. Print();
  14. }
  15. public void Print()
  16. {
  17. //操作的obj的世界坐标
  18. Debug.Log( string.Format( "选择的物体({0})的世界坐标:{1}", selectTransform.name, selectTransform.transform.position));
  19. //操作的obj的本地坐标
  20. Debug.Log( string.Format( "选择的物体({0})的本地坐标:{1}", selectTransform.name, selectTransform.transform.localPosition));
  21. //目标obj的世界坐标
  22. Debug.Log( string.Format( "目标物体({0})的世界坐标:{1}", targetTransform.name, targetTransform.transform.position));
  23. //目标obj的本地坐标
  24. Debug.Log( string.Format( "目标物体({0})的本地坐标:{1}", targetTransform.name, targetTransform.transform.localPosition));
  25. //目标obj相对于操作obj的世界坐标(trabsform.TransformPoint)
  26. Vector3 v4 = targetTransform.transform.TransformPoint(selectTransform.localPosition);
  27. Debug.Log( string.Format( "目标obj相对于选择obj的世界坐标(TransformPoint):{0}", v4));
  28. //操作目标的最终位置
  29. Debug.Log(selectTransform.transform.InverseTransformPoint(v4));
  30. }
  31. }

综上,在能确定目标位置的情况下,将某一子物体移动到该位置。都可以通过tranform.TransformPoint与transform.InverseTransformPoint两步转换获得。
  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值