《3D图形的数学》第1章笔记 向量

对于成功的3D程序猿,掌握如何进行向量运算是一种基本的技能要求。

原书:《3D游戏与计算机图形学中的数学方法》 by Eric.Lengyel

1 向量的形式

一个n维向量V可以表示为:

$$ \textbf{V} = < V_{1}, V_{2}, ... , V_{n} > \tag{1.1} $$

系数a和向量V的乘积可以定义为:

$$ a\textbf{V} = < aV_{1}, aV_{2}, ... , aV_{n} > \tag{1.4} $$

向量加减运算:

$$ \textbf{P} + \textbf{Q} = < P_{1} + Q_{1}, P_{2} + Q_{2}, ... , P_{n} + Q_{n} > \tag{1.5} $$

【定理1.1】对于给定的任何两个系数a和b,以及任何三个向量PQR,有以下运算规律:

  • \(\textbf{P} + \textbf{Q} = \textbf{Q} + \textbf{P}\)
  • \((\textbf{P} + \textbf{Q}) + \textbf{R} = \textbf{P} + (\textbf{Q} + \textbf{R})\)
  • \((ab)\textbf{P} = a(b\textbf{P})\)
  • \(a(\textbf{P} + \textbf{Q}) = a\textbf{P} + a\textbf{Q}\)
  • \((a + b)\textbf{P} = a\textbf{P} + b\textbf{P}\)

n维向量V的模,||V||:

$$ \textbf{||V||} = \sqrt{\sum_{i=1}^{n} V_{i}^{2}} \tag{1.6} $$

模也称为向量的范数或者长度,模为1的向量称为单位向量。

设向量V表示一个三维点或方向,则公式(1.6)可以展开为:

$$ \textbf{||V||} = \sqrt{V_{x}^{2} + V_{y}^{2} + V_{z}^{2}} \tag{1.7} $$

如果向量V至少有至少有一个非零分量,可以通过乘 \(1/\textbf{||V||}\) 得到V方向上的一个单位向量,也叫做单位化、规格化。

【定理1.2】 对于任意给定系数a,任意的两个向量PQ,有以下性质:

  • \( \textbf{||P||} \geq 0 \)
  • 当且仅当 \( \textbf{||P||}=<0, 0, …, 0> \)时,\( \textbf{||P||}=0 \)
  • \( \textbf{||aP||}=|a|\textbf{||P||} \)
  • \( \textbf{||P + Q||} \leq \textbf{||P||} + \textbf{||Q||} \)

其中的第4条,可以由三角不等式得到。

2 点积

向量间点积,也叫做数量积内积,3D图形中经常用点积来度量两个向量指向的差异。

【定理1.3】 两个n维向量P和Q的点积,记作P·Q,即:

$$ \textbf{P} \cdot \textbf{Q} = \sum_{i=1}^{n} P_{i}Q_{i} \tag{1.9} $$

向量的点积等于两个向量的对应分量乘积之和。

在三维空间中,有:

$$ \textbf{P} \cdot \textbf{Q} = P_{x}Q_{x} + P_{y}Q_{y} + P_{z}Q_{z} \tag{1.10} $$

【定理1.4】 对于给定的两个向量P和Q,点积满足公式:

$$ \textbf{P} \cdot \textbf{Q} = \textbf{||P||}\textbf{||Q||} cos \alpha \tag{1.12} $$

\(\alpha\)是向量P和Q之间的夹角(详细的说是P和Q的起点、终点决定的平面夹角)。

Tips:定理1.4的证明要用到余弦定理,一个三角形有三条边\(a,b,c\),\(a,b\)夹角是\(\alpha\)时,三边满足等式关系\(c^{2} = a^{2} + b^{2} - 2abcos\alpha\)。

定理1.4可以得出两个结论:

  • 当且仅当 \(\textbf{P} \cdot \textbf{Q} = 0\) 时, 向量P和向量Q相互垂直。点积为0的向量称为正交向量,零向量和任意向量正交;
  • 点积正负号说明两个向量的方向情况,例如在看平面法线和平面外一点,可以查看点相对于平面的位置,是在法线同侧(点积为正)还是在不同侧(点积为负)。

【定理1.5】 对于任意给定系数a,任意的两个向量PQ,有以下性质:

  • \( \textbf{P} \cdot \textbf{Q} = \textbf{Q} \cdot \textbf{P} \)
  • \( (a\textbf{P}) \cdot \textbf{Q} = a(\textbf{P} \cdot \textbf{Q}) \)
  • \( \textbf{P} \cdot (\textbf{Q} + \textbf{R}) = \textbf{P} \cdot \textbf{Q} + \textbf{P} \cdot \textbf{R} \)
  • \( \textbf{P} \cdot \textbf{P} = \textbf{||P||}^{2} \)
  • \( | \textbf{P} \cdot \textbf{Q} | \leq \textbf{||P||} \cdot \textbf{||Q||} \)

向量P在向量Q上的投影长度:

$$ \textbf{||P||}cos\alpha = \frac{\textbf{P}\cdot\textbf{Q}}{\textbf{||Q||}} \tag{1.17} $$

如果再乘以单位向量 \( \frac{\textbf{Q}}{\textbf{||Q||}} \),就可以得到具有该长度并且平行于Q的一个向量,即表示向量P到向量Q的投影,记作\( proj_{\textbf{Q}} \textbf{P} \):

$$ proj_{\textbf{Q}}\textbf{P} = \frac{\textbf{P} \cdot \textbf{Q}}{\textbf{||Q||}^{2}} \textbf{Q} \tag{1.18} $$

P到Q的投影也可以看作是一个线性变换过程,所以可以表示为矩阵和向量乘积,三维情况下,\( proj_{\textbf{Q}} \textbf{P} \) 也可以用下面的公式计算:

$$ proj_{\textbf{Q}} \textbf{P} = \frac{1}{\textbf{Q}^{2}} \left[ \begin{matrix} Q_{x}^{2} & Q_{x}Q_{y} & Q_{x}Q_{z} \\ Q_{x}Q_{y} & Q_{y}^{2} & Q_{y}Q_{z} \\ Q_{x}Q_{z} & Q_{y}Q_{z} & Q_{z}^{2} \end{matrix} \right] \left[ \begin{matrix} P_{x} \\ P_{y} \\ P_{z} \end{matrix} \right] \tag{1.20} $$

向量P相对于向量Q的垂直分量记作\( perp_{\textbf{Q}} \textbf{P} \),可以用向量P减去投影分量得到垂直分量:

$$ perp_{\textbf{Q}} \textbf{P} = \textbf{P} - proj_{\textbf{Q}} \textbf{P} \tag{1.19} $$

3 叉积

两个三维向量的叉积又称为向量积,结果是一个新的向量,这个向量垂直于原来的两个向量。

在3D图形学中,已知曲面上一点的两个不同方向的切向量,就可以通过求叉积得到曲面在该点的法向量。

【定义1.6】 两个3D向量P和Q的叉积记作 \(\textbf{P} \times \textbf{Q}\),结果向量为:

$$ \textbf{P} \times \textbf{Q} = < P_{y}Q_{z} - P_{z}Q_{y}, P_{z}Q_{x} - P_{x}Q_{z}, P_{x}Q_{y} - P_{y}Q_{x} > \tag{1.21} $$

便于记忆的一个工具是伪行列式:

$$ \textbf{P} \times \textbf{Q} = \left| \begin{matrix} i & j & k \\ P_{x} & P_{y} & P_{z} \\ Q_{x} & Q_{y} & Q_{z} \end{matrix} \right| \tag{1.22} $$

这里i,j,k是x,y,z轴的单位向量:

$$ \begin{aligned} \textbf{i} &=<1, 0, 0> \\ \textbf{j} &= <0, 1, 0> \\ \textbf{k} &= <0, 0, 1> \end{aligned} \tag{1.23} $$

叉积\(\textbf{P} \times \textbf{Q}\)也可以用线性变换的形式表示,变换矩阵派生于P,作用于Q:

$$ \textbf{P} \times \textbf{Q} = \left[ \begin{matrix} 0 & -P_{z} & P_{y} \\ P_{z} & 0 & -P_{x} \\ -P_{y} & P_{x} & 0 \end{matrix} \right] \left[ \begin{matrix} Q_{x} \\ Q_{y} \\ Q_{z} \end{matrix} \right] \tag{1.25} $$

Tips:原书P7的公式(1.25)有疏漏,变换矩阵中出现了Q的分量。

对于任意给定的三个3D向量P、Q和R,等式 \((\textbf{P} \times \textbf{Q}) \cdot \textbf{R}\) 的值可以通过伪行列式乘以R得到:

$$ (\textbf{P} \times \textbf{Q}) \cdot \textbf{R} = \left| \begin{matrix} R_{x} & R_{y} & R_{z} \\ P_{x} & P_{y} & P_{z} \\ Q_{x} & Q_{y} & Q_{z} \end{matrix} \right| = \left| \begin{matrix} P_{x} & P_{y} & P_{z} \\ Q_{x} & Q_{y} & Q_{z} \\ R_{x} & R_{y} & R_{z} \end{matrix} \right| \tag{1.27} $$

Tips:行列式表达我在这里书写了两种表达形式,第一种是延续之前伪行列式的写法,只是将R替代了ijk的位置,第二种写法来自于书上,遵循PQR的出现次序的记忆法,两者的值根据初等变化法则是相等的。

如果P、Q和R中任何一个可以表示为其他两个向量的线性组合,则行列式的值为0(根据垂直法则和点积定理推导)。

【定理1.8】 对于给定的两个3D向量P和Q,叉积\(\textbf{P} \times \textbf{Q}\)满足下面公式:

$$ ||\textbf{P} \times \textbf{Q}|| = \textbf{||P||}\textbf{||Q||}sin\alpha \tag{1.28} $$

\(\alpha\)为P和Q的夹角。

由定理1.8可知,叉积\(\textbf{P} \times \textbf{Q}\)的模等于由向量P和Q组成的平行四边形的面积。因此,一个三角形的顶点\(V_{1}, V_{2}, V_{3}\),可以计算其面积A:

$$ A = \frac{1}{2} || (V_{2} - V_{1}) \times (V_{3} - V_{1}) || \tag{1.32} $$

叉积得到的非零向量一定垂直于原本的两个向量,但满足要求的有两种方向,为了确定叉积方向,引入叉积遵循的右手法则。例如,使用右手手指指向P方向,手心朝向Q反向,则大拇指就是叉积\(\textbf{P} \times \textbf{Q}\)的方向。

空间轴的单位向量ijk,按照圆形循环的方式排序,i在j之前,j在k之前,k在i之前,则这样的顺序叉积乘等于第三个向量:

$$ \begin{aligned} \textbf{i} \times \textbf{j} &= \textbf{k} \\ \textbf{j} \times \textbf{k} &= \textbf{i} \\ \textbf{k} \times \textbf{i} &= \textbf{j} \end{aligned} \tag{1.33} $$

反之,按照相反的顺序相接的叉乘等于第三个向量的负值。

【定理1.9】 对于给定系数a,b和任意三个3D向量P、Q和R,有以下性质:

  • \( \textbf{P} \times \textbf{Q} = - (\textbf{Q} \times \textbf{P}) \)
  • \( (a\textbf{P}) \times \textbf{Q} = a(\textbf{P} \times \textbf{Q}) \)
  • \( \textbf{P} \times (\textbf{Q} + \textbf{R}) = \textbf{P} \times \textbf{Q} + \textbf{P} \times \textbf{R} \)
  • \( \textbf{P} \times \textbf{P} = \textbf{0} = <0, 0, 0> \)
  • \( (\textbf{P} \times \textbf{Q}) \cdot \textbf{R} = (\textbf{R} \times \textbf{P}) \cdot \textbf{Q} = (\textbf{Q} \times \textbf{R}) \cdot \textbf{P} \) (注意顺序,满足圆形循环)
  • \( \textbf{P} \times (\textbf{Q} \times \textbf{P}) = \textbf{P} \times \textbf{Q} \times \textbf{P} = \textbf{P}^{2}\textbf{Q} - (\textbf{P} \cdot \textbf{Q}) \textbf{P} \)

前五条都比较容易证明,稍微说一下最后一条的证明方式:

$$ \begin{aligned} \textbf{P} \times (\textbf{Q} \times \textbf{P}) &= \textbf{P} \times [-(\textbf{P} \times \textbf{Q})] \\ &= [\textbf{P} \times -(\textbf{P} \times \textbf{Q})] \\ &= -[-(\textbf{P} \times \textbf{Q}) \times \textbf{P}] \\ &= (\textbf{P} \times \textbf{Q}) \times \textbf{P} \\ &= \textbf{P} \times \textbf{Q} \times \textbf{P} \end{aligned} \tag{1.35} $$

后面的具体计算式,是通过对三个分量分别求值得到的结果,不再赘述。

由定理1.9可以得到 叉积不满足交换律和结合律

4 向量空间

【定理1.10】 向量空间是一个集合V,元素成为向量,下面定义向量空间中的加法和乘数,并介绍一些性质:

  • V对于加法运算封闭;
  • V对于乘数运算封闭;
  • V中存在一个零元素 \(\textbf{0}\);
  • V中任意向量P存在向量Q使其 \( \textbf{P} + \textbf{Q} = \textbf{0}\);
  • 加法满足结合律;
  • 乘数满足结合律;
  • 乘数对于加法满足分配率,\( a(\textbf{P} + \textbf{Q}) = a\textbf{P} + a\textbf{Q}\);
  • 系数加法对于乘数满足分配率,\( (a + b)\textbf{P} = a\textbf{P} + b\textbf{P}\)。

将由n元组组成的向量空间记作 \(R^{n}\),比如三维的向量空间记作\(R^{3}\)。

每一个向量空间都可以由一组向量的线性组合来生成,生成向量空间的向量组成为基。

【定义1.11】 对于一组向量 {\( \textbf{e}_{1}, \textbf{e}_{2}, …, \textbf{e}_{n} \)},如果不存在这样一组实数 {\(a_{1}, a_{2}, …, a_{n}\)},其中至少有一个 \(a_{i}\) 不为0,使得下式成立:

$$ a_{1}\textbf{e}_{1} + a_{2}\textbf{e}_{2} + \cdots + a_{n}\textbf{e}_{n} = 0 \tag{1.40} $$

则称这组向量线性无关,否则称向量组线性相关

一个n维向量空间可以由n个线性无关的向量组成的向量集合生成,这个向量组成为基。

【定义1.12】 向量空间V的基B是一个由n个线性无关的向量组成的集合,即 \(\textbf{B}\)={\(\textbf{e}_{1}, \textbf{e}_{2}, …, \textbf{e}_{n} \)},对于向量空间V中的任意一个元素P,都存在一组实数使得:

$$ \textbf{P} = a_{1}\textbf{e}_{1} + a_{2}\textbf{e}_{2} + \cdots + a_{n}\textbf{e}_{n} \tag{1.41} $$

任意空间向量\(R^{n}\)都具有无限个基,对基的形式进行一些限定后,可以使基具有特定的性质。

【定义1.13】 对于向量空间的基\(\textbf{B}\)={\(\textbf{e}_{1}, \textbf{e}_{2}, …, \textbf{e}_{n} \)},如果对于任意 \(i \neq j\) 都有 \(\textbf{e}_{i} \cdot \textbf{e}_{j} = 0\),则该基为正交基。

【定理1.14】 对于给定的两个向量 \(\textbf{e}_{1}\) 和 \(\textbf{e}_{2}\), 如果\(\textbf{e}_{1} \cdot \textbf{e}_{2} = 0\),则\(\textbf{e}_{1}\) 和 \(\textbf{e}_{2}\)线性无关。

对基的另一个形式限定就是基的所有向量都具有单位长度(更简单化了),引入Kronecker delta符号 \(\delta_{ij}\),定义如下:

$$ \delta_{ij} = \left\{ \begin{aligned} 1, i&=j \\ 0, i&\neq j \end{aligned} \right. \tag{1.42} $$

【定理1.15】 如果对于每一对 \((i, j)\) 有 \(\textbf{e}_{i} \cdot \textbf{e}_{j} = \delta_{ij}\),则基 \(\beta\)={\(\textbf{e}_{1}, \textbf{e}_{2}, …, \textbf{e}_{n} \)}称为向量空间的正交规范基。

显然向量组{\(\textbf{i}, \textbf{j}, \textbf{k}\)}是\(R^{3}\)的一个正交规范基。

有一个方法可以将具有n个线性无关向量的向量组转换为向量空间\(R^{n}\)的正交基,基本思想是减去向量在前面每个向量上的投影,结果肯定和前面所有的向量正交。

【定理1.16】 Gram-Schmidt 正交规范化: 对于由n个线性无关想了组成的向量组\(\textbf{B}\)={\(\textbf{e}_{1}, \textbf{e}_{2}, …, \textbf{e}_{n} \)},算法可以产生向量组\(\beta\)={\(\textbf{e}_{1}^{‘}, \textbf{e}_{2}^{‘}, …, \textbf{e}_{n}^{‘} \)},当 \(i \neq j\)时,\(\textbf{e}_{i}^{i} \cdot \textbf{e}_{j}^{i} = 0\)。

  1. 设 \(\textbf{e}_{1}^{‘} = \textbf{e}_{1}\);
  2. 从i=2开始;
  3. 从\(\textbf{e}_{i}\)中减去\(\textbf{e}_{i}\)在向量\(\textbf{e}_{1}^{‘}, \textbf{e}_{2}^{‘}, …, \textbf{e}_{i-1}^{‘} \)上地投影,结果为\(\textbf{e}_{i}^{‘}\),即
$$ \textbf{e}_{i}^{'} = \textbf{e}_{i} - \sum_{k=1}^{i-1} proj_{\textbf{e}_{k}} \textbf{e}_{i} = \textbf{e}_{i} - \sum_{k=1}^{i-1} \frac{\textbf{e}_{i} \cdot \textbf{e}_{k}}{\textbf{e}_{k}^{2}} \textbf{e}_{k} \tag{1.43} $$
  1. 如果i < n,i加1,重复步骤3。
  2. 如果需要进一步生成正交规范基,就对每个\(\textbf{e}_{i}^{‘}\)进行规范化。

《3D图形的数学》第1章笔记 向量

https://yumi-cn.github.io/2020/11/27/3dmath-c1/

作者

Yumiko

发布于

2020-11-27

更新于

2020-11-28

许可协议

评论