点、向量、方向在局部与世界坐标系转换的对比
局部与世界坐标系除了在父子关系的物体中有重要的应用(父子物体中,局部坐标系与世界坐标系的区别)
在多个同级物体间也有重要应用,(例如围绕移动的物体旋转,摄像机跟随等)
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 }