当Bounding Box真的很大时,挫败剔除

时间:2012-02-08 04:32:31

标签: 3d frustum culling

see

当边界框的所有8个顶点都在平截头体外侧时,它将不会被渲染。 但如果发生了如上所示。该对象应该在显示列表中。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

因为你正在计算交集,就好像盒子是一堆点,而不是一堆线。这就是我在伪代码中的表现:

inter = Inside
for ( plane : frustum ) {
    verts[2] = findOpposingPointsMostPerpendicularToPlane( box, plane )
    near = plane.signedDistance( verts[0] ) > 0.0
    far = plane.signedDistance( verts[1] ) > 0.0

    if ( !near && !far )
        inter = Outside
        break
    else ( near ^ far )
        inter = Intersecting
}

如果您的盒子是AABB,则为findOpposingPointsMostPerpendicularToPlane()创建一个顶点索引的静态数组,然后使用平面法线组件的符号映射到它们。

答案 1 :(得分:0)

计算bbox中的边界球并检查6个平截头体平面中每一个的中心距离。如果其中一个小于球体半径,则在显示列表中包含您的对象。