游戏开发工具

一、零向量

零向量

零向量是一个特殊的向量,它表示的是一个没有大小、没有方向的向量,零向量并不是表示某一个点的坐标位置。

n维向量集合的加性单位元就是n维零向量,其每一个维度都为0。

表示如1-3.jpg


对于模为任意正值的向量都有无数个,将它们以原点为尾,则所有向量头部点的集合为半径为此任意正值的圆形。


二、单位向量

单位向量

在很多情况下,我们只关心向量的方向而不是大小,例如:在计算光照模型的时候,我们往往需要得到法线和光源方向,这个时候我们就不用关心这些量有多长。


计算量的方向就是计算单位量,单位量就是:模为1的向量,单位量的计算过程被叫做归一化。

ps:零向量是没有单位量的。


单位量的计算就是使用量的各个分量除以这个量的模长。

单位量的计算公式:

1.jpg

ps:由上面的公式可以看出,为什么零向量不能被归一化。因为零向量的模长为0,分母为0没有意义。


三、向量取反

向量取反

对一个向量取反(Negate)会将其方向逆转。一个指向东北的向量取反后就指向西南方向了。我们在一个向量的每个分量前加负号就可以实现取反了(或者说用-1数乘该向量):

1.jpg

对于任意集合,元素x的加法逆元为-x,元素与其逆元相加为加法单位元,也即x+(-x)=0,同理,向量的负向量同样如此。

几何意义上,向量变负,表示一个与原向量大小相同,方向相反的向量,也即表示向量的头尾互相颠倒。


四、向量的长度

向量的长度

我们使用勾股定理(Pythagoras Theorem)来获取向量的长度(Length)/大小(Magnitude),如果你把向量的x与y分量画出来,该向量会和x与y分量为边形成一个三角形:

1.jpg

因为两条边(x和y)是已知的,如果希望知道斜边vˉ的长度,我们可以直接通过勾股定理来计算:

1-1.jpg

||vˉ||表示向量vˉ的长度,我们也可以加上z2把这个公式拓展到三维空间。

例子中向量(4, 2)的长度等于:

1-2.jpg

结果是4.47


有一个特殊类型的向量叫做单位向量(Unit Vector)。单位向量有一个特别的性质——它的长度是1。我们可以用任意向量的每个分量除以向量的长度得到它的单位向量n:

1-3.jpg

我们把这种方法叫做一个向量的标准化(Normalizing),单位向量头上有一个^样子的记号,通常单位向量会变得很有用,特别是在我们只关心方向不关心长度的时候(如果改变向量的长度,它的方向并不会改变)。


五、向量与标量运算

向量与标量运算

标量(Scalar)只是一个数字(或者说是仅有一个分量的向量),当把一个向量加/减/乘/除一个标量,我们可以简单的把向量的每个分量分别进行该运算。对于加法来说会像这样:

1-2.jpg

其中的+可以是+,-,·或÷,其中·是乘号。注意-和÷运算时不能颠倒(标量-/÷向量),因为颠倒的运算是没有定义的。


六、向量的加法和减法

向量的加法和减法

向量的加法可以被定义为是分量的(Component-wise)相加,即将一个向量中的每一个分量加上另一个向量的对应分量:

1.jpg

向量v = (4, 2)和k = (1, 2)可以直观地表示为:

1-1.jpg

就像普通数字的加减一样,向量的减法等于加上第二个向量的相反向量:

1-2.jpg

两个向量的相减会得到这两个向量指向位置的差。这在我们想要获取两点的差会非常有用。

1-3.jpg



七、向量的点积

向量的点积

两个向量相乘是一种很奇怪的情况,普通的乘法在向量上是没有定义的,因为它在视觉上是没有意义的。但是在相乘的时候我们有两种特定情况可以选择:一个是点乘(Dot Product),记作vˉ?kˉ,另一个是叉乘(Cross Product),记作vˉ×kˉ。

1.jpg

应用到2D,3D中为:

2D坐标:a·b = axbx + ayby

3D坐标:a·b = axbx + ayby+ azbz 

注: x,y,z 为角标,  是 "·", 不是 " * " 哦

标量可以和向量相乘, 向量也可以和向量相乘, 这种叫做 点乘 (也叫内积) 。另外, 标量与向量相乘不可以写 "·",向量与向量相乘必须写 "·",向量的点乘优先级高于加减,向量点乘后的结果是标量

接下来通过一张图来一起看看向量的点积计算:

1-1.jpg

向量的点积计算就是将两个向量的分量进行相乘得到的结果再相加 , 得到的结果是一个标量值。这个标量值就等于两个向量的模长乘积再乘以两个向量的夹角的余弦值 , 由此可以知道, 通过向量的点积运算是可以得到两个向量的夹角的。




八、向量的叉积

向量的叉积

两个向量的叉乘得到的是一个 新的向量 , 并且这个向量垂直于原来的两个向量。向量的叉乘只可以运用在 3D向量中。

1.jpg

cross(a, b) = |a| * |b| * sin(α)


叉乘运算的顺序

进行叉乘运算的两个向量是存在顺序关系的, 顺序不同, 得到的结果也是不同的。至于结果的判断可以用 右手定责 去判断, 所谓的右手定则就是 让右手除去大拇指的四根手指伸向向量叉乘的方向 (比如 b x a, 就从 b 向量握向 a 向量) 握拳, 此时大拇指指向的就是叉乘得到的垂直向量的方向。可以看下面一张图:

1-1.jpg



九、向量运用之位置与位移

向量运用之位置与位移

向量在哪儿?实际上,这不是一个恰当的问题,因为向量没有位置,只有大小和方向,这听起来不可思议,但其实日常生活中很多量有大小和方向,却没有位置。


位移:”向前走三步“,这句话好像是关于位置的,但其实句子中使用的量表示的是相对位移,而不是绝对位置。这个相对位移由大小(三步)和方向(向前)构成,所以它能用向量表示。


速度:”我们以50英里每小时的速度向北行驶“,这句话描述了一个量,它有大小(50英里每小时)和方向(北),但没有具体位置,”50英里每小时的速度向北“能用向量表示。


注意,位移、速度与距离、速率是完全不同的两种定义,位移和速度是向量,包含方向,而距离和速率是标量,不指明任何方向。


因为向量能描述事物间的位移和相对差异,所以它能用来描述相对位置,不能认为向量有绝对位置。为了强调这一点,当您想象一个向量,一个箭头时,记住:只有箭头的长度和方向是由意义的,不包括位置。


因为向量是没有位置的,所以能在图的任何地方表示,只要方向和长度的表示正确即可,我们经常利用向量的这个优点,将向量平移到图中更有用的点。


十、判断两个向量相等

判断两个向量相等

相等向量:长度相等且方向相同的向量,记作(a=b)

1.jpg

说明:

1、若(a=b),则(|a|=|b|),且向量(a)与(b)方向相同。

2、由相等向量可知,当用有向线段表示向量时,起点可任意选举。

3、由相等向量定义知:同向且等长的有向线段表示同一向量,因此向量可以在平面内平行移动。


十一、判断两个向量平行

判断两个向量平行

平行(共线)向量:如果两个向量的有向线段所在直线平行或重合,则称这两个向量平行或共线,记作(a // b),规定零向量与任意向量平行。

1-1.jpg

说明:

1、向量都是可以自由平移的,所有平行的向量都可以移到同一条直线上,因此平行向量也称为平行向量。

2、非零平行向量方向相同或相反。

3、共线向量与相等向量关系:共线向量不一定是相等向量,但相等向量一定是共线向量。

4、向量相等具有传递性:(a=b,b=c)  则 (a=c),而向量的平行不具有延续性:只有当 (b neq 0) 时,(a//b, b//c) 则 (a//c)。