20.Transform变换组件坐标转换

20.Unity重要组件和API-Transform坐标转换


20.1 知识点

目标向量

print("目标向量(可以是点或方向) " + Vector3.forward);//001

世界坐标转本地坐标

世界坐标系 转 本地坐标系 可以帮助我们大概判断一个相对位置

如图,球当做原点,方块在(1,0,1)位置。尝将世界坐标系的点(0,0,1)或向量(0,0,1)转换成方块本地坐标系下的点或向量
世界坐标系的点 转换为 相对本地坐标系的点 示意图
世界坐标系的方向 转换为 相对本地坐标系的方向 示意图

InverseTransformPoint方法 世界坐标系的点转换为相对本地坐标系的点

// 将 position 从世界空间变换到本地空间。
// 把一个世界坐标系的点用本地坐标系来表示
print("转换后的点 " + this.transform.InverseTransformPoint(Vector3.forward));

InverseTransformDirection方法 世界坐标系的方向转换为相对本地坐标系的方向(不受缩放影响)

// 将 direction 从世界空间变换到本地空间。与 Transform.TransformDirection 相反。
// 把一个以世界坐标系原点为起点的向量平移到以本地坐标系的原点后用本地坐标系来表示
print("转换后的方向(不受缩放影响)" + this.transform.InverseTransformDirection(Vector3.forward));

InverseTransformVector方法 世界坐标系的方向转换为相对本地坐标系的方向(受缩放影响)

// 将 vector 从世界空间变换到本地空间。与 Transform.TransformVector 相反。
// 把一个世界坐标系的向量的起点平移到本地坐标系的原点用本地坐标系来表示
print("转换后的方向(受缩放影响)" + this.transform.InverseTransformVector(Vector3.forward));

运行结果

本地坐标转世界坐标

本地坐标系 转 世界坐标系 可以帮助我们大概判断本地的相对位置

如图,球当做原点,方块在(1,0,1)位置。尝试将在方块本地坐标系点(0,0,1)或向量(0,0,1)转换成下世界坐标系的点或向量。
本地坐标系的点 转换为 相对世界坐标系的点 示意图
本地坐标系的方向 转换为 相对世界坐标系的方向 示意图

TransformPoint方法 本地坐标系的点转换为相对世界坐标系的点(受缩放影响)

// 将 position 从本地空间变换到世界空间。
// 把一个本地坐标系的点用世界坐标系来表示
print("本地 转 世界 点" + this.transform.TransformPoint(Vector3.forward));

TransformDirection方法 本地坐标系的方向转换为相对世界坐标系的方向(不受缩放影响)

// 将 direction 从本地空间变换到世界空间。
// 把一个以本地坐标系原点为起点的向量平移到以世界坐标系的原点后用世界坐标系来表示
print("本地 转 世界 方向" + this.transform.TransformDirection(Vector3.forward));

TransformVector方法 本地坐标系的方向转换为相对世界坐标系的方向(受缩放影响)

// 将 vector 从本地空间变换到世界空间。
// 把一个以本地坐标系原点为起点的向量平移到以世界坐标系的原点后用世界坐标系来表示
print("本地 转 世界 方向" + this.transform.TransformVector(Vector3.forward));

运行结果

总结

  • 其中最重要的就是本地坐标系的点转换为世界坐标系的点。
  • 比如,现在玩家要在自己面前的 n 个单位前放一团火,这个时候,我不用关心世界坐标系,通过相对于本地坐标系的位置转换为世界坐标系的点进行特效的创建或者攻击范围的判断。

20.2 知识点代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Lesson20_必不可少Transform_坐标转换 : MonoBehaviour
{ 
    void Start()
    {
        #region 知识点一 世界坐标转本地坐标

        //世界坐标系 转本地坐标系 可以帮助我们大概判断一个相对位置

        //目标向量
        print("目标向量(可以是点或方向) " + Vector3.forward);//001

        //InverseTransformPoint方法 世界坐标系的点 转换 为相对本地坐标系的点 受到缩放影响
        //将 position 从世界空间变换到本地空间。
        //把一个世界坐标系的点用本地坐标系来表示
        print("转换后的点 " + this.transform.InverseTransformPoint(Vector3.forward));

        //InverseTransformDirection方法 世界坐标系的方向 转换 为相对本地坐标系的方向 不受缩放影响
        //将 direction 从世界空间变换到本地空间。与 Transform.TransformDirection 相反。
        //把一个以世界坐标系原点为起点的向量平移到以本地坐标系的原点后用本地坐标系来表示
        print("转换后的方向(不受缩放影响)" + this.transform.InverseTransformDirection(Vector3.forward));

        //InverseTransformVector方法 世界坐标系的方向 转换 为相对本地坐标系的方向 受缩放影响
        //将 vector 从世界空间变换到本地空间。与 Transform.TransformVector 相反。
        //把一个世界坐标系的向量的起点平移到本地坐标系的原点用本地坐标系来表示
        print("转换后的方向(受缩放影响)" + this.transform.InverseTransformVector(Vector3.forward));

        #endregion

        #region 知识点二 本地坐标转世界坐标

        //TransformPoint方法 本地坐标系的点 转换 为相对世界坐标系的点 受到缩放影响
        //将 position 从本地空间变换到世界空间。
        //把一个本地坐标系的点用世界坐标系来表示
        print("本地 转 世界 点" + this.transform.TransformPoint(Vector3.forward));

        //TransformDirection方法 本地坐标系的方向 转换 为相对世界坐标系的方向 不受缩放影响
        //将 direction 从本地空间变换到世界空间。
        //把一个以本地坐标系原点为起点的向量平移到以世界坐标系的原点后用世界坐标系来表示
        print("本地 转 世界 方向" + this.transform.TransformDirection(Vector3.forward));

        //TransformVector方法 本地坐标系的方向 转换 为相对世界坐标系的方向 受缩放影响
        //将 vector 从本地空间变换到世界空间。
        //把一个以本地坐标系原点为起点的向量平移到以世界坐标系的原点后用世界坐标系来表示
        print("本地 转 世界 方向" + this.transform.TransformVector(Vector3.forward));

        #endregion
    }

    //总结
    // 其中最重要的 就是 本地坐标系的点 转世界坐标系的点
    // 比如 现在玩家要在自己面前的n个单位前 放一团火 这个时候 我不用关心世界坐标系
    // 通过 相对于本地坐标系的位置 转换为 世界坐标系的点 进行 特效的创建 或者 攻击范围的判断
}

20.3 练习题

一个物体A,不管它在什么位置,写一个方法,只要执行这个方法就可以在它的左前方(-1,0,1)处创建一个空物体

// 这个特性是让函数可以在Inspector窗口点击测试执行
[ContextMenu("左前方创建空物体")]
void TestFun1()
{
    #region 练习题一

    // 一个物体A,不管它在什么位置,写一个方法,只要执行这个方法就可以在它的左前方(-1,0,1)处创建一个空物体
    
    // 创建空物体并设置位置
    GameObject obj = new GameObject("左前方物体");
    obj.transform.position = this.transform.TransformPoint(new Vector3(-1, 0, 1));

    #endregion
}

一个物体A,不管它在什么位置,写一个方法,只要执行这个方法就可以在它的前方创建出3个球体,位置分别是(0,0,1),(0,0,2),(0,0,3)

// 这个特性是让函数可以在Inspector窗口点击测试执行
[ContextMenu("面前创建3个球体")]
void TestFun2()
{
    #region 练习题二

    // 一个物体A,不管它在什么位置,写一个方法,只要执行这个方法就可以在它的前方创建出3个球体,
    // 位置分别是(0,0,1),(0,0,2),(0,0,3)

    // 循环创建3个球体
    for (int i = 1; i <= 3; i++)
    {
        GameObject obj = GameObject.CreatePrimitive(PrimitiveType.Sphere);
        obj.transform.position = this.transform.TransformPoint(Vector3.forward * i);
    }

    #endregion
}

20.4 练习题代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Lesson20_练习题 : MonoBehaviour
{
    //这个特性是让函数可以在Inspector窗口点击测试执行
    [ContextMenu("左前方创建空物体")]
    void TestFun1()
    {
        #region 练习题一

        //一个物体A,不管它在什么位置,写一个方法,只要执行这个方法就可以在它的左前方(-1,0,1)处创建一个空物体

        //Vector3 pos = this.transform.TransformPoint(new Vector3(-1, 0, 1));
        GameObject obj = new GameObject("左前方物体");
        obj.transform.position = this.transform.TransformPoint(new Vector3(-1, 0, 1));

        #endregion
    }

    //这个特性是让函数可以在Inspector窗口点击测试执行
    [ContextMenu("面前创建3个球体")]
    void TestFun2()
    {
        #region 练习题二

        //一个物体A,不管它在什么位置,写一个方法,只要执行这个方法就可以在它的前方创建出3个球体,
        //位置分别是(0,0,1),(0,0,2),(0,0,3)

        //GameObject sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere);
        //sphere.transform.position = this.transform.TransformPoint(new Vector3(0, 0, 1));

        //sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere);
        //sphere.transform.position = this.transform.TransformPoint(new Vector3(0, 0, 2));

        //sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere);
        //sphere.transform.position = this.transform.TransformPoint(new Vector3(0, 0, 3));

        for (int i = 1; i <= 3; i++)
        {
            GameObject obj = GameObject.CreatePrimitive(PrimitiveType.Sphere);
            obj.transform.position = this.transform.TransformPoint(Vector3.forward * i);
        }

        #endregion
    }
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏