边界框剔除问题

时间:2011-06-09 21:54:39

标签: c++ bounding-box frustum

我无法正确地进行截头剔除工作。我得到了一个关于AABB点测试的很好的建议并且它工作得很好但我已经达到了最大和最小点测试并不总是有效的地步,因为它们通常不会在平截头体中而是从一个平面双方将是。所以我需要进行完整的边界框检测。我已经有了检查边界框与平截头体平面的代码,只需要设置边界框。

是否有人有代码示例或有关如何执行此操作的想法。我创建边界框的两点是最小x y和z以及最大x y和z。

谢谢! :)

1 个答案:

答案 0 :(得分:1)

你需要让截头体的平面向内看(它们的法线必须指向中心)。然后可以通过检查对象是否完全位于截头体的六个平面中的任何一个之外来完成渲染丢弃。您可以使用球体或AABB,或任何其他容器来计算飞机的距离(和侧面)。

从我自己的平面代码(所以如果任何平面返回-1丢弃渲染),我添加了一些注释,以便更容易理解:

    int Side(const Sphere &e) const {
        float d=Distance(e.center);
        if(d-e.radius>Epsilon) return 1; // inside
        if(d+e.radius<-Epsilon) return -1; // outside
        return 0; // crossing the plane
    }

    int Side(const Vector3f &v) const { 
        float d=Distance(v);
        if(d>Epsilon) return 1;
        if(d<-Epsilon) return -1;
        return 0;
    }


    int Side(const Box3f &c) const {
        Vector3f a,b;
        if(Normal.x>=0.0)  { a.x=c.min.x; b.x=c.max.x; }
            else { b.x=c.min.x; a.x=c.max.x; }
        if(Normal.y>=0.0)  { a.y=c.min.y; b.y=c.max.y; }
            else { b.y=c.min.y; a.y=c.max.y; }
        if(Normal.z>=0.0)  { a.z=c.min.z; b.z=c.max.z; }
            else { b.z=c.min.z; a.z=c.max.z; }

        int l1 = Side(a), l2= Side(b);

        if(l1==l2) return l1; // both in the same side
        return 0; // we have the object crossing the plane
    }