取两个向量,我们可以写出它们在网格中所有分量的组合:

这个完整的网格就是 外积,可以分解为:
点积(Dot product),即相似维度之间的相互作用(
x*x,y*y,z*z)叉积(Cross product),即不同维度之间的相互作用(
x*y,y*z,z*x等)
这个 点积(dot product) ($\vec{a} \cdot \vec{b}$) 衡量相似性,因为它只累积匹配维度的相互作用。这是一个简单的计算,涉及3个分量。
叉积(写作 $\vec{a} \times \vec{b}$)需要衡量半打“交叉相互作用”。计算看起来复杂,但概念很简单:将6个单独的差异累加起来得到总差异。
不要想“什么时候需要叉积?”,而要想“什么时候需要不同维度之间的相互作用?”。
例如,面积是由指向不同方向的向量形成的(正交性越好,面积越大)。实际上,叉积衡量的是两个三维向量所张成的面积(来源):
![]()
(“叉积”假设三维向量,但可以 该概念扩展(the concept extends) 推广到更高维度。)
关键直觉有头绪了吗?让我们深入细节。
定义叉积(Defining the Cross Product)
这个 点积(dot product) 表示向量之间的相似性,用一个数字表示:
![]()
例如,我们可以说北和东有0%的相似性,因为 $(0, 1) \cdot (1, 0) = 0$。或者北和东北有70%的相似性($\cos(45) = .707$,记住 三角函数是百分比(trig functions are percentages).) 相似度显示了一个向量在另一个向量中"出现"的量。
叉积(向量之间的差异)也应该是一个单一数值吗?
让我们试试。正弦值就是百分比差异,所以我们可以写成:
![]()
不幸的是,我们缺少一些细节。假设我们沿 x 轴方向看:y 和 z 都 100% 背离我们。像“100%”这样的数值告诉我们存在很大的差异,但我们不知道它是什么!我们需要额外的信息来告诉我们“$\vec{x}$ 和 $\vec{y}$ 之间的差异是 这个” 以及 “$\vec{x}$ 和 $\vec{z}$ 之间的差异是 那个“.
因此,让我们将叉积表示为一个向量:
这个 大小 叉积的大小是数值上的“差异量”(以 $\sin(\theta)$ 作为百分比)。它本身无法区分 $\vec{x} \times \vec{y}$ 和 $\vec{x} \times \vec{z}$。
这个 方向 叉积的方向基于两个输入:它是同时垂直于两者的方向(即不偏袒任何一方)。
现在 $\vec{x} \times \vec{y}$ 和 $\vec{x} \times \vec{z}$ 有不同的结果,每个结果的大小都表明它们与 $\vec{x}$ 有“100%”的差异。
(点积也应该是一个向量结果吗?嗯,我们是在追踪 $\vec{a}$ 和 $\vec{b}$ 之间的相似度。相似度衡量的是原始向量方向之间的重叠,我们已经有了这些方向。)
几何解释(Geometric Interpretation)
两个向量确定一个平面,叉积指向与两者都不同的方向(来源):
![]()
问题在于:有两个垂直方向。按照惯例,我们采用“右手系”(来源):
![]()
如果你像图中所示那样伸出前两根手指,你的拇指将指向叉积的方向。我通过将食指从 $\vec{a}$ 扫向 $\vec{b}$ 来确保方向正确。方向确定后,叉积的大小为 $|a| |b| \sin(\theta)$,它与每个向量的大小以及“差异百分比”(正弦值)成正比。
正交向量的叉积(The Cross Product For Orthogonal Vectors)
要记住右手定则,将 xyz 顺序写两次: xyzxyz。接下来,找到你想要的模式:
xy => z(x叉积y是z)yz => x(y叉积z是x;我们绕了一圈:y到z到x)zx => y
现在, xy 和 yx 具有相反的符号,因为它们在我们的 xyzxyz 设定中分别向前和向后。
所以,即使没有公式,你也应该能够计算出:
![]()
同样,这是因为 x 叉积 y 是正的 z 在右手坐标系中。我使用了单位向量(Unit Vector),但我们可以缩放各项:
![]()
计算叉积(Calculating The Cross Product)
单个向量可以分解为其3个正交分量:
![]()
![]()
当向量作叉积时,每对正交分量(如 $a_x \times b_y$)都会投票决定正交向量的指向。6个分量,6票,它们的总和就是叉积(Cross Product)。(类似于 梯度(gradient),其中每个轴投票选出增长最快的方向。)
xy => z和yx => -z(假设 $\vec{a}$ 是第一个,因此xy表示 $a_x b_y$)yz => x和zy => -xzx => y和xz => -y
xy 和 yx 竞争在 z 方向。如果这些项相等,例如在 $(2, 1, 0) \times (2, 1, 1)$ 中,则叉积分量在 z 方向(2 – 2 = 0)。
最终组合为:
![]()
其中 $\vec{n}$ 是垂直于 $\vec{a}$ 和 $\vec{b}$ 的单位向量。
别被这个吓到:
- 有6项,3正3负
- 两个维度决定第三个(所以
z项必须只包含y和x分量) - 正负顺序基于
xyzxyz模式
如果你喜欢,有一个 代数证明(algebraic proof),该公式既是正交的,大小又为 $|a| |b| \sin(\theta)$,但我更喜欢“比例投票”的直觉。
示例时间(Example Time)
同样,我们应该在心中进行简单的叉积计算:
![]()
为什么?我们交叉了 x 和 y 轴,得到 z (或使用单位向量,$\vec{i} \times \vec{j} = \vec{k}$)。反向交叉则得到 $-\vec{k}$。
以下是我如何处理更复杂示例的方法:
![]()
- 让我们来处理最后一项,即 z 分量。它是 (1)(5) 减去 (4)(2),即 5 – 8 = -3。我之所以先做
z是因为它用到了x和y前两项。当你从第一个向量扫描到第二个向量时,试着把 (1)(5) 看作“正向”,而把 (4)(2) 看作从第二个向量到第一个向量的“反向”。 - 现在来看
y分量:(3)(4) – (6)(1) = 12 – 6 = 6 - 现在来看
x分量:(2)(6) – (5)(3) = 12 – 15 = -3
所以,总和是 $(-3, 6, -3)$,我们可以 验证(verify) 使用 Wolfram Alpha。

简而言之:
- 叉积(Cross Product)追踪了维度之间的所有“交叉交互”
- 共有 6 种交互(每个维度 2 种),其符号取决于
xyzxyz顺序
附录(Appendix)
与行列式的联系
你可以用这个矩阵的行列式来计算叉积:

![]()
这里有一个巧妙的联系,因为行列式(“有符号面积/体积”)追踪了来自正交分量的贡献。
存在 理论原因(theoretical reasons) 为什么叉积(作为一个正交向量)只在0、1、3或7维中可用。然而,叉积作为一个单一数字本质上就是行列式(标量形式的有符号面积、体积或超体积)。
与旋度的联系
旋度(Curl) 衡量向量场施加在一点上的扭转力,并用垂直于表面的向量来度量。每当你听到“垂直向量”时,就想到“叉积”。
我们取这个矩阵的“行列式”:

![]()
不是乘法,交互是取偏导数。和之前一样,旋度的$\vec{i}$分量基于$\vec{j}$和$\vec{k}$方向上的向量和导数。
与勾股定理的关系
叉积和点积就像三角形的正交边:
![]()
对于单位向量,其中$|a| = |b| = 1 $,我们有:
![]()
我在网格图中有点作弊,因为我们必须跟踪平方量级(如勾股定理中所做的那样)。
高等数学
叉积及其相关概念在 克利福德代数(Clifford Algebra) 和 几何代数(Geometric Algebra)中得到扩展。我仍在学习这些。
叉积的叉积
有时你会遇到这样的情况:
![]()
首先,叉积 不可结合(isn't associative):顺序很重要。
接下来,记住叉积的作用:寻找正交向量。如果任意两个分量平行($\vec{a}$平行于$\vec{b}$),则没有维度相互推挤,叉积为零(这延伸到$0 \times \vec{c}$)。
但是$\vec{a}$和$\vec{c}$平行是可以的,因为它们从未直接参与叉积,例如:
![]()
哇!我们怎么回到了$\vec{j}$?我们要求一个同时垂直于$\vec{i}$和$\vec{j}$的方向,然后又让这个方向垂直于$\vec{i}$。“双重垂直”意味着你回到了原来的轴上。
叉积的点积
现在如果我们取
![]()
会发生什么?我们必须先计算 $\vec{a} \times \vec{b}$,因为 $\vec{b} \cdot \vec{c}$ 返回一个标量(单个数字),不能用于叉积。
如果 $\vec{a}$ 和 $\vec{c}$ 平行,会发生什么?嗯,$\vec{a} \times \vec{b}$ 垂直于 $\vec{a}$,也就是说它垂直于 $\vec{c}$,所以与 $\vec{c}$ 的点积为零。
我从未真正记住这些规则,我必须思考它们的相互作用。
其他坐标系
Unity 游戏引擎是 左撇子(left-handed),OpenGL(以及大多数数学/物理工具)是右手系的。为什么?
在计算机游戏中, x 是水平的, y 是垂直的,而 z 指向“屏幕内部”。这导致了一个左手系。(试试看:用你的右手,你可以看到 x 叉积 y 应该指向屏幕外部)。
叉积的应用
- 找出垂直于两个给定向量的方向。
- 找出两个向量所张成的有符号面积。
- 判断两个向量是否正交(不过检查点积是否为 0 可能更快)。
- “乘以”两个向量,仅当垂直交叉项有贡献时(例如计算扭矩)。
- 使用四元数(4 维复数)时,叉积实现了一个向量绕另一个向量的旋转(另一篇文章正在撰写中!)。
数学愉快。