提取视图Frustum平面(Hartmann&Gribbs方法)

DAV*_*Vco 10 math 3d frustum culling occlusion-culling

我一直在努力解决Hartmann/Gribbs提取Frustum飞机一段时间的方法,但收效甚微.我想构建一个摄像机视图 - 视锥体来剔除我的场景.

我正在使用右手坐标系中的柱主矩阵.(OpenGL风格 - 我使用的是C#和Playstation Mobile,但数学应该是相同的)

我想让我的飞机进入World-Space,所以我从View-Projection Matrix(即projectionMatrix*viewMatrix)构建我的平截头体.视图矩阵与相机的世界变换相反.

问题是; 不管我调整什么,我似乎无法得到正确的截头.我想我可能会遗漏一些明显的东西.

如果我在俯视z轴时向左或向右"扫视"我的相机,我的平面的法线会发生变化,以至于它们总是指向场景的原点 - 这让我觉得它们不在世界空间中...

ide*_*n42 5

可以使用hartmann / gribbs方法提取投影矩阵中的平面,如下所示(主列):

void extract_planes_from_projmat(
        const float mat[4][4],
        float left[4], float right[4], float top[4], float bottom[4],
        float near[4], float far[4])
{   
    for (int i = 4; i--; ) left[i]      = mat[i][3] + mat[i][0];
    for (int i = 4; i--; ) right[i]     = mat[i][3] - mat[i][0]; 
    for (int i = 4; i--; ) bottom[i]    = mat[i][3] + mat[i][1];
    for (int i = 4; i--; ) top[i]       = mat[i][3] - mat[i][1];
    for (int i = 4; i--; ) near[i]      = mat[i][3] + mat[i][2];
    for (int i = 4; i--; ) far[i]       = mat[i][3] - mat[i][2];
}
Run Code Online (Sandbox Code Playgroud)

看到:

注意:如果矩阵分量未归一化,并且您需要使用Hessian法线形式平面,则需要归一化所得平面。