正交矩阵(Orthogonal Matrix)

2021-04-03  本文已影响0人  喜欢吃包包

3D数学基础 图形和游戏开发(第二版)笔记

正式线性代数规则

定义: MM^{T} = I 等价于 M^{T} = M^{-1}

旋转矩阵和反射矩阵都是正交的。如果我们已经知道矩阵是正交的,则基本上可以避免计算其逆转矩阵(直接使用转置矩阵即可),这是一个相对昂贵的计算。

几何解释

要使矩阵正交,必须满足以下条件:

在线性代数中,如果一组基矢量相互垂直,则将它们描述为正交(Orthogonal)。它们不需要具有单位长度。如果它们确实具有单位长度,则它们是标准正交基(Orthogormal Basic)。因此,正交矩阵(Orthogonal Matrix)的行和列是标准正交基矢量(Orthonormal Basic Vector).然而,从一组正交基矢量构造矩阵不一定导致正交矩阵(除非基矢量也是标准正交基)。

矩阵的正交化

有时我们遇到的矩阵会略微偏离正交性。这可能是因为从外部源获得了不良数据,或者可能累积了浮点误差,后者又称为矩阵蠕变(Matrix Creep)。对于用于凹凸映射(Bump Mapping)的基矢量,通常会将基矢量调整为正交,即使纹理映射渐变不是很垂直。在这些情况下,我们都希望对矩阵进行正交化(Orthogonalize),从而得到一个矩阵,该矩阵具有相互垂直的单位矢量轴,并且(希望)尽可能接近原始矩阵.

用于构造一组正交基矢量(它是正交矩阵的行)的标准算法是Gram-Schmidt正交化.其基本思想是按顺序遍历基矢量。对于每个基矢量,我们将减去与基向量平行的矢量,这必然会产生垂直矢量。

r_1,r_2,r_3代表3×3矩阵M的行(记住,你也可以将它们视为坐标空间的x轴,y轴,z轴),然后可以根据以下算法计算出一组正交的行矢量r_1^{'},r_2^{'},r_3^{'}:

r_1^{'} \Leftarrow r_1

r_2^{'} \Leftarrow r_2 - {r_2·r_1^{'}\over r_1^{'}·r_1^{'} }r_1^{'}

r_3^{'} \Leftarrow r_3 - {r_3·r_1^{'}\over r_1^{'}·r_1^{'} }r_1^{'} - {r_3·r_2^{'}\over r_2^{'}·r_2^{'} }r_2^{'}
在应用这些步骤之后,矢量r_1,r_2,r_3将保证相互垂直,因此将形成正交基。但是,它们可能不一定是单位矢量。我们需要一个标准正交基来形成一个正交矩阵,因此还必须对矢量进行归一化。
还有一个再三维中有效(但不适用于更高维度)的技巧是使用叉积计算第三个基矢量,具体如下:
r_3^{'} \Leftarrow r_1^{'}×r_2^{'}

Gram-Schmidt算法是有偏差的,这取决于列出的基矢量的顺序。例如,r_1永远不会改变,而r_3可能会改变最多。改算法有一种不偏向任何特定轴的变体,那就是放弃在一次遍历中完全正交化整个矩阵的尝试。我们可以选择一个因子k,而不是减去所有的投影,我们只减去它的k。我们还将投影减去原始轴,而不是被调整的那个。通过这种方式,执行操作的顺序就变得无关紧要了,这样就可以产生没有维度偏差的结果。该算法可总结如下:

r_1^{'} \Leftarrow r_1 - k{r_1·r_2\over r_2·r_2}r_2 - k{r_1·r_3\over r_3·r_3}r_3
r_2^{'} \Leftarrow r_2 - k{r_2·r_1\over r_1·r_1}r_1 - k{r_2·r_3\over r_3·r_3}r_3
r_3^{'} \Leftarrow r_3 - k{r_3·r_1\over r_1·r_1}r_1 - k{r_3·r_2\over r_2·r_2}r_2

该算法的一次迭代将产生一组比原始矢量稍微“更正交”一些的基矢量,但可能不会完全正交。通过多次重复该过程,我们最终可以在正交基矢量上收敛。为k选择一个适当小的值(如0.25)并迭代足够多次(如10次)会让我们相当接近正交,然后可以使用标准的Gram-Schmidt算法来保证获得完全正交基。

上一篇 下一篇

猜你喜欢

热点阅读