《3D 数学基础:图形与游戏开发》五-六、向量运算和3D 向量类

146 阅读5分钟

5.1 线性代数与几何

数学中专门研究向量的分支称作线性代数,它是一个非常有趣且应用广泛的研究领域,但与 3D 数学关注的领域并不相同

3D 数学主要关心向量和向量运算的几何意义

5.2 符号约定

5.3 零向量

任何集合,都存在加性单位元xx,对集合中任意元素 yy,满足 y+x=yy+x=ynn 维向量集合的加性单位元就是 nn 维“零向量”,它的每一维都是零

零向量非常特殊,因它是唯一大小为零的向量

虽然图中表示零向量用的是一个点,但认为它就是一个点并不准确,因为零向量没有定义某个位置。应试认为零向量表示“没有位移”,就像标量零表示“没有数量”一样

5.4 负向量

对于任意集合,元素 xx 的加性逆元为 x-x,其与 xx 相加等于加性单位元

5.4.1 运算法则

要得到任意维向量的负向量,只需要简单地将向量地每个分量都变负即可

5.4.2 几何解释

向量变负,将得到一个和原向量大小一样,方向相反的向量

5.5 向量大小(长度或模)

5.5.1 运算法则

n 维向量大小的计算公式,就是各分量平方和的平方根:

5.5.2 几何解释

就是勾股定理的扩展

5.6 标量与向量的乘法

5.6.1 运算法则

非常直接,将向量的每个分量都与标量相乘即可(通常标量写在左)

向量也能除以非零标量,效果等同于乘以标题的倒数

注意:

  • 标量与向量相乘不需要写乘号
  • 先乘除后加减
  • 标量不能除以向量,向量也不能除以另一个向量
  • 负向量被认为是乘法的特殊情况,乘以标量-1

5.6.2 几何解释

向量乘以标量 kk 的效果是以因子 k\left| k \right| 缩放向量的长度

5.7 标准化向量

有些情况,我们只关心向量的方向。如“我面向的是什么方向”,这样使用单位向量将非常方便。单位向量就是大小为 1 的向量,它经常也被称作标准化向量或更简单地称为“法线”

5.7.1 运算法则

要标准化向量,将向量除以它的大小(模)即可

零向量不能被标准化。数学上不允许(除零)几何上也没意义(它没有方向)

5.7.2 几何解释

2D 环境中,如以原点为尾画一个单位向量,那么向量的头将接触到圆心在原点的单位圆。3D 环境中,单位向量将接触到单位球

5.8 向量的加法和减法

加法的运算法则很简单:两个向量相加,将对应分量

减法解释为加负向量,ab=a+(b)a-b=a+(-b)

注意:

  • 向量不能与标量或维数不同的向量相加/减
  • 和标量加法一样,向量加法满足交换律,但减法不满足交换律

5.8.2 几何解释

相加的几何解释为:平移向量,使向量 a 的头连接向量 b 的尾,接着从 a 的尾向 b 的头画一个向量

有了三角形法则,就能解释:向量能被解释为与轴平行的位移序列。下面解释了向量 [134]\begin{bmatrix}1&-3&4\end{bmatrix} 的位移序列:向右 1 个单位,向下 3 个单位,向前 4 个单位

5.8.3 一个点到另一个点的向量

使用三角形法则和向量减法即可,bab-a 即得出 aabb 的位移向量。注意简单的求“两点之间”的向量没有意义,因为没有指方向

5.9 距离公式

从几何意义上说,两点间距离等于从一个点到另一个点的向量的长度。让我们导出 3D 中的距离公式,先计算从 a 到 b 的向量 d

a 到 b 的距离等于向量 d 的长度

5.10 向量点乘

5.10.1 运算法则

“点乘”来自记法 aba \cdot b 中的点号,向量点乘中不能省略点乘号

5.10.2 几何解释

点乘结果描述了两个向量的“相似”程序,点乘结果越大,两向量越相近(夹角越小)

点乘等于向量大小与向量夹角的 cos 值的积

若 a、b 是单位向量

a 和 b 夹角的类型,只取结果的符号即可

因为零向量与其他向量的点乘结果为零,所以可以解释为:零向量和任意其他向量都垂直

5.10.3 向量投影

给定两个向量 vvnn,能将 vv 分解成两个分量:vv_{\parallel}vv_{\perp},它们分别平行和垂直于 nn,并满足 v=v+vv=v_{\parallel}+v_{\perp}

因平行于 n,所以 v=nvnv_{\parallel}=n\frac{\left\lVert{v_{\parallel}}\right\rVert}{\left\lVert{n}\right\rVert}

只要求出 vv_{\parallel} 的模,就能够计算出该投影向量的值了,三角分解能够帮助我们

5.11 向量叉乘

又称叉积,仅可应用于 3D 向量,向量叉乘得到一个向量且不满足交换律

5.11.1 运算法则

“叉乘”来自记法 a×ba \times b 中的叉号,不能省略,公式为:

叉乘优先级比点乘高,ab×c=a(b×c)a\cdot b\times c=a\cdot (b\times c)

5.11.2 几何解释

叉乘得到的向量垂直于原来的两个向量

叉乘结果向量的长度等于两向量的大小与向量夹角 sin 值的积

a×b\left\lVert{a\times b}\right\rVert可以看到,也等于以 aabb 为两边的平行四边形的面积

假设平行四边形面积为 A,有

若 a、b 平行或任意一个为 0,则 a×b=0a\times b = 0。叉乘对零向量的解释为:它平行于任意其他向量

定义零向量平行或垂直于任意向量都是不对的,因为它没有方向

叉乘的结果向量指向哪个方向呢?因为垂直于 a、b 构成的平面有两个方向

将 a 的头与 b 的尾相接,并确认从 a 到 b 是顺时针还是逆时针。在左手坐标系中,若 a 和 b 呈顺时针,那么 a×ba\times b 指向您。否则就是远离您。在右手坐标系中恰好相反

5.12 线性代数公式

Unity 的 Vector3 类

官方文档链接