2017-05-02 8 views
6

私は、単純な細長い3dメッシュを含む3d空間に何千ものOOBB(オブジェクト指向バウンディングボックス)を持っています。彼らはしっかりと一緒に詰め込まれています。緊密なOOBBグループに対してレイ交差を迅速にテストするにはどうすればよいですか?

私はそれらに光線を吹き込み、どのOOBBがヒットするのか把握したいと思います。私が実行する必要のあるレイ交差テストの数(数百万)のために、すべてのOOBBに対するブルートフォースアプローチでは十分ではありません。

元来、ある種の空間分割システムを使用して潜在的な結果を素早く絞り込むことは簡単だと思っていましたが、BVHsやKDTreesのようなシステムはAABB(軸合わせバウンディングボックス) (私のしっかりと詰め込まれたOOBBの多くが、それらが網羅するメッシュの対角線の性質のため、おおよそ同じAABBを有するので、非常に非効率的である)。

RAPIDライブラリのOBBTreesについては読んでいますが、上から下に向かって構築されているようです(ポリゴンスープで始まり、徐々に小さなOOBBグループに細分されています)。たくさんのOOBBがあり、そこから木をつくる)。

交差テストの高速化に使用できる他のデータ構造はありますか?

ここに私のOOBBの写真があります。あなたが見ることができるように、彼らはしっかりと詰め込まれていて、AABBの外観を想像することができれば、AABBベースのツリーが実際にパフォーマンスを向上させない点に重なることが分かります(なぜなら、グループの中心を通る射撃によって打撃を受けるだろう)。

最初の/最も近いものだけでなく、レイでヒットしたすべてのOOBBを照会する必要があることは注目に値します。

OOBBs

+1

ほとんどのbbsがaabbsに近く、その新しい空間で何らかの種類の空間分割アルゴリズムを使用するいくつかの領域に光線を回転させてみてください。線形変換を除いてオブジェクトがレイからレイトに変化しない場合に適用される別のソリューション:各セルが三角形/楕円形の交点のリストを持つ3D配列を生成し、その3Dアレイ。 – programmerjake

+0

シーンはどのようにダイナミックですか?つまり、OOBBが変更されるまでどのくらい光線を投射し、どれほど大幅に変化するでしょうか? – Angew

+0

@programmerjake残念ながら、最初の提案は機能しません。OOBBが私のサンプルイメージのようにうまく整列されないからです。 2番目のオプションはもっと近くにあるかもしれませんが、メモリのフットプリントと前処理の必要性は問題になる可能性があります...私は3Dアレイが実現できない非常に大きな3D環境で作業するためのソリューションが必要です(合理的な粒度を維持しながらすべてを含めるには何十億ものセルが必要です)。しかし、提案に感謝します。 – Tyson

答えて

1

おそらく最高はgrid structureを揃え、3D軸を使用することです。グリッド内の各セルは、そのセルと交差するすべてのoobbのベクトル(ベクトル、配列など)を保持します。 8つの空のセルをより大きな空のセルに畳み込んで、空のトラバースを高速化することができます。グリッドのサイズについては、最適なサイズを見つけるためにいくつかのテストを行う必要があります。

グリッドを巡回するのは簡単ではありません。レイの原点から最も近いセルから始めて、すべてのオブジェクトをテストし、レイに沿って次のセルに移動する必要があります。セルをトラバースすることは、基本的には複雑な3次元の控えめなラインラスタライズです。データは非常に重なっている場合にhere


の詳細はまた、あなたは(細胞が非常に小さい)大きなグリッドを持っている場合があります。この場合は、グリッドデータを保存するためにを調べるようアドバイスします。 (z-order curveは驚くほど単純です)

関連する問題