3D数学——Unity中的向量运算

2019-04-13 16:05发布

零向量

    零向量是非常特殊的一个向量,它是唯一一个大小为0的向量,也是唯一一个没有方向的向量。
    2D零向量表示为(0,0),3D零向量表示为(0,0,0)。
    在Unity中,用Vector3.zero来表示3D零向量。

负向量

    每个向量都有一个负向量,满足条件:一个向量和它的负向量相加等于零向量。
    向量变负,将得到一个和原向量大小相等,方向相反的向量。
    (2,-3,3)的负向量为(-2,3,-3)。即将向量的每个分量都变负。

这里写图片描述

向量的长度

    向量的长度即向量的大小或者向量的模。
    向量的大小就是向量各分量平方和的平方根。
    对2D向量而言,可以构造一个以该向量为斜边,以x,y分量的绝对值为直角边的直角三角形。可以根据勾股定理得到斜边的长度,即向量的长度。

这里写图片描述     在Unity中,可以通过Vector3.magnitude计算向量的长度。Vector3.sqrMagnitude则返回向量长度的平方。
    Vector3.Distance(A,B)可以计算2个点A,B之间的距离,即返回向量AB或向量BA的长度。等同于(B-A).magnitude或(A-B).magnitude。

向量与标量的乘法/除法

    向量与标量的乘法,即将向量的每个分量分别与标量相乘。
    3D向量与标量相乘:3(1,2,3) = (3,6,9)
    向量与非零标量的除法,即乘以该标量的倒数。
    3D向量与标量相除:1/3(3,6,9)=(1,2,3)
    Unity中使用运算符*来计算与标量的乘法,用运算符/来计算与标量的除法。

单位向量

    单位向量也叫做标准化向量,就是大小为1的向量。
    在只关心向量方向,不关心向量大小时,可以使用单位向量,例如求一个面的法线向量时。
    对任意的非零向量,我们都可以计算出它的单位向量,即将其归一化(normalization)。
    向量的归一化:求得向量的长度后,用向量除以它的长度。
    在Unity中,可以使用Vector3.Normalize来归一化向量。使用Vector3.normalized来获得归一化后的单位向量。

向量的加法/减法

    只有在两个向量的维度相同时,才可以相加或相减。
    向量的加法和减法,即将向量的各个分量相加或相减。
    (1,3)+(2,5) = (1+2,3+5) = (3,8)
    (1,3)-(2,5) = (1-2,3-5) = (-1,-2)
    向量的加法满足交换律:a+b = b+a
    向量的减法则不满足交换律:a-b = -(b-a)
    向量的加法可以理解成平移向量。
    向量的减法则可以理解为平移负向量。
    Unity中,使用运算符+来计算向量的加法。使用运算符-来计算向量的减法。

这里写图片描述

向量的点积

    向量与向量的乘法有两种不同的形式,第一种是向量的点积,也叫做向量的内积。
    表示为a·b,点不可以省略。
    计算时,向量的点积就是对应分量乘积的和,结果为一个标量。
    点积的计算公式为a·b=(ax,ay)·(bx,by)=axbx+ayby
    (0,2)·(3,3) = 0×3+2×3 = 0+6 = 6
    向量的点积满足交换律,即a·b = b·a
    向量的点积还可以用来求得一个向量在另一个向量上的投影。

这里写图片描述     在Unity中,向量的点积可以通过Vector3.Dot来计算。
    可以使用Vector3.Angle来获得两个向量之间的夹角的大小。结果在0度到180度之间。

向量的叉积

    两个向量相乘的第二种方式为向量的叉积,也叫做向量的外积。
    表示为a×b,同样,×也不可以省略。
    叉积的结果仍是一个向量。
    叉积仅可应用于3D向量。
    叉积的计算公式为:
    a×b=(ax,ay,az)×(bx,by,bz)=(aybz-azby,azbx-axbz,axby-aybx)
    (1,2,3)×(-2,-2,3)=(6-(-6),(-6)-3,(-2)+4)=(12,-9,2)
    叉积得到的向量垂直于原来的两个向量。
    a×b的长度等于向量的大小与向量夹角的sin值的积,也是以a和b为两边的平行四边形的面积的大小。

这里写图片描述     我们可以通过向量的叉积来得到一个平面的法向量。
    还可以通过向量的叉积得到的结果向量的方向来判断向量b是在向量a的顺时针方向还是逆时针方向。
    在Unity中,向量的叉积可以通过Vector3.Cross来计算。

这里写图片描述