オクツリーの境界ボックス


9

八分木は、錐台カリングや3Dの衝突検出などによく使用されます。しかし、アルゴリズムがどのように機能するのかまったくわかりません。バウンディングボックスを使用しようとすると、octreeの原則全体が壊れます。これは、特定のボックスが1つのノードに格納されていても、実際には別のノードが表すスペースと重なっている可能性があるためです。さらに、これがポイントではなくバウンディングボックスをルックアップする場合にどのように機能するかはわかりません。これも、実質的にすべてのノードのルックアップが行き詰まり、目的が果たせなくなる可能性があるためです。

では、いったいどのようにoctreesは境界ボックスに対処するのでしょうか?

回答:


12

AN オクツリー(3D)は、同じ概念を使用して四分木(2D)。クワッドツリーに関するウィキペディアの記事を読んで理解すれば、同じ概念を3Dに適用できるはずです。

これらのツリーはどちらも、エリアベースのルックアップを使用して、特定のエリアにあるオブジェクトを把握するために必要な比較の数を大幅に減らすことができます。これは、ゲームによっては、vis-cullingや衝突の場合にも役立ちます。

基本概念は、ワールドスペースが「バケット」に分割されるというものです。2Dの場合は正方形、3Dの場合は立方体です。空の世界では、世界全体をカバーする単一の正方形または立方体のバケットから始めます。オブジェクトをワールドに追加するときは、ルートノードから始めて、オブジェクトの場所とサイズに基づいてツリーに移動します。宛先バケットが容量に達した場合は、正方形を4つの小さな正方形(クワッドツリー)に分割するか、キューブを8つの小さなキューブ(オクツリー)に分割して、バケットを細分割します。ワールドに追加する各オブジェクトは、バケットの境界内に物理的に完全に収まるのと同じくらいツリーの奥にのみ挿入されます。オブジェクトが現在のバケットの境界内に収まらない場合は、オブジェクトを完全に収まる最小の親バケットに移動する必要があります。

あなたの世界に多くのオブジェクトがない場合、QuadtreeまたはOctreeのいずれかを使用するのはやり過ぎです。両方のオープンソースソリューションもあります。


彼はそれを知っていると思います。混乱は、サブディビジョンにうまく収まらないボリュームを処理する方法に関するものだと思います。
ClassicThunder

2
「オブジェクトが境界内に収まらない場合は、1つ上のレイヤーに格納する必要があります」と述べました。また、2番目の文に基づいて、OPが一般的にどのように機能するかについてOPが少し混乱しているようにも思えました。
ジョンマクドナルド

これは、オクツリーの基本的な制約に違反していませんか?つまり、各ノードには7つ以下しかありません。
DeadMG 2012年

つまり、境界に沿って配置されているN個のオブジェクトがある場合、O(N)チェックを見て、それぞれのオブジェクトをチェックします。
DeadMG

@ DeadMG、Eight(Octagon、Octaneなど)のような「10月」。ルートノードが分割されると、子ノードは8つになります。つまり、ノースイーストアップ、ノースイーストダウン、NWU、NWD、SEU、SED、SWU、SWDで、合計9つのノードを含みます。ルート。これらの子ノードの1つが分割されると、そのノードにも8つのサブノードがあり、以前のように各象限に1つずつ、合計で8 + 8 + 1 = 17ノードになります。すべてのオブジェクトがルートノードの境界にぴったり収まり、8つの象限のいずれにも収まらない場合、はい、それはO(N)であり、すべてのオブジェクトに対してチェックする必要があり、すべてを保存することはできません。比較すると、実際にはコストが発生します。
ジョンマクドナルド

3

nツリーは最も有名ですが、利用可能な空間分割システムはこれだけではありません。他にもたくさんあります。あなたが持っているデータについてのもう少し多くの情報は、最良の選択を見つけるのに長い道のりを行くでしょう。ボックスのサイズが変わったり、動き回ったりしますか?彼らはどのくらいの大きさですか?いくつありますか?挿入/削除はたくさんありますか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.