向量
向量
向量是一段有方向,有长度的量,通常使用 \(\vec{a}\) 或 \(\boldsymbol{a}\) 表示,它有两个重要的属性:
- 方向(从A到B的方向)
- 长度(从A到B的距离)
但平移之后的向量与原始向量是相同的,我们并不关心向量起始终止的绝对位置,而是关心两者的相对位置,所以我们也可以用两个坐标之差(终点减起点)表示一条向量:
\[\overrightarrow{AB} \ =\ B\ -\ A\]向量的长度写作 \(\lVert{\vec{a}}\rVert\) ,向量的长度可以用于计算单位向量,单位向量就是长度为1的向量。给定任意一个向量,想要将其变为单位向量,只需要将这个向量除以它的长度,即
\[\hat{a}=\vec{a}/\lVert{\vec{a}}\rVert\]得出的结果 \(\hat{a}\) 就是与原始向量同方向并且长度为1的单位向量,使用单位向量在图形学中有各种不同的好处,通常我们也是使用单位向量进行计算。
求和
向量加法分为几何解释与代数解释,其中几何解释分为两种法则:平行四边形法则与三角形法则。
代数解释非常简单,将两个点坐标分别加起来即可。
假设我们有此坐标系,向量起点处于原点,终点坐标为 \((4, 3)\) 。图形学中通常使用
\[\boldsymbol{A} \ =\binom{x}{y}\]表示向量 \(\boldsymbol{A}\) 的坐标,或者
\[\boldsymbol{A}^{T} \ = ({x}, {y})\]那么 \(\boldsymbol{A}\) 的长度就是
\[\lVert\boldsymbol{A}\rVert\ =\ \sqrt{x^{2} +y^{2}}\]点积
有两条向量,其起点相交,形成一个角度 \(\theta\) ,那么它们的点积就是
\[ \vec{a} \ \cdotp \ \vec{b} \ =\ \lVert\vec{a}\rVert \ \cdotp \ \lVert\vec{b}\rVert \ \cdotp \cos \theta \]点积的结果是一个数,而不是一个向量。那么点积在图形学中有什么用呢?我们可以将公式变换一下:
\[ \cos \theta \ =\ \frac{\vec{a} \ \cdotp \vec{b}}{\lVert\vec{a}\rVert \cdotp \lVert\vec{b}\rVert}\]现在我们有了两个向量,我们就能计算出二者的夹角的余弦,进而算出两者的夹角。特别的,当两个向量都是单位向量时,因为其长度均为1,那么余弦就是:
\[ \cos \theta \ =\ \hat{a} \ \cdotp \hat{b} \]点积同时满足交换律、结合律、分配律:
\[ \vec{a} \cdotp \vec{b} \ =\vec{b} \cdotp \vec{a} \] \[ \vec{a} \cdotp (\vec{b} +\vec{c} )\ =\ \vec{a} \cdotp \vec{b} +\vec{a} \cdotp \vec{c} \] \[ (k\vec{a} )\cdotp \vec{b} =\vec{a} \cdotp (k\vec{b} )=k(\vec{a} \cdotp \vec{b} ) \]
两条向量进行点积的具体运算方式是:
\[\vec{a} \cdotp \vec{b} =\binom{x_{a}}{y_{a}} \cdotp \binom{x_{b}}{y_{b}} =x_{a} x_{b} +y_{a} y_{b}\]在三维中是 \[ \vec{a} \cdotp \vec{b} =\begin{pmatrix} x_{a}\\ y_{a}\\ z_{a} \end{pmatrix} \cdotp \begin{pmatrix} x_{b}\\ y_{b}\\ z_{b} \end{pmatrix} =x_{a} x_{b} +y_{a} y_{b} +z_{a} z_{b}\]
在图形学中,点积最重要的作用就是找到两条向量的夹角,以及计算出一条向量在另一条向量上的投影,这是什么意思呢?
同样有两条向量 \(\vec{a}\) 与 \(\vec{b}\) ,假设有一束光线垂直着 \(\vec{a}\) 照过来, \(\vec{b}\) 自然在 \(\vec{a}\) 上会产生一个阴影,即 \(\vec{b}_{\bot }\) 就是 \(\vec{b}\) 在 \(\vec{a}\) 上的投影。
既然是投影,那么 \(\vec{b}_{\bot}\) 一定是沿着 \(\vec{a}\) 的,只是长度不同,计算 \(\vec{b}_{\bot}\) 只需要 \(\hat{a}\) 乘以一个长度 \(k\) 即可,也就是:
\[ \vec{b}_{\bot } = k\hat{a} \]怎么算 \(k\) 呢?可以看到这里有一个直角三角形, \(k\) 就可以通过计算的余弦算出:
\[ k=\lVert\vec{b}_{\bot }\rVert =\lVert\vec{b}\rVert\cos \theta \]算出投影后,我们就能将一个向量分解为两个子向量,即一个子向量平行与某向量,一个子向量垂直于某向量。
叉积
叉积的计算与点积完全不同,它的计算结果是一条新向量,它与原始的两条向量都互相垂直,也就是说它与原始两条向量所构成的平面垂直。
我们可以使用
\[ \vec{a} \times \vec{b} \ =\ \lVert\vec{a}\rVert\lVert\vec{b}\rVert\sin \theta\]来计算两条向量的叉积,结果向量的方向可以使用右手螺旋定则来确定。将右手摆成点赞👍的手势,其中四指从 \(\vec{a}\) 旋转到 \(\vec{b}\) ,此时大拇指的方向就是结果向量的方向。对于本例,从 \(\vec{a}\) 转向 \(\vec{b}\) ,大拇指自然是朝上的,那么结果向量就是朝上的。
可以看出,叉积是不满足交换律的,如果计算的是 \(\vec{b} \times \vec{a}\) ,为了满足四指从 \(\vec{b}\) 转向 \(\vec{a}\) ,大拇指必然是朝下的,所以
\[ \vec{a} \times \vec{b} \ =\ -\vec{b} \times \vec{a}\]通过叉积我们可以建立三维空间中的直角坐标系
\[ \vec{x} \times \vec{y} =+\vec{z} \] \[ \vec{y} \times \vec{x} =-\vec{z} \] \[ \vec{y} \times \vec{z} =+\vec{x} \] \[ \vec{z} \times \vec{y} =-\vec{x} \] \[ \vec{z} \times \vec{x} =+\vec{y} \] \[ \vec{x} \times \vec{z} =+\vec{y} \]
叉积除了没有交换律(交换向量后计算结果加负号),还有一些其他性质:
\[ \vec{a} \times \vec{a} \ =\ \vec{0}\]一个向量叉积它自己,得出的结果是一个长度为0的向量。
\[ \vec{a} \cdotp (\vec{b} +\vec{c} )\ =\ \vec{a} \cdotp \vec{b} +\vec{a} \cdotp \vec{c} \] \[ (k\vec{a} )\cdotp \vec{b} =\vec{a} \cdotp (k\vec{b} )=k(\vec{a} \cdotp \vec{b} ) \]
分配律,结合律仍然存在。
代数上叉积的计算公式为
\[ \vec{a} \times \vec{b} =\begin{pmatrix} y_{a} z_{b} -y_{b} z_{a}\\ z_{a} x_{b} -x_{a} z_{b}\\ x_{a} y_{b} -y_{a} x_{b} \end{pmatrix}\]叉积还可以表示为矩阵形式
\[ \vec{a} \times \vec{b} =\begin{pmatrix} 0 & -z_{a} & y_{a}\\ z_{a} & 0 & -x_{a}\\ -y_{a} & x_{a} & 0 \end{pmatrix}\begin{pmatrix} x_{b}\\ y_{b}\\ z_{b} \end{pmatrix}\]应用
有了点积与叉积我们就能将任意一个向量分解到三维空间的三个轴上去。假设我们有 \(\vec{u}\) 、 \(\vec{v}\) 、 \(\vec{w}\) 三条向量
\[ \lVert\vec{u}\rVert=\lVert\vec{v}\rVert=\lVert\vec{w}\rVert=1\]同时它们是互相垂直的
\[ \vec{u} \cdotp \vec{v} =\vec{v} \cdotp \vec{w} =\vec{u} \cdotp \vec{w} =0\] \[ \vec{w} = \vec{u} \times \vec{v}\]那么对于任意向量 \(\vec{p}\) 都有
\[\vec{p} =(\vec{p} \cdotp \vec{u} )\vec{u} +(\vec{p} \cdotp v)\vec{v} +(\vec{p} \cdotp \vec{w} )\vec{w}\]