首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >边界框Frustum剔除的问题

边界框Frustum剔除的问题
EN

Stack Overflow用户
提问于 2011-06-10 05:54:39
回答 1查看 2K关注 0票数 3

我遇到了让正确的截锥剔除工作的问题。我从一个关于AABB点测试的人那里得到了一个很好的建议,它工作得很好,但我已经达到了一个点,最大点和最小点测试并不总是有效的,因为它们通常不会在截锥体中,而是来自一侧的平面。因此,我需要转移到全边界框检测。我已经有了检查边界框与平截体平面的代码,只需要设置边界框。

有没有人有关于如何做到这一点的代码示例或想法。我用来创建边界框的两个点是最小的x,y和z,以及最大的x,y和z。

谢谢!:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-06-21 01:36:21

你需要让凹凸的平面向内看(它们的法线必须指向中心)。然后,可以通过检查对象是否完全在阻挡的六个平面中的任何一个之外来完成渲染丢弃。您可以使用球体或AABB或任何其他可以计算到平面的距离(和边)的容器来执行此操作。

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

代码语言:javascript
复制
    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
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6299786

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档