zoukankan      html  css  js  c++  java
  • 点、向量、方向在局部与世界坐标系转换的对比

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

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

    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 }
  • 相关阅读:
    Node学习之(第二章:http模块)
    Node.js学习(第二章:node核心模块--fs)
    Node.js学习(第一章:Node.js安装和模块化理解)
    Node.js学习(第一章:Node.js简介)
    js控制手机震动
    js发送windows提示信息
    js操作一般文件和csv文件
    js操作indexedDB增删改查示例
    js获取用户实时地理位置
    js处理数值和日期本地化
  • 原文地址:https://www.cnblogs.com/muxiaomo/p/4523926.html
Copyright © 2011-2022 走看看