手工调整向量 A
3.0
0.0
2.0
图例与实时数据
目标向量 T
动态向量 A
投影向量 P
投影垂线

T = -
A = -
P = -

投影变换矩阵的推导过程

目的:假设我们有一个目标向量 \(\mathbf{t}\) 和一个待投影的向量 \(\mathbf{a}\)。我们希望找到一个矩阵 \(M\),使得 \(\mathbf{a}\) 乘以 \(M\) 后,能直接得到它在 \(\mathbf{t}\) 上的投影向量 \(\mathbf{p}\)。

步骤 0: 投影的定义与方向

投影向量 \(\mathbf{p}\) 和目标向量 \(\mathbf{t}\) 在同一条直线上,因此 \(\mathbf{p}\) 一定是 \(\mathbf{t}\) 的某个标量倍数,我们设 \(\mathbf{p} = x \mathbf{t}\)。我们的目标就是求出这个缩放比例 \(x\)。

步骤 1: 垂直(正交)关系

根据投影的几何定义,从向量 \(\mathbf{a}\) 的末端到投影点 \(\mathbf{p}\) 的连线(即投影垂线)必定垂直于目标向量 \(\mathbf{t}\)。

这条垂线向量可以表示为:\(\mathbf{a} - \mathbf{p}\)。

因为垂直,所以它们的点积为零:

\[ (\mathbf{a} - \mathbf{p}) \cdot \mathbf{t} = 0 \]

步骤 2: 求解标量比例 \(x\)

将 \(\mathbf{p} = x \mathbf{t}\) 代入上面的垂直条件点积公式中:

\[ (\mathbf{a} - x \mathbf{t}) \cdot \mathbf{t} = 0 \]

利用点积分配律展开得到:\(\mathbf{a} \cdot \mathbf{t} - x (\mathbf{t} \cdot \mathbf{t}) = 0\)

移项后即可解出未知数 \(x\):

\[ x = \frac{\mathbf{a} \cdot \mathbf{t}}{\mathbf{t} \cdot \mathbf{t}} \]

步骤 3: 几何投影公式

将求出的 \(x\) 代回最开始的 \(\mathbf{p} = x \mathbf{t}\),就得到了大家熟知的几何投影公式:

\[ \mathbf{p} = \left( \frac{\mathbf{a} \cdot \mathbf{t}}{\mathbf{t} \cdot \mathbf{t}} \right) \mathbf{t} \]

其中 \(\mathbf{a} \cdot \mathbf{t}\) 是内积(点积),结果是一个标量。\(\mathbf{t} \cdot \mathbf{t}\) 是 \(\mathbf{t}\) 长度的平方,也是一个标量。

步骤 4: 转换为矩阵乘法形式

将两个列向量的内积写成矩阵乘法形式:\(\mathbf{a} \cdot \mathbf{t} = \mathbf{t}^T \mathbf{a}\) (这里 \(\mathbf{t}^T\) 是一行,\(\mathbf{a}\) 是一列,相乘得到一个标量)。

👉 如果你不理解内积为什么能写成矩阵乘法,请点击这里查看详细拆解过程

\[ \mathbf{p} = \mathbf{t} \left( \frac{\mathbf{t}^T \mathbf{a}}{\mathbf{t}^T \mathbf{t}} \right) \]

步骤 5: 结合律与矩阵提取

因为 \(\mathbf{t}^T \mathbf{a}\) 仅仅是一个数字(标量),我们可以改变乘法的顺序,把标量乘法转化为矩阵相乘的结合律:

\[ \mathbf{p} = \frac{\mathbf{t} (\mathbf{t}^T \mathbf{a})}{\mathbf{t}^T \mathbf{t}} \]

根据矩阵乘法的结合律,\(\mathbf{t} (\mathbf{t}^T \mathbf{a}) = (\mathbf{t} \mathbf{t}^T) \mathbf{a}\)。注意这里 \(\mathbf{t} \mathbf{t}^T\) 是一列乘以一行,结果是一个 \(n \times n\) 的矩阵!

\[ \mathbf{p} = \left( \frac{\mathbf{t} \mathbf{t}^T}{\mathbf{t}^T \mathbf{t}} \right) \mathbf{a} \]

步骤 6: 得出投影矩阵 M

对比形式 \(\mathbf{p} = M \mathbf{a}\),我们就可以把括号里的部分定义为投影矩阵 \(M\):

\[ M = \frac{\mathbf{t} \mathbf{t}^T}{\mathbf{t}^T \mathbf{t}} \]

结论:只需用向量 \(\mathbf{a}\) 左乘这个矩阵 \(M\),就可以瞬间完成空间投影计算。这在3D图形学和渲染管线中被大量使用。

动画展示

现在,向量 A 会在空间中连续旋转,你可以观察到通过矩阵 M 实时计算出的投影向量 P,始终完美地贴合在目标向量 T 所在的直线上。