线性代数之TRS分解

Tags: ,

pbrt的TRS分解

设矩阵A,假设A可以分解成T、R、S,则有A=TRS,设A:

\[ A = \left[ \begin{matrix} A_{11}&A_{12}&A_{13}&A_{14}\\ A_{21}&A_{22}&A_{23}&A_{24}\\ A_{31}&A_{32}&A_{33}&A_{34}\\ A_{41}&A_{42}&A_{43}&A_{44}\\ \end{matrix} \right] \]

再设T、R、S分别为:

\[ T = \left[ \begin{matrix} 1&0&0&t_{x}\\ 0&1&0&t_{y}\\ 0&0&1&t_{z}\\ 0&0&0&1\\ \end{matrix} \right] \]

\[ R = \left[ \begin{matrix} r_{11}&r_{12}&r_{13}&0\\ r_{21}&r_{22}&r_{23}&0\\ r_{31}&r_{32}&r_{33}&0\\ 0&0&0&1\\ \end{matrix} \right] \]

\[ S = \left[ \begin{matrix} s_{x}&0&0&0\\ 0&s_{y}&0&0\\ 0&0&t_{y}&0\\ 0&0&0&1\\ \end{matrix} \right] \]

所以TRS等于:

\[ A = TRS = \left[ \begin{matrix} 1&0&0&t_{x}\\ 0&1&0&t_{y}\\ 0&0&1&t_{z}\\ 0&0&0&1\\ \end{matrix} \right] \left[ \begin{matrix} r_{11}&r_{12}&r_{13}&0\\ r_{21}&r_{22}&r_{23}&0\\ r_{31}&r_{32}&r_{33}&0\\ 0&0&0&1\\ \end{matrix} \right] \left[ \begin{matrix} s_{x}&0&0&0\\ 0&s_{y}&0&0\\ 0&0&t_{y}&0\\ 0&0&0&1\\ \end{matrix} \right]\] \[ = \left[ \begin{matrix} 1&0&0&t_{x}\\ 0&1&0&t_{y}\\ 0&0&1&t_{z}\\ 0&0&0&1\\ \end{matrix} \right] \left[ \begin{matrix} r_{11}s_{x}&r_{12}s_{y}&r_{13}s_{z}&0\\ r_{21}s_{x}&r_{22}s_{y}&r_{23}s_{z}&0\\ r_{31}s_{x}&r_{32}s_{y}&r_{33}s_{z}&0\\ 0&0&0&1\\ \end{matrix} \right]\] \[ = \left[ \begin{matrix} r_{11}s_{x}&r_{12}s_{y}&r_{13}s_{z}&t_{x}\\ r_{21}s_{x}&r_{22}s_{y}&r_{23}s_{z}&t_{y}\\ r_{31}s_{x}&r_{32}s_{y}&r_{33}s_{z}&t_{z}\\ 0&0&0&1\\ \end{matrix} \right] \]

从TRS矩阵可以看出:

  • A矩阵的最后一行为[0,0,0,1]
  • A的最后一列是T的最后一列

所以T是最好求的:

\[ T = \left[ \begin{matrix} 1&0&0&A_{14}\\ 0&1&0&A_{24}\\ 0&0&1&A_{34}\\ 0&0&0&1\\ \end{matrix} \right] \]

同时,我们也可以快速知道RS矩阵:

\[ RS = \left[ \begin{matrix} A_{11}&A_{12}&A_{13}&0\\ A_{21}&A_{22}&A_{23}&0\\ A_{31}&A_{32}&A_{33}&0\\ 0&0&0&1\\ \end{matrix} \right] \]

问题就简化成:如果让RS分解成R和S。

pbrt的解法比较神奇,称为polar decomposition(极分解?)。

(这算法似乎是用来求矩阵的平方根的,但是为什么可以用在这里,我没搞明白,也没找到证明过程。有知道的朋友麻烦告知一下哈)

pbrt给了一个公式是:

\[ M_{i+1} = \frac {1}{2}(M_{i} + (M_{i}^{T})^{-1}) \]

把M = RS代入这个公式,迭代多次后,M的值会收敛,得到的最终的M就是R。

然后S就等于\(S = (RS)R^{-1} \)。

因为R是一个转换矩阵,意味着经过S转换后的点,还是处于原来的空间,只是坐标变换了。那么R必然是一个正交矩阵(列向量之间线性无关),所以有\(R^{T}=R^{-1}\)。 将这个式子代入上面的公式,可以发现:

\[ R_{i+1} = \frac {1}{2}(R_{i} + (R_{i}^{T})^{-1}) \] \[ = \frac {1}{2}(R_{i} + (R_{i}^{-1})^{-1}) \] \[ = \frac {1}{2}(R_{i} + R_{i}) \] \[ = \frac {1}{2}2R_{i} = R_{i} \]

即是说,对于一个纯粹的旋转矩阵R,将R和R的转置的逆矩阵求平均,依然还是R。

(未经授权禁止转载)
Written on October 5, 2015

写作不易,您的支持是我写作的动力!