3D数学基础 图形和游戏开发(第二版)笔记
正式线性代数规则
定义: 等价于
旋转矩阵和反射矩阵都是正交的。如果我们已经知道矩阵是正交的,则基本上可以避免计算其逆转矩阵(直接使用转置矩阵即可),这是一个相对昂贵的计算。
几何解释
要使矩阵正交,必须满足以下条件:
- 矩阵的每一行必须是单位矢量。
- 矩阵的行必须相互垂直。
在线性代数中,如果一组基矢量相互垂直,则将它们描述为正交(Orthogonal)。它们不需要具有单位长度。如果它们确实具有单位长度,则它们是标准正交基(Orthogormal Basic)。因此,正交矩阵(Orthogonal Matrix)的行和列是标准正交基矢量(Orthonormal Basic Vector).然而,从一组正交基矢量构造矩阵不一定导致正交矩阵(除非基矢量也是标准正交基)。
矩阵的正交化
有时我们遇到的矩阵会略微偏离正交性。这可能是因为从外部源获得了不良数据,或者可能累积了浮点误差,后者又称为矩阵蠕变(Matrix Creep)。对于用于凹凸映射(Bump Mapping)的基矢量,通常会将基矢量调整为正交,即使纹理映射渐变不是很垂直。在这些情况下,我们都希望对矩阵进行正交化(Orthogonalize),从而得到一个矩阵,该矩阵具有相互垂直的单位矢量轴,并且(希望)尽可能接近原始矩阵.
用于构造一组正交基矢量(它是正交矩阵的行)的标准算法是Gram-Schmidt正交化.其基本思想是按顺序遍历基矢量。对于每个基矢量,我们将减去与基向量平行的矢量,这必然会产生垂直矢量。
让代表3×3矩阵
的行(记住,你也可以将它们视为坐标空间的
轴,
轴,
轴),然后可以根据以下算法计算出一组正交的行矢量
:
在应用这些步骤之后,矢量将保证相互垂直,因此将形成正交基。但是,它们可能不一定是单位矢量。我们需要一个标准正交基来形成一个正交矩阵,因此还必须对矢量进行归一化。
还有一个再三维中有效(但不适用于更高维度)的技巧是使用叉积计算第三个基矢量,具体如下:
Gram-Schmidt算法是有偏差的,这取决于列出的基矢量的顺序。例如,永远不会改变,而
可能会改变最多。改算法有一种不偏向任何特定轴的变体,那就是放弃在一次遍历中完全正交化整个矩阵的尝试。我们可以选择一个因子
,而不是减去所有的投影,我们只减去它的
。我们还将投影减去原始轴,而不是被调整的那个。通过这种方式,执行操作的顺序就变得无关紧要了,这样就可以产生没有维度偏差的结果。该算法可总结如下:
该算法的一次迭代将产生一组比原始矢量稍微“更正交”一些的基矢量,但可能不会完全正交。通过多次重复该过程,我们最终可以在正交基矢量上收敛。为选择一个适当小的值(如0.25)并迭代足够多次(如10次)会让我们相当接近正交,然后可以使用标准的Gram-Schmidt算法来保证获得完全正交基。
网友评论