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}\)。
因为垂直,所以它们的点积为零:
步骤 2: 求解标量比例 \(x\)
将 \(\mathbf{p} = x \mathbf{t}\) 代入上面的垂直条件点积公式中:
利用点积分配律展开得到:\(\mathbf{a} \cdot \mathbf{t} - x (\mathbf{t} \cdot \mathbf{t}) = 0\)
移项后即可解出未知数 \(x\):
步骤 3: 几何投影公式
将求出的 \(x\) 代回最开始的 \(\mathbf{p} = x \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}\) 是一列,相乘得到一个标量)。
👉 如果你不理解内积为什么能写成矩阵乘法,请点击这里查看详细拆解过程
步骤 5: 结合律与矩阵提取
因为 \(\mathbf{t}^T \mathbf{a}\) 仅仅是一个数字(标量),我们可以改变乘法的顺序,把标量乘法转化为矩阵相乘的结合律:
根据矩阵乘法的结合律,\(\mathbf{t} (\mathbf{t}^T \mathbf{a}) = (\mathbf{t} \mathbf{t}^T) \mathbf{a}\)。注意这里 \(\mathbf{t} \mathbf{t}^T\) 是一列乘以一行,结果是一个 \(n \times n\) 的矩阵!
步骤 6: 得出投影矩阵 M
对比形式 \(\mathbf{p} = M \mathbf{a}\),我们就可以把括号里的部分定义为投影矩阵 \(M\):
结论:只需用向量 \(\mathbf{a}\) 左乘这个矩阵 \(M\),就可以瞬间完成空间投影计算。这在3D图形学和渲染管线中被大量使用。
动画展示
现在,向量 A 会在空间中连续旋转,你可以观察到通过矩阵 M 实时计算出的投影向量 P,始终完美地贴合在目标向量 T 所在的直线上。