c++ - 边界框视锥体剔除的问题

标签 c++ bounding-box frustum

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

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

谢谢! :)

最佳答案

您需要让平截头体的平面向内看(它们的法线必须指向中心)。然后可以通过检查对象是否完全位于截头体的六个平面中的任何一个平面之外来完成渲染丢弃。您可以使用球体或 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
    }

关于c++ - 边界框视锥体剔除的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6299786/

相关文章:

algorithm - 寻找平截头体的最小包围球

Unity 3D 中的相机视锥体平面

opengl-es - 是否也渲染了 OpenGL ES Frustum 之外的几何图形?

c++ - 如何在运行时设置列表的类型?

ios - 如何检查边界框是否包含我的观点

c++ - 使用 C++ 逐行读取字符串

python - 给定经纬度和距离,我想找到一个边界框

python - 基于分类的车辆计数(汽车、公共(public)汽车、卡车)

c++ - 析构函数总是命中 Null

c++ - 创建具有自动值增量的定义头文件