投影矩阵求逆

Posted back-to-the-past

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了投影矩阵求逆相关的知识,希望对你有一定的参考价值。

什么是投影矩阵的逆矩阵呢?从几何意义上来讲,就是把投影到NDC的坐标转化为观察空间下的坐标。

假设y方向的视域角(alpha),视域的宽高比为(r),投影平面距离摄像机的距离为(d),视域的宽为(w),高为(h),近剪裁面距离摄像机的距离为(n),远剪裁面距离摄像机的距离为(f)。首先有:
[ r= frac{w}{h} ]

[ tanfrac{alpha}{2} = frac{h}{d} ]

假设任一点(P),投影后的坐标为((x, y, z)),观察空间下的坐标为((x', y', z')),那么有:
[ dfrac{x'}{wx} = dfrac{z'}{d} ]

[ dfrac{y'}{hy} = dfrac{z'}{d} ]

这里,分别给(x)(y)乘以(w)(h)是因为NDC的坐标是归一化过的,要先还原到([-w, w])([-h, h])的取值范围。

综合上式,求出(x')(y')
[ x' = dfrac{z'wx}{d} = z'rtan(dfrac{alpha}{2})x ]

[ y' = dfrac{z'hy}{d} = z'tan(dfrac{alpha}{2})y ]

注意到上述求得的(x')(y')里的分母中均包含(z'),为了用矩阵形式来表达逆投影变换,必须要借助齐次坐标,对((x',y',z',1))各除以(z'),即转换为((dfrac{x'}{z'}, dfrac{y'}{z'}, 1, dfrac{1}{z'}))。 有:
[ [x, y, z, 1] cdot egin{bmatrix} rtandfrac{alpha}{2} & 0 & 0 & 0 \ 0 & tandfrac{alpha}{2} & 0 & 0 \ 0 & 0 & 0 & A \ 0 & 0 & 1 & B end{bmatrix} = [dfrac{x'}{z'}, dfrac{y'}{z'}, 1, Az+B] ]
由投影变换可知,(z)可以写成:
[ z = dfrac{dfrac{f}{f - n}z' + dfrac{nf}{n - f}}{z'} ]
由此可知,解得(dfrac{1}{z'})
[ dfrac{1}{z'} = dfrac{n - f}{nf}z + dfrac{1}{n} ]
也就有:
[ egin{cases} A = dfrac{n - f}{nf} B = dfrac{1}{n} end{cases} ]
最终得到投影矩阵的逆矩阵为:
[ egin{bmatrix} rtandfrac{alpha}{2} & 0 & 0 & 0 \ 0 & tandfrac{alpha}{2} & 0 & 0 \ 0 & 0 & 0 & dfrac{n - f}{nf} \ 0 & 0 & 1 & dfrac{1}{n} end{bmatrix} ]

以上是关于投影矩阵求逆的主要内容,如果未能解决你的问题,请参考以下文章

计算机图形学-MVP变换之投影(Projection)变换

∑GL-透视投影矩阵的推导

∑GL-透视投影矩阵的推导

OpenGL - 正交投影矩阵,glViewport

如何构建透视投影矩阵(无 API)

相机标定:投影矩阵