游戏开发中的数学:向量基础知识

向量的定义

向量是计算几何中的基本概念,指一个同时具有大小和方向的几何对象。直观上,向量通常被标示为一个带箭头的线段如图1所示,线段的长度可以表示向量的大小,向量的方向也就是箭头所指的方向。可以用一个多元组来表示一个向量,$n$ 个有次序的数 $x_1,x_2,x_3...,x_n$ 所组成的数组称为n维向量,这 $n$ 个数称为该向量的 $n$ 个分量,第 $i$ 个数 $x_i$ 称为第 $i$ 个分量,如等式(1)所示。向量的大小称为模长,如等式 $\eqref{向量模公式}$ 所示。

$$ \vec{u} = (x_1, x_2, x_3, ... , x_n) \tag{1} $$

$$ \begin{equation} ||\vec{u}|| = \sqrt[2]{\sum^n_{i=1}x_i^2} \tag{向量模公式} \end{equation} $$

v2-9d4d6b0a33f2b9ee5347781681ff7a6b_720w.png

  • 零向量:一个向量的始点与终点重合,也就是重合点的向量,则称它为零向量。零向量具有方向性,单方向不确定。
  • 反向量:一个向量与它的大小相同,但方向相反,则称它为反向量
  • 等向量:两个向量长度相等、方向相同,即为等向量。

向量的运算

向量的加减法

向量的加法满足平行四边形法则和三角形法则。具体地,两个矢量 $\vec{a}$$\vec{b}$ 相加,得到的是另一个向量。这个向量可以表示为 $\vec{a}$$\vec{b}$ 的起点重合后,以它们为邻边构成的平行四边形的一条对角线,或者表示为将 $\vec{a}$ 的终点和 $\vec{b}$ 的起点重合后,从 $\vec{a}$ 的起点指向 $\vec{b}$ 的终点的向量,如图2所示,图(a)是平行四边法法则,图(b)是三角形法则。

v2-a00b8f19a49d37653ad7039652e8d584_r.jpg

两个向量$\vec{a}$$\vec{b}$的相减,则可以看成是向量$\vec{a}$加上一个与$\vec{b}$大小相等,方向相反的向量。或者,$\vec{a}$$\vec{b}$的相减得到的向量可以表示为$\vec{a}$$\vec{b}$的起点重合后,从$\vec{b}$的终点指向$\vec{a}$的终点的向量,如图4所示。

v2-0a5ec1dc1f4c99341fa09d4f03ad8294_720w.png

向量数乘

一个标量 k 和一个向量$\vec{v}$之间可以做乘法,得出的结果是另一个与$\vec{v}$方向相同或相反,大小是$\vec{v}$的大小的 |k| 倍的向量,可以记成k$\vec{v}$。-1乘以任意向量会得到它的反向量,0乘以任何向量都会得到零矢量0→。如图5所示,标量2与向量 $\vec{v}$ 的数乘,得到 2$\vec{v}$,方向与 $\vec{v}$ 相同,大小是它的两倍。

v2-de2bb968b80d8346bb5f9bdfb396d1d0_720w.png

向量加减法和数乘的性质

向量加法和数乘称为是向量的线性运算,它满足下列运算规则(设 $\vec{a}$ , $\vec{b}$ , $\vec{c}$ 都是 $n$ 维向量向量):

  • 交换律:$\vec{a}+\vec{b} = \vec{b}+\vec{a}$
  • 结合律:$(\vec{a} + \vec{b})+\vec{c} = \vec{a}+(\vec{b}+\vec{c})$
  • 有零元:$\vec{a}+\vec{0}=\vec{a}$
  • 有负元:$\vec{a} + (-\vec{a}) = \vec{0}$
  • $k(j\vec{a}) = (kj)\vec{a} = k(j)\vec{a}$
  • $k(\vec{a} + \vec{b}) = k\vec{a} + k\vec{b}$
  • $(k + j) \vec{a} = k\vec{a} + j\vec{a}$

向量点积(又称:点乘,内积,数量积)

点积通常又称为数量积以及内积,是接受在实数$R$上的两个向量并返回一个实数标量的二元运算,两个向量的点积写作 $\vec{a} \cdot \vec{b}$

两个向量 $\vec{a} = (a_1, a_2, a_3 ... a_n)$$\vec{b} = (b_1, b_2, b_3 ... b_n)$ 的点积定义为:

$$ \vec{a} \cdot \vec{b} = \sum_{i=1}^na_ib_i = a_1b_1 + a_2b_2 + ... + a_nb_n $$

点积满足下列性质

设,$\vec{a}, \vec{b}, \vec{c}$ 都是 $n$ 维向量:

  • 交换律:$\vec{a} \cdot \vec{b} = \vec{b} \cdot \vec{a}$
  • 分配率:$\vec{a} \cdot (\vec{b} + \vec{c}) = \vec{a} \cdot \vec{b} + \vec{a} \cdot \vec{c}$
  • 不满足结合律,特殊情况如果 $\vec{a} // \vec{c}$$(\vec{a} \cdot \vec{b}) \cdot \vec{c} = \vec{a} \cdot (\vec{b} \cdot \vec{c})$ 才能成立。
  • 双线性:$\vec{a} \cdot (\lambda \vec{b} + \vec{c}) = \lambda (\vec{a} \cdot \vec{b}) + \vec{a} \cdot \vec{c}$
  • 乘以标量时满足:$(\lambda \vec{a}) \cdot (\mu \vec{b}) = (\lambda \mu) (\vec{a} \cdot \vec{b})$
  • 正定性:$\forall \vec{a} \neq \vec{0}$ , $\vec{a} \cdot \vec{a} > 0$

从几何解释来理解点积,如图6所示,它可以直观地定义为:

$$ \vec{a} \cdot \vec{b} = ||\vec{a}|| \cdot ||\vec{b}||\cos\theta $$

其中 $\theta$ 表示 $\vec{a} $$\vec{b}$ 之间的夹角:

v2-1c06881820d4c440cbaf552eceafa0df_720w.png

给定两个向量 $\vec{a}$$\vec{b}$ 他们之间夹角可以通过如下公式获得:

$$ \cos\theta = \frac{\vec{a} \cdot \vec{b}}{||\vec{a}|| \cdot ||\vec{b}||} $$

因此两个非零向量如果是垂直的,$\vec{a} \cdot \vec{b} = 0$

点积运算不服从消去律,不像数的乘法一样,如果 $ab = ac$$a \neq 0$,则有 $b = c$ 。而对于点积来说,如果 $\vec{a} \cdot \vec{b} = \vec{a} \cdot \vec{c}$$\vec{a} \neq \vec{0}$ ,则通过移项和点积分配律可得 $\vec{a} \cdot (\vec{b} - \vec{c}) = 0$ 。至此,可以得出下列至少一条结论正确:

  1. $\vec{a} \perp (\vec{b} - \vec{c})$ ;向量a 与向量 b-c 的差向量垂直;
  2. $(\vec{b}-\vec{c})$$\vec{0}$ ,则有 $\vec{a} = \vec{b}$

如果向量 $\vec{b}$ 是单位向量,则点积 $\vec{a} \cdot \vec{b}$ 给出 $\vec{a}$ 在方向 $\vec{b}$ 上投影的大小,如果方向相反,则带有负号,如下图所示:

v2-ae11e9f82e667ff562b0c6d742ef8bcc_720w.png

向量的叉积(又称:叉乘,外积,向量积)

叉积是一种向量的二元运算符,与点积不同,它的运算结果还是一个向量而不是一个标量(二维叉积除外),叉积也称为叉乘、外积或者向量积,两个向量的叉积写作 $\vec{a} \times \vec{b}$ 。在图形学几何上的应用,只考虑二维和三维情况下的向量叉积。 对于二维向量来说,叉积的定义是:

$$ \vec{a} \times \vec{b} = (a_1,a_2) \times (b_1,b_2) = \begin{vmatrix} a_1 & a_2 \\ b_1 & b_2 \end{vmatrix} = a_1b_2 - a_2b_1 $$

二维向量叉积是一种特殊情况,它的结果是一个标量而非向量,从几何上定义为:

$$ \vec{a} \times \vec{b} = ||\vec{a}|| \cdot ||\vec{b}||\sin\theta $$

其中,$\theta$ 表示向量 $\vec{a}$$\vec{b}$ 之间逆时针方向的夹角大小。因此,二维向量叉积的结果是以 $\vec{a}$$\vec{b}$ 为边的平行四边形的面积,如图8所示。叉积的顺序影响结果的正负号,如果置换叉积的顺序,即 $\vec{b} \times \vec{a}$,那么结果是一个负数。

v2-10f92794835dc81ff95e7282972e4eaa_720w.png

叉积还可以用在判断点与直线的位置关系上,设直线可以表示为 $P + t\vec{d}$ ,待判定点是 $Q$

  1. 若有 $\vec{d} \times (Q - P) > 0$ ,则点 $Q$ 在直线的逆时针方向上;
  2. 若有 $\vec{d} \times (Q - P) = 0$ ,则点 $Q$ 在直线上;
  3. 若有 $\vec{d} \times (Q - P) < 0$,则点 $Q$ 在直线的顺时针方向上;

如图9 所示,$Q_0$ 在直线的逆时针方向上,$Q_1$ 在直线的顺时针方向上,$Q_2$ 在直线上。

v2-8e9f8d2c3d9a098f6039452b7a8ce4e5_720w.png

对于三维向量来说,设直角坐标系的三个单位向量分别是 $\vec{i}, \vec{j}, \vec{k}$ ,满足 $\vec{i} \times \vec{j} = \vec{k}, \vec{j} \times \vec{k} = \vec{i},\vec{k} \times \vec{i} = \vec{j}$ 。通过这些规则,两个向量的叉积的坐标可以用很方便的方法计算出来。设:$\vec{a} = a_1\vec{i} + a_2\vec{j} + a_3\vec{k}$$\vec{b} = b_1\vec{i} + b_2\vec{j} + b3\vec{k}$ ,则 $\vec{a}$$\vec{b}$ 的叉积可以表示成矩阵的行列式:

$$ \vec{a} \times \vec{b} = \begin{vmatrix} \vec{i} & \vec{j} & \vec{k} \\ a_1 & a_2 & a_3 \\ b_1 & b_2 & b_3 \end{vmatrix} = (a_2b_3 - a_3b_2)\vec{i} + (a_3b_1 - a_1b_3)\vec{j} + (a_1b_2 - a_2b_1)\vec{k} \tag{10} $$

三维向量叉积的结果是一个向量,它的几何定义如下所示:

$$ \vec{a} \times \vec{b} = (||\vec{a}|| \cdot ||\vec{b}|| \sin\theta)\vec{n} \tag{11} $$

其中 $\theta$ 表示向量 $\vec{a}$ 逆时针旋转到 $\vec{b}$ 之间的夹角(注意叉积的顺序,影响结果的正负),$\vec{n}$ 是一个与 $\vec{a},\vec{b}$ 所构成平面垂直的单位向量。

三维叉积的模长可以解释为以 $\vec{a}$$\vec{b}$ 为边的平行四边形的面积,法向量 $\vec{n}$ 的方向遵循右手法则,如图10 所示。

v2-20601f29207ec3e203e3ed7c1e8868e6_720w.png

叉积满足下列性质

设:$\vec{a}, \vec{b}, \vec{c}$ 都是三维向量,$\lambda$$\mu$ 为任意实数。

  • 反交换律:$\vec{a} \times \vec{b} = - \vec{b} \times \vec{a}$
  • 分配率:$\vec{a} \times (\vec{b} + \vec{c}) = \vec{a} \times \vec{b} + \vec{a} \times \vec{c}$
  • 不满足结合律,但满足雅克比恒等式:$\vec{a} \times (\vec{b} \times \vec{c}) + \vec{b} \times (\vec{c} \times \vec{a}) + \vec{c} \times (\vec{a} \times \vec{b}) = \vec{0}$
  • 与标量乘法兼容:$(\lambda \vec{a}) \times \vec{b} = \vec{a} \times (\lambda \vec{b}) = \lambda(\vec{a} \times \vec{b})$
  • 若两个非零向量 $\vec{a}$$\vec{b}$ 平行,当且仅当 $\vec{a} \times \vec{b} = \vec{0}$
  • 拉格朗日公式:$\vec{a} \times (\vec{b} \times \vec{c}) = \vec{b}(\vec{a} \cdot \vec{c}) - \vec{c}(\vec{a} \cdot \vec{b})$

向量空间

$V$$\vec{n}$ 维向量的集合,如果集合 $V$ 非空,且集合 $V$ 对于向量的加法和数乘两种运算封闭,即

  • 如果 $\vec{a} \in V$, $\vec{b} \in V$,那么 $\vec{a} + \vec{b} \in V$
  • 如果 $\vec{a} \in V$$\lambda$ 是任意实数,那么 $\lambda \vec{a} \in V$

则称 $V$向量空间,也称为线性空间

若从某个非空数集中任选两个元素(同一元素可重复选出),选出的这两个元素通过某种(或几种)运算后的得数仍是该数集中的元素,那么,就说该集合对于这种(或几种)运算是封闭的。

$\vec{a_1}, \vec{a_2}, \vec{a_3}, ... , \vec{a_m}, \vec{b}$ 是一个 $n$ 维向量组,若存在一组实数 $\lambda_1, \lambda_2, \lambda_3, ... , \lambda_m$ 使得

$$ > \vec{b} = \lambda_1 \vec{a_1} + \lambda_2 \vec{a_2} + \lambda_3 \vec{a_3} + ... + \lambda_m \vec{a_m} \tag{12} > $$

则称向量 $\vec{b}$ 可由 $\vec{a_1}, \vec{a_2}, \vec{a_3}, ... , \vec{a_m}$ 线性表示 ,或者称:$\vec{b}$ 是向量组 $\vec{a_1}, \vec{a_2}, \vec{a_3}, ... , \vec{a_m}$ 的线性组合

例如:$\vec{a_1} = (1, 2, 3)$$\vec{a_2} = (-4, 1, -6)$,向量 $\vec{b} = (-2, 5, 0) = 2\vec{a_1} + \vec{a_2}$,则称 $\vec{b}$ 是向量 $\vec{a_1}, \vec{a_2}$ 的线性组合。

对于向量组 $\vec{a_1}, \vec{a_2}, ... , \vec{a_m}$ ,若存在不全为零的数 $\lambda_1, \lambda_2, ... , \lambda_m$ ,使得 $\lambda_1 \vec{a_1} + \lambda_2 \vec{a_2} + ... + \lambda_m \vec{a_m} = \vec{0}$ ,则称该向量组为线性相关

$$ > \sum^m_{i=1} \lambda_i \vec{a_i} = \vec{0} > $$

对于向量组 $\vec{a_1}, \vec{a_2}, ... , \vec{a_m}$ ,若仅当 $\lambda_1 = 0, \lambda_2 = 0, ... , \lambda_m = 0$ ,使得 $\lambda_1 \vec{a_1} + \lambda_2 \vec{a_2} + ... + \lambda_m \vec{a_m} = \vec{0}$ ,则称该向量组为线性无关

常见到的几个与“线性无关”、“线性相关”的推论如下所示:

  • 单个向量 $\vec{a}$ 是线性相关的充分必要条件是 $\vec{a} = \vec{0}$ 。两个以上的向量组 $\vec{a_1}, \vec{a_2}, ..., \vec{a_m}$ 线性相关的充分必要条件是其中有一个向量是其余向量的线性组合。
  • 如果向量组 $\vec{a_1}, \vec{a_2}, ..., \vec{a_m}$ 是线性无关的,而且可以被向量组 $\vec{b_1}, \vec{b_2}, ... , \vec{b_k}$ 线性表示出来,那么 $m \ge k$
  • 如果向量组 $\vec{a_1}, \vec{a_2}, ..., \vec{a_m}$ 是线性无关的,但是向量组 $\vec{a_1}, \vec{a_2}, ..., \vec{a_m}, \vec{b}$ 是线性相关的,那么向量 $\vec{b}$ 可以被 $\vec{a_1}, \vec{a_2}, ..., \vec{a_m}$ 线性表示出来,而且表法是唯一的。
  • $n$ 维向量空间上,有且只能找到 $n$ 个向量无关的向量。因此,在二维空间上,只能有两个线性无关的向量,在三维空间上只能有三个线性无关的向量。

一向量组的一个部分组是线性无关的,并且从这向量组中任意添一个向量(如果还有的话),所得的部分向量组都线性相关。那么,这个部分向量组称为原向量组的极大线性无关组

例如,向量组 $\vec{a_1}=(2,−1,3),\vec{a_2}=(4,−2,5), \vec{a_3}=(2,−1,4)$ 中,由 $\vec{a_1} \vec{a_2}$ 组成的部分组就是一个极大线性无关组。首先,$\vec{a_1} \vec{a_2}$ 线性无关,因为由 $\lambda_1 \vec{a_1} + \lambda_2 \vec{a_2} = \lambda_1(2, -1, 3) + \lambda_2(4, -2, 5) = \vec{0}$ 就有 $\lambda_1 = \lambda_2 = 0$,同时我们知道 $\vec{a_1}, \vec{a_2}, \vec{a_3}$ 线性相关,不难看出,$\vec{a_2}, \vec{a_3}$ 也是一个极大线性无关组。

一个线性无关向量组的极大线性无关组就是这个向量组自身。任意一个向量组的极大线性无关组都含有相同个数的向量。因此,我们称向量组的极大线性无关向量组所含向量的个数为向量组的秩。换句话说,秩就是从一个向量组里最多可以取出的线性无关向量的个数。

例如,向量组 $\vec{a_1} = (2,−1,3), \vec{a_2}=(4,−2,5), \vec{a_3}=(2,−1,4)$ 的秩就是 2。

$$ \lambda_1(2, -3, 3) + \lambda_2(4, -2, 5) + \lambda_3(2, -1, 4) = \vec{0} \\ 2\lambda_1 + 4\lambda_2 + 2\lambda_3 = 0 \\ -3\lambda_1 - 2\lambda_2 - \lambda_3 = 0 \\ 3\lambda_1 + 5\lambda_2 + 4\lambda_3 = 0 \\ 求解次三元一次方程,计算 \lambda_1, \lambda_2, \lambda_3 的值,看是否有非零值,如果有,表示三个向量线性相关。\\ 如果没有则表示线性无关,这个向量组就是极大线性无关组,向量组的秩就是线性无关向量组中向量的个数。 $$

因为线性无关的向量组就是它自身的极大线性无关组,所以一向量组线性无关的充分必要条件为它的秩与它所含向量的个数相同。对于全部由零向量组成的向量组,没有极大线性无关组,规定这样的向量组的秩为零。