我正在研究一个需要使用校准相机渲染 3d 模型的计算机视觉问题。我正在编写一个函数,将校准后的相机矩阵分解为模型视图矩阵和投影矩阵,但我在 opengl 中遇到了一个有趣的现象,无法解释(至少我是这样)。
简短的描述是,否定投影矩阵不会导致任何渲染(至少在我的经验中)。我希望将投影矩阵乘以任何标量都不会产生任何影响,因为它会转换不受缩放影响的齐次坐标。
以下是我认为这出乎意料的原因;也许有人可以指出我的推理存在缺陷的地方。
想象一下下面的透视投影矩阵,它给出了正确的结果:
[ a b c 0 ]
P = [ 0 d e 0 ]
[ 0 0 f g ]
[ 0 0 h 0 ]
将此乘以相机坐标得到齐次剪辑坐标:
[x_c] [ a b c 0 ] [X_e]
[y_c] = [ 0 d e 0 ] * [Y_e]
[z_c] [ 0 0 f g ] [Z_e]
[w_c] [ 0 0 h 0 ] [W_e]
最后,为了获得标准化的设备坐标,我们将 x_c、y_c 和 z_c 除以 w_c:
[x_n] [x_c/w_c]
[y_n] = [y_c/w_c]
[z_n] [z_c/w_c]
现在,如果我们对 P 取反,则结果剪辑坐标应该被取反,但由于它们是齐次坐标,乘以任何标量(例如 -1)不应该对结果归一化设备坐标产生任何影响。然而,在 openGl 中,否定 P 不会导致任何内容被渲染。我可以将 P 乘以任何非负标量并获得完全相同的渲染结果,但只要我乘以负标量,就不会渲染任何内容。这里发生了什么??
谢谢!