Unity—3D数学基础

今天用了小半天时间初步了解3D数学基础!明天开始进入unity游戏脚本编写!

每日一句:“人间骄阳正好 风过林梢 彼时我们正当年少”

目录

3D坐标系:

·全局(世界)坐标系:

·局部(模型、物体)坐标系:

·相机坐标系:

·屏幕坐标系:

向量

向量的运算:

Vector3类

Vector3应用:

·计算两物体间的距离

·缓动效果

齐次坐标

四元数

坐标转换原理

世界坐标与局部坐标的转换:改变全局和局部坐标

世界坐标与屏幕坐标的转换:设置世界坐标

·如何通过鼠标单击来设置物体的世界坐标位置


3D坐标系:

·全局(世界)坐标系:

描述游戏场景内所有物体位置和方向的基准

Hierrarchy视图中Position属性为(1,2,3)表示它距离全局坐标系原点在x轴方向上有1个单位坐标,在y轴方向上有2个单位坐标,在z轴方向上有3个单位坐标

当游戏对象父物体时,其Hierrarchy视图中Position显示为局部坐标,当游戏对象父物体时,其Hierrarchy视图中Position显示既是局部坐标也是全局坐标

·局部(模型、物体)坐标系

每个物体都有其独立的物体坐标系,并且随物体进行移动或者旋转

模型mesh保存的顶点坐标均为局部坐标系下的坐标

父子物体的坐标系是关联的,子物体会以父物体的某一坐标点为自身的坐标原点

·相机坐标系:

根据观察位置和方向建立的坐标系

判断物体是否在相机前方,以及物体之间的先后遮挡顺序

·屏幕坐标系:

建立在屏幕上的二维坐标系,用来描述像素在屏幕上的位置,其中原点位置(0,0)在屏幕左下角

向量

用于描述具有大小和方向两个属性的物理量

向量的运算:

·加减

·数乘

向量与一个标量相乘

·点乘

两个向量点乘得到一个标量,数值等于两个向量长度相乘后再乘以二者夹角的余弦值

·叉乘

两个向量的叉乘得到一个新的向量,新向量垂直于原来的两个向量,并且长度等于原向量长度相乘后再乘夹角的正弦值

Vector3类

Vector3成员变量

Vector3方法

 

Vector3应用:

·计算两物体间的距离

public class Distance : MonoBehaviour
{
    // Start is called before the first frame update
    public Transform objTrans1;
    public Transform objTrans2;
    void Start()
    {
        float dis = Vector3.Distance(objTrans1.position, objTrans2.position);
        Debug.Log("Distance:" + dis);
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

(Debug.Log将消息记录到Unity控制台)

将脚本绑定给场景中的主相机Main Camera,然后再Inspector视图中objTrans1objTrans2指定为2个cube

运行、CTRL+SHIFT+C调出控制台

·缓动效果

Vector3.Lerp方法

让物体从当前位置移动到坐标系下的坐标另一个位置的缓动效果

public class MoveToTarget : MonoBehaviour
{
    public Transform endTrans;
    // Start is called before the first frame update
    void Start()
    {
        
    }
    // Update is called once per frame
    void Update()
    {
        transform.position = Vector3.Lerp(transform.position, endTrans.position, Time.deltaTime);
    }
}

Time.deltaTime 表示 Update() 方法上完成上一帧所用的时间

将脚本绑定给场景中的Cube上,然后在其Inspector视图中将endTrans指定为Cube(1)

齐次坐标

将原本三维的向量(x,y,z)用四维向量(wx,wy,wz,w)来表示

引入目的

更好地区分向量和点;

统一用矩阵乘法表示平移、旋转、缩放变换

当分量w=0时可以用来表示无穷远的点

四元数

包含一个标量分量和一个三维向量分量,四元数Q记作Q=[w,(x,y,z)]

在游戏对象的 Transform 组件中,变量 Transform.rotation 为对象在全局坐标系下的旋转;变量 Transform.localRotation 为对象在父对象的局部坐标系下的旋转

应用:通过四元数控制对象旋转

坐标转换原理

世界坐标与局部坐标的转换:改变全局和局部坐标

ransform 组件的 Transform.TransformPoint 方法可以将坐标点从局部坐标系转换到全局坐标系,Transform.InverseTransformPoint 方法可以将坐标点从全局坐标系转换到局部坐标系

世界坐标与屏幕坐标的转换:设置世界坐标

在 Unity 中,由于屏幕的画面是由相机(Camera)所呈现的,所以世界坐标和屏幕坐标之间的转换需要以相机为媒介

·如何通过鼠标单击来设置物体的世界坐标位置

新建 C# 脚本

public class ScreenToWorldPoint : MonoBehaviour
{
    Vector3 screenPos;
    // Start is called before the first frame update
    void Start()
    {
        screenPos = Camera.main.WorldToScreenPoint(transform.position);
        //打印坐标信息
        Debug.Log("屏幕坐标:" + screenPos);
    }

    // Update is called once per frame
    void Update()
    {
        if(Input.GetMouseButtonDown(0))
        {
            //获取鼠标的位置坐标
            Vector3 mousePos = Input.mousePosition;
            //将物体屏幕坐标的z轴值赋值给鼠标坐标的z轴
            mousePos.z = screenPos.z;
            //将屏幕坐标换成世界坐标
            Vector3 worldPos = Camera.main.ScreenToWorldPoint(mousePos);
            //设置物体位置
            transform.position = worldPos;
        }
    }
}

将脚本绑定到 Cube 立方体上

当运行开始时,控制台中会输出该 Cube 的世界坐标转换成屏幕的坐标;当鼠标指针在 Game 视图,单击左键时,可以看到Cube 的位置会跟随鼠标指针的位置移动

世界坐标转换成屏幕坐标后,屏幕坐标的 z 轴大于 0,则说明该坐标在相机前方,反之,则说明该坐标在相机后方

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值