8

我真的对 OpenGL 的模型视图转换感到困惑。我了解所有的转换过程,但是当涉及到投影矩阵时,我迷路了:(

如果我有一个点 P (x, y, z),我如何检查该点是否将绘制在由平行裁剪体积或透视裁剪体积定义的裁剪体积上?这个过程背后的数学背景是什么?

4

3 回答 3

13

将模型-视图-投影矩阵应用于对象,然后检查它是否位于由平面定义的剪辑坐标截锥体之外:

    -w < x < w
    -w < y < w
     0 < z < w

因此,如果您有p一个 vec3 点和一个模型-视图-投影矩阵M,那么在 GLSL 中它将如下所示:

    bool in_frustum(mat4 M, vec3 p) {
        vec4 Pclip = M * vec4(p, 1.);
        return abs(Pclip.x) < Pclip.w && 
               abs(Pclip.y) < Pclip.w && 
               0 < Pclip.z && 
               Pclip.z < Pclip.w;
    }
于 2011-06-13T23:48:46.243 回答
2

要确定给定点是否会在屏幕上可见,请对照视锥体对其进行测试。请参阅此截锥体剔除教程:

http://www.lighthouse3d.com/tutorials/view-frustum-culling/

于 2011-06-10T04:15:35.037 回答
2

对于任何依赖已接受答案的人来说,这是不正确的(至少在当前的实现中)。z 平面中的 OpenGL 剪辑与 x 和 y 相同,如 -w < z < w ( https://www.khronos.org/opengl/wiki/Vertex_Post-Processing )。

那么 z 的两个测试应该是: std::abs(Pclip.z) < Pclip.w

检查为零将排除所有比远场剪辑平面更靠近近场剪辑平面的绘制点。

于 2019-11-19T00:46:21.927 回答