3

正しいフラスタム カリングがうまく機能しません。AABB ポイント テストについて誰かから素晴らしい提案を得て、それはうまく機能しますが、最大ポイント テストと最小ポイント テストが常に機能するとは限らない点に到達しました。側面になります。したがって、完全なバウンディング ボックスの検出に進む必要があります。境界ボックスを錐台の平面に対してチェックするコードは既にあります。境界ボックスを設定するだけです。

これを行う方法について、コード例またはアイデアを持っている人はいますか。バウンディング ボックスを作成するための 2 つのポイントは、最小の xy と z と最大の xy と z です。

ありがとうございました!:)

4

1 に答える 1

1

錐台の平面を内側に向ける必要があります (法線は中心を指している必要があります)。次に、オブジェクトが錐台の 6 つの平面のいずれかの外側に完全にあるかどうかを確認することで、レンダリングの破棄を行うことができます。球、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
    }
于 2011-06-20T17:36:20.733 に答える