如何在OpenGL中检查对象是否位于剪切卷之外?

时间:2011-06-10 01:30:34

标签: opengl clipping frustum

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

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

3 个答案:

答案 0 :(得分: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;
    }

答案 1 :(得分:2)

要确定屏幕上是否显示给定点,请根据viewing frustum对其进行测试。请参阅此截头剔除教程:

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

答案 2 :(得分:1)

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

z的两个测试应为:std :: abs(Pclip.z)

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