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

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

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

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 }
时间: 2024-08-19 11:31:03

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

Three.JS 从世界坐标系转换到屏幕坐标系

var projector = new THREE.Projector(); var world_vector = new THREE.Vector3(0,0,1); var vector = projector.projectVector(world_vector, camera); var halfWidth = window.innerWidth / 2; var halfHeight = window.innerHeight / 2; var result = { x: Math.rou

Unity通过世界坐标系转换到界面坐标位置

public static Vector2 WorldToCanvasPoint(Canvas canvas, Vector3 worldPos) { Vector2 pos; RectTransformUtility.ScreenPointToLocalPointInRectangle(canvas.transform as RectTransform, Camera.main.WorldToScreenPoint(worldPos), canvas.worldCamera, out pos)

SQL横表纵表转换和对比

横表转纵表 横表样式: sql语句: 1 select Name,'语文' as 科目,Chinese as 成绩 from HorizontalTab 2 union all 3 select Name,'数学' as 科目,Math as 成绩 from HorizontalTab 4 union all 5 select Name,'英语' as 科目,English as 成绩 from HorizontalTab 6 order by Name,科目 desc 转换结果: 横表优缺点:

局部内部类和匿名内部类的对比

创建内部类的典型的方式是在一个方法体的里面创建,局部内部类不能有访问说明符,因为它不是外围类的一部分,但是它可以访问当前代码块内的常量,以及此外围类的所有成员.下面的例子对局部内部类与匿名内部类的创建进行了比较. 具体代码实现: 1 package thinking.in.java.demo; 2 3 //定义一个接口 4 interface Counter { 5 int next(); 6 } 7 8 // 主类LocalInnerClass 9 public class LocalInne

为什么局部下降最快的方向就是梯度的负方向?

https://blog.csdn.net/red_stone1/article/details/80212814什么是梯度?对于梯度下降算法(Gradient Descent Algorithm),我们都已经很熟悉了.无论是在线性回归(Linear Regression).逻辑回归(Logistic Regression)还是神经网络(Neural Network)等等,都会用到梯度下降算法.我们先来看一下梯度下降算法的直观解释: 假设我们位于黄山的某个山腰处,山势连绵不绝,不知道怎么下山.于

U3D局部坐标和全局坐标详解(或世界坐标)

父子化(摘自官文原文说明) 父子化 (Parenting) 是使用 Unity 时需要理解的最重要的概念之一.当某个游戏对象 (GameObject) 是另一个游戏对象 (GameObject) 的父级 (Parent) 时,子级 (Child) 游戏对象 (GameObject) 会像其父级 (Parent) 一样移动.旋转和缩放.正如您的手臂与躯干相连,转动躯干时,手臂因为与其相连也会移动.任何对象都可以有多个子级,但却只能有一个父级. 您可以通过将层级视图 (Hierarchy View)

openGL 坐标系的互相转换

openGL坐标系包括旋转,平移,缩放被塞在一个矩阵里面. 坐标系之间的转换基础是矩阵的运算. 每个矩阵代表的坐标系,就是是原点坐标系通过旋转.平移,缩放得到的坐标系. 当一个矩阵右乘一个向量或是还有一个矩阵,意味着把右边的变换.变成相对于左边的矩阵坐标系之上. 假设把一个世界坐标的X转换到一个矩阵上,我们能够矩阵右乘这个坐标: static float multiplyMX(Matrix4* matrix, float x) { return matrix->m[0] * x + matrix

Transform.TransformDirection 变换方向

官方描述: JavaScript ? TransformDirection(direction: Vector3): Vector3; C# ? Vector3 TransformDirection(Vector3 direction); Description 描述 Transforms direction from local space to world space. 变换方向从局部坐标转换到世界坐标. This operation is not affected by scale or

[3D数学]向量

<1>向量与标量: 向量:有方向有长度(非负,比如(1,0,0) 方向指向X+,长度为1.normalize向量规范化,向量方向不变,但是长度为1,计算向量夹角一般规范化向量,求出cosa的值,acos反余弦求夹角) 标量:只有长度(强调的是数值) <2>向量的维度: 2维(0,1)  3维(0,0,1)  4维(0,1,1,0)  4维在CG语言中:比如color就有4个维度rgba  _Time也有四个维度:值得注意的是:2维用x,y表示 3维用x,y,z表示 4维用x,y,z