点、向量、方向在局部与世界坐标系转换的对比

局部与世界坐标系除了在父子关系的物体中有重要的应用(父子物体中,局部坐标系与世界坐标系的区别

在多个同级物体间也有重要应用,(例如围绕移动的物体旋转,摄像机跟随等)

1.某个点在局部坐标系与世界坐标系的转换   
   worldPosition = target.transform.TransformPoint(localPosition );
   localPosition = target.transform.InverseTransformPoint(worldPosition );
2.某个向量在局部坐标系与世界坐标系的转换
   worldVector = target.transform.TransformVector(localVector);
   localVector = target.transform.InverseTransfromVector(worldVector);
以上两者区别:
   在转换过程中,point以target的位置为起点做变换计算(适用于计算在物体运动中的固定偏移位置),vector以世界坐标系零点为起点做变换计算。
3.某个方向在局部坐标系与世界坐标系的转换
   worldDirection = target.transform.TransformDirection(localDirection);
   localDirection = target.transform.TransformDirection(worldDirection);
以上三者区别:
   在转换过程中,point和vector均受物体的缩放影响(等比例改变),direction以世界坐标系零点为起点,不受target位置、缩放的影响,适用于计算物体运过程中固定大小方向的受力或速度。
 

应用:

围绕移动物体的y轴旋转
源码分享:
 1 public class FollowRotate : MonoBehaviour {
 2     public GameObject m_Target;                             // 目标物体
 3     public float m_RotateSpeed = 1F;                        // 旋转速度
 4     private Vector3 m_RelativePosition;                     // 相对位置
 5     // Use this for initialization
 6     void Start () {
 7         // 获取相对于目标物体的相对位置
 8         m_RelativePosition = m_Target.transform.InverseTransformPoint(transform.position);        
 9     }
10     
11     // Update is called once per frame
12     void Update () {
13         // 根据物体的相对位置计算物体的旋转后的相对位置(始终围绕目标的y轴旋转)
14         m_RelativePosition = new Vector3
15         (
16             m_RelativePosition.x * Mathf.Cos(Time.deltaTime * m_RotateSpeed) - m_RelativePosition.z * Mathf.Sin(Time.deltaTime * m_RotateSpeed),
17             m_RelativePosition.y,
18             m_RelativePosition.z * Mathf.Cos(Time.deltaTime * m_RotateSpeed) + m_RelativePosition.x * Mathf.Sin(Time.deltaTime * m_RotateSpeed)
19         );
20         // 将旋转后的相对位置转化为世界位置,赋值
21         transform.position = m_Target.transform.TransformPoint(m_RelativePosition);
22     }
23 }
24  

摄像机跟随

源码分享:

 1 public class CameraFollowController : MonoBehaviour 
 2 {
 3     public GameObject m_Target;                             // 玩家
 4     public Vector3 m_Offset;                                // 相对玩家的偏移位置
 5     public float m_SmoothTime = 0.3F;                       // 平滑移动时间
 6 
 7     private Vector3 m_Velocity = Vector3.zero;              // 摄像机移动速度
 8     private Vector3 m_DestPosition;                         // 摄像机目的地位置
 9 
10     void Update ()
11     {
12         // 转向 - 摄像机看向目标点位置
13         transform.LookAt(m_Target.transform.position);
14         // 获取摄像机目的地位置 - 将相对于目标位置的偏移位置转化为世界坐标
15         m_DestPosition = m_Target.transform.TransformPoint(m_Offset);
16         // 平滑阻尼移动摄像机
17         transform.position = Vector3.SmoothDamp(transform.position, m_DestPosition, ref m_Velocity, m_SmoothTime);
18     }
19 }
原文地址:https://www.cnblogs.com/muxiaomo/p/4523926.html