Unity入门操作_向量_002

在虚拟的游戏世界中,3D数学决定了游戏,如何计算和模拟出开发者以及玩家看到的每一帧画面。学习基础的3D数学知识可以帮主用户对游戏引擎产生更深刻的了解。
向量定义:既有大小又有方向的量叫做向量。在空间中,向量用一段有方向的线段来表示。应用十分广泛,可用于描述具有大小和方向两个属性的物理量,例如物体运动的速度、加速度、摄像机观察方向、刚体受到的力等都是向量。因此向量是物理、动画、三维图形的基础。
模:向量的长度标准化(Normalizing):保持方向不变,将向量的长度变为1.
单位向量:长度为1的向量。
零向量:各分量均为0的向量

向量运算——加减:向量的加法(减法)为各个分量分别相加(相减)。在物理上可以用来计算两个里的合力,或者几个速度份量的叠加。

Unity入门操作_向量_002

Unity入门操作_向量_002

Unity入门操作_向量_002

Unity入门操作_向量_002

 Debug.Log(Vector3.one);打印出一个世界级别的单位向量(x,y,z)

Unity入门操作_向量_002

        forward :表示向前(z)

Unity入门操作_向量_002

        right:表示向右(x)
        up:表示向上(y)
        zero:表示世界原点
        Vector3.sqrMagnitude 长度平方
        Debug.Log("forward:" + Vector3.forward);
        Debug.Log("right:" + Vector3.right);
        Debug.Log("up:" + Vector3.up);
        Debug.Log("Zero:" + Vector3.zero);
        Vector3 v1 = new Vector3(2, 2, 2);
        Debug.Log("向量的长度平方:" + v1.sqrMagnitude);
        Debug.Log("向量的长度:" + v1.magnitude);
        //在该向量的方向上去一个单位向量
        Debug.Log(v1.normalized);
        Vector3 v2 = v1.normalized;
        Debug.Log("x:" + v2.x);
        Debug.Log("y:" + v2.y);
        Debug.Log("z:" + v2.z);
        Vector3 v3 = new Vector3(2, 5, 9);
        Vector3 v4 = new Vector3(1, 1, 1);
        Vector3 result = v3 - v4;
        Debug.Log("result" + result);
        Debug.Log(Vector3.one * 5);
        //没有乘法
        //Debug.Log(Vector3.one * Vector3.one);

Vector3.Dot 点乘

        Vector3 v1 = new Vector3(2,0,0);
        Vector3 v2 = new Vector3(-2,0,2);
        float dotValue = Vector3.Dot(v1, v2);

       //得到的是(平行四边形)面积(标量)

        Debug.Log("点乘的结果:" +dotValue);

        float temp = dotValue / (v1.magnitude * v2.magnitude);

        float aCosTemp = Mathf.Acos(返回F -余弦弧度的余弦角F.)(temp);
        Debug.Log(aCosTemp+"7");
        //弧度
        float degrees1 = Mathf.Rad2Deg;
        Debug.Log(degrees1 + "6");
        //角度
        float degrees = Mathf.Rad2Deg * aCosTemp;
        Debug.Log(degrees+"5");

Vector3.Cross 叉乘 


        Vector3 v1 = new Vector3(1, 3, 5);
        Vector3 v2 = new Vector3(4, 6, 3);
        Vector3 ret = Vector3.Cross(v1,v2);
        Debug.Log(ret);

使用叉乘我们可以得到两个向量组成的平面的法向量
求法向量的另一种途径就是列方程
例如:a = (1,3,4)  b=(2,5,9)
求此平面的一个法向量
解:可以设此平面的法向量,则有

axm=0    x+3y+4z = 0
bxm=0    2x+5y+9z = 0

得 x = -7z   y = z
令z = 1 m=(-7,1,1)

Vector3.Distance 距离
Vector3.Lerp 插值(一个线性函数,把两点之间分成0,1一种等比算法)
Vector3.Normalize 规范化(取单位为1的长度,不足一时需注意!)
求两个向量之间的的夹角
第一种方式
float angle = Mathf.Acos (Vector3.Dot (a.normalized, b.normalized)) * Mathf.Rad2Deg;
第二种方式
angle = Mathf.Asin (Vector3.Distance (Vector3.zero, Vector3.Cross (a.normalized, b.normalized))) * Mathf.Rad2Deg;
求一个角度的余弦值的时候,我们要使用Mathf.Cos,参数是弧度制  转化弧度要将角度*Mathf.Deg2Rad Debug.Log("forward:" + Vector3.forward);


Unity中    

叉乘得到A,B向量大的相对位置,和顺时针或逆时针方向。

简单来说,点乘判断角度,叉乘判断方向。

形象的说:当一个敌人在你身后的时候,叉乘可以判断你是往左转还是右转更好的转向敌人,点乘得到你当前的面朝向的方向和你的敌人的方向的所成的角度大小。

Unity入门操作_向量_002