为什么在opengl投影矩阵中符号很重要

Kyl*_*mek 13 opengl graphics projection homogenous-transformation

我正在研究计算机视觉问题,需要使用校准相机渲染3d模型.我正在编写一个将校准后的相机矩阵分解为模型视图矩阵和投影矩阵的函数,但是我在opengl中遇到了一个无法解释的有趣现象(至少在我看来).

简短的描述是否定投影矩阵导致没有渲染(至少在我的经验中).我希望将投影矩阵乘以任何标量都没有效果,因为它会转换不受缩放影响的齐次坐标.

以下是我的理由,为什么我发现这是出乎意料的; 也许有人可以指出我的推理存在缺陷的地方.

想象一下以下透视投影矩阵,它给出了正确的结果:

    [ a b c 0 ]
P = [ 0 d e 0 ]
    [ 0 0 f g ]
    [ 0 0 h 0 ]
Run Code Online (Sandbox Code Playgroud)

乘以相机坐标得到均匀的剪辑坐标:

[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]
Run Code Online (Sandbox Code Playgroud)

最后,为了得到规范化的设备坐标,我们将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]
Run Code Online (Sandbox Code Playgroud)

现在,如果我们否定P,则应该否定得到的剪辑坐标,但由于它们是齐次坐标,因此乘以任何标量(例如-1)不应对得到的标准化设备坐标产生任何影响.但是,在openGl中,否定P会导致无法渲染.我可以将P乘以任何非负标量并获得完全相同的渲染结果,但只要乘以负标量,就不会渲染.这里发生了什么??

谢谢!

Bah*_*bar 10

好吧,它的要点是裁剪测试是通过以下方式完成的:

-w_c < x_c < w_c
-w_c < y_c < w_c
-w_c < z_c < w_c
Run Code Online (Sandbox Code Playgroud)

乘以负值会破坏此测试.

  • 好答案!我假设限幅测试为:-1 &lt;x_c / w_c &lt;1,但是我猜想opengl避免了除法运算,但当w_c为负数时会以不正确的评估为代价。 (2认同)