凑矩阵的一些计算

目标

凑出下面矩阵的几个因子,可解释每个因子的意义
[ 2 n r − l 0 r + l r − l 0 0 2 n t − b t + b t − b 0 0 0 − f + n f − n − 2 f n f − n 0 0 − 1 0 ] \left[ \begin{array}{cccc} \dfrac{2 n}{r-l} & 0 & \dfrac{r+l}{r-l} & 0 \\[10pt] 0 & \dfrac{2 n}{t-b} & \dfrac{t+b}{t-b} & 0 \\[10pt] 0 & 0 & -\dfrac{f+n}{f-n} & -\dfrac{2 f n}{f-n} \\[10pt] 0 & 0 & -1 & 0 \\ \end{array} \right] rl2n0000tb2n00rlr+ltbt+bfnf+n100fn2fn0

结果

n [ 1 0 0 0 0 1 0 0 0 0 n + f ( n − f ) n 0 0 0 0 1 ] ⏟ ( 1 ) ⋅ [ − 2 l − r 0 0 l + r l − r 0 − 2 b − t 0 b + t b − t 0 0 1 0 0 0 0 1 ] ⏟ ( 2 ) ⋅ [ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 − 1 n 1 ] ⏟ ( 3 ) ⋅ [ 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 1 n ] ⏟ ( 4 ) ⋅ [ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 2 n f f + n ] ⏟ ( 5 ) n\underbrace{\color{blue}\left[ \begin{array}{cccc} 1 & 0 & 0 & 0 \\[12pt] 0 & 1 & 0 & 0 \\[12pt] 0 & 0 &\dfrac{n+f}{(n-f) n} & 0 \\[12pt] 0 & 0 & 0 & 1 \\[12pt] \end{array} \right]}_{\color{red}(1)}\cdot \underbrace{\color{blue}\left[ \begin{array}{cccc} \dfrac{ -2}{l-r} & 0 & 0 & \dfrac{l+r}{l-r} \\[12pt] 0 & \dfrac{ -2}{b-t} & 0 & \dfrac{b+t}{b-t} \\[12pt] 0 & 0 & 1 & 0 \\[12pt] 0 & 0 & 0 & 1 \\[12pt] \end{array} \right]}_{\color{red}(2)}\cdot\underbrace{\color{blue}\left[ \begin{array}{cccc} 1 & 0 & 0 & 0 \\[12pt] 0 & 1 & 0 & 0 \\[12pt] 0 & 0 & 1 & 0 \\[12pt] 0 & 0 & -\dfrac{1}{n} & 1 \\[12pt] \end{array} \right]}_{\color{red}(3)}\cdot\underbrace{\color{blue}\left[ \begin{array}{cccc} 1 & 0 & 0 & 0 \\[12pt] 0 & 1 & 0 & 0 \\[12pt] 0 & 0 & 1 & 1 \\[12pt] 0 & 0 & 0 & \dfrac{1}{n} \\[12pt] \end{array} \right]}_{\color{red}(4)}\cdot\underbrace{\color{blue}\left[ \begin{array}{cccc} 1 & 0 & 0 & 0 \\[12pt] 0 & 1 & 0 & 0 \\[12pt] 0 & 0 & 1 & 0 \\[12pt] 0 & 0 & 0 & \dfrac{2 n f}{f+n} \\[12pt] \end{array} \right]}_{\color{red}(5)} n(1) 1000010000(nf)nn+f00001(2) lr20000bt2000010lrl+rbtb+t01(3) 10000100001n10001(4) 100001000010001n1(5) 100001000010000f+n2nf

这样分解出来的因子,几何意义就比较好解释。但是这又有什么用呢?

矩阵(1)是纯粹为了拼凑而得到的;
矩阵(3)、(4)、(5)是从跟中心投影最近似的透视(3)和不同的放缩的复合得到的;
矩阵(2)严格计算,则是从另外一篇博客的练习题得到;灵活使用射影几何基本定理。所有的代数计算运算量都比较大,而且是符合计算,借助符号计算工具推导完成。

矩阵分解(或拼凑)等式

分解不唯一,所以,每种分解都是一种拼凑

[ 2 n r − l 0 r + l r − l 0 0 2 n t − b t + b t − b 0 0 0 n + f n − f 2 n f n − f 0 0 − 1 0 ] = n [ 1 0 0 0 0 1 0 0 0 0 n + f ( n − f ) n 0 0 0 0 1 ] ⏟ ( 1 ) ⋅ [ − 2 l − r 0 0 l + r l − r 0 − 2 b − t 0 b + t b − t 0 0 1 0 0 0 0 1 ] ⏟ ( 2 ) ⋅ [ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 − 1 n 1 ] ⏟ ( 3 ) ⋅ [ 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 1 n ] ⏟ ( 4 ) ⋅ [ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 2 n f n + f ] ⏟ ( 5 ) \left[ \begin{array}{cccc} \dfrac{2 n}{r-l} & 0 & \dfrac{r+l}{r-l} & 0 \\[10pt] 0 & \dfrac{2 n}{t-b} & \dfrac{t+b}{t-b} & 0 \\[10pt] 0 & 0 & \dfrac{n+f}{n-f} & \dfrac{2 n f}{n-f} \\[10pt] 0 & 0 & -1 & 0 \\ \end{array} \right]=n\underbrace{\color{blue}\left[ \begin{array}{cccc} 1 & 0 & 0 & 0 \\[12pt] 0 & 1 & 0 & 0 \\[12pt] 0 & 0 &\dfrac{n+f}{(n-f) n} & 0 \\[12pt] 0 & 0 & 0 & 1 \\[12pt] \end{array} \right]}_{\color{red}(1)}\cdot \underbrace{\color{blue}\left[ \begin{array}{cccc} \dfrac{ -2}{l-r} & 0 & 0 & \dfrac{l+r}{l-r} \\[12pt] 0 & \dfrac{ -2}{b-t} & 0 & \dfrac{b+t}{b-t} \\[12pt] 0 & 0 & 1 & 0 \\[12pt] 0 & 0 & 0 & 1 \\[12pt] \end{array} \right]}_{\color{red}(2)}\cdot\underbrace{\color{blue}\left[ \begin{array}{cccc} 1 & 0 & 0 & 0 \\[12pt] 0 & 1 & 0 & 0 \\[12pt] 0 & 0 & 1 & 0 \\[12pt] 0 & 0 & -\dfrac{1}{n} & 1 \\[12pt] \end{array} \right]}_{\color{red}(3)}\cdot\underbrace{\color{blue}\left[ \begin{array}{cccc} 1 & 0 & 0 & 0 \\[12pt] 0 & 1 & 0 & 0 \\[12pt] 0 & 0 & 1 & 1 \\[12pt] 0 & 0 & 0 & \dfrac{1}{n} \\[12pt] \end{array} \right]}_{\color{red}(4)}\cdot\underbrace{\color{blue}\left[ \begin{array}{cccc} 1 & 0 & 0 & 0 \\[12pt] 0 & 1 & 0 & 0 \\[12pt] 0 & 0 & 1 & 0 \\[12pt] 0 & 0 & 0 & \dfrac{2 n f}{n+f} \\[12pt] \end{array} \right]}_{\color{red}(5)} rl2n0000tb2n00rlr+ltbt+bnfn+f100nf2nf0=n(1) 1000010000(nf)nn+f00001(2) lr20000bt2000010lrl+rbtb+t01(3) 10000100001n10001(4) 100001000010001n1(5) 100001000010000n+f2nf

OpenGL的GLFrustum()函数中所谓投影矩阵的几何意义,从纯粹代数的角度看,不像官方教材里作者初期望的那样,而是对应于另外一种或一些若即若离但不太一样的几何意义。这就是进行这个矩阵分解想要说明的初衷。

你可能感兴趣的:(学习学习)