最近、バイナリ空間分割ツリーと、3Dグラフィックスおよび衝突検出への応用について学びました。また、4分木と8分木に関連する資料を簡単に確認しました。 bspツリー上でquadtreeを使用する場合、またはその逆の場合それらは交換可能ですか?次のような表に記入するのに十分な情報があれば満足です。
| BSP | Quadtree | Octree
------------+----------------+-------
Situation A | X | |
Situation B | | X |
Situation C | | | X
A、B、Cとは何ですか?
あなたの質問に対する明確な答えはありません。データの編成方法に完全に依存します。
心に留めておくべきこと:
クアッドツリーは、ナビゲーションシステムのマップレンダリングのようにほとんどが2次元のデータに最適です。この場合、ジオメトリによりよく適応し、ノード構造を小さく保つため、octreesよりも高速です。
データが3次元の場合、オクトリーとBVH(境界ボリューム階層)が役立ちます。また、ジオメトリエンティティが3D空間にクラスター化されている場合にも非常に効果的です。 ( Octree vs BVH を参照)(からアーカイブ オリジナル)
Oc-およびQuadtreeの利点は、いつでもツリーの生成を停止できることです。グラフィックアクセラレータを使用してグラフィックをレンダリングする場合は、オブジェクトレベルでツリーを生成し、各オブジェクトを1回の描画呼び出しでグラフィックAPIに送信できます。これは、個々の三角形を送信するよりもmuch実行します(BSPツリーを最大限に使用する場合に必要なこと)。
BSPツリーは本当に特別なケースです。それらは2Dおよび3Dで非常にうまく機能しますが、優れたBSPツリーを生成することはそれ自体が芸術です。 BSPツリーには、ジオメトリを小さな断片に分割する必要があるという欠点があります。これにより、データセットの全体的なポリゴン数が増加する可能性があります。レンダリングには適していますが、衝突検出とレイトレーシングにははるかに優れています。
BSPツリーの優れた特性は、ポリゴンスープを、実際の並べ替えを行わずに任意のカメラ位置から完全に前後に(そしてその逆に)レンダリングできる構造に分解することです。各視点からの順序はデータ構造の一部であり、BSPツリーのコンパイル中に行われます。
ちなみに、それが10年前に人気があった理由です。 Quakeは、グラフィックエンジン/ソフトウェアラスタライザーが高価なzバッファーを使用できないようにするためにそれらを使用しました。
記載されているすべてのツリーは、ツリーのファミリーです。ゆるい八分木、kd木、ハイブリッド木、その他多くの関連する構造もあります。
BSP-Treeと他の種類の3d-treeの最大の実際的な違いは、BSP-Treeはより最適ですが、staticジオメトリでのみ機能することです。これは、BSPツリーの構築が一般に非常に遅く、通常の静的な都市型ゲームレベルでは数時間または数日かかることが多いためです。
BSPツリーの構築に時間がかかる2つの主な理由は、(a)最適な検索に時間がかかる非軸に沿った分割面を使用すること、および(b)軸の境界でジオメトリを再分割し、分割面を横切るオブジェクトがないことを保証することです。
他のタイプの3Dツリー(Octrees、Quadtrees、kd-tree、Bounding-Volume-Hierarchy)は軸に揃えられたバウンディングボリュームを使用し、ボリュームは(オプションで)オーバーラップが許可されているため、含まれるオブジェクトをボリューム上でカットする必要はありません境界。これらは両方とも、BSPツリーよりもツリーの最適性を低くしますが、動的オブジェクトの場合は構築が速く、変更が容易です。
これらの要因を状況に外挿する...
通常、屋外エリアでは、単純なハイトマップまたはROAMなどのより複雑なジオミップマッピング技術のいずれかである、高さフィールドベースの地上表現を使用します。地面自体は3D空間分割に関与せず、地面に置かれたオブジェクトのみが関与します。
より単純で類似したジオメトリ(家、木、小惑星など)のインスタンスが多数ある世界では、ジオメトリをBSPツリーに入れると、BSPツリーに複製して分割することになるため、非BSPツリー(BVHなど)を使用することがよくあります。すべてのインスタンスの詳細ジオメトリ。
逆に、都市のシーンや複雑な屋内環境など、インスタンス化されていない大きなカスタム静的メッシュは、通常、実行時のパフォーマンスを向上させるためにBSPツリーを使用します。 BSPツリーは事前編成された三角形レンダリングバッチとして使用できるため、BSPツリーがノード境界でジオメトリを分割するという事実は、レンダリングパフォーマンスに役立ちます。 BSPツリーは、オクルージョン用に最適化することもでき、他のジオメトリの背後にあることがわかっているBSPツリーの一部を描画する必要がなくなります。
参照: Octree vs BVH (アーカイブ済み オリジナル)、 境界ボリューム階層チュートリアル 、 BSPチュートリアル 。
BSPは都市環境に最適です。
Quadtreeは、地形などに高さマップを使用する場合に最適です。
オクトリーは、太陽系などの3D空間にジオメトリの塊がある場合に最適です。
BSPは、使用するフレーバーに応じて、衝突検出を加速するための適切なオプションです。それらは、ポイントテスト、ラインテスト、またはレイテストで特に高速ですが、ボリュームのあるものではやや遅く、少し複雑です。
グラフィックスでの使用に関しては、BSPはほとんど使用されていません。 Octreesは、AABBツリーと同様に、全体的な可視性のカリングなどに適しています。
通常、これらのものには明確な答えはありません。 A、B、およびCは、スペースのサイズと差別化するものの量の関数の結果であることをお勧めします。
BSPは、オクルージョンのみを行いたい、より小さくシンプルなスペースに適しています。特定のレイのすべての交差点が必要な場合は、クワッド/オクツリーにアップグレードする必要があります。
クアッドツリーとオクトツリーの場合-いくつのディメンションが重要ですか? 2次元はクワッドツリー、4次元はオクツリーを意味します。前述のように、quadtreeは3空間で機能しますが、各ディメンションに適切な処理を施したい場合は、octreeが最適です。
BSPの経験はあまりありませんが、レンダリングするシーンの背が高い場合は、クアッドツリーよりもオクトツリーを使用する必要があります。つまり、高さは幅と深さの半分以上であり、経験則はほとんどありません。一般に、octreeはquadtreeよりも大きなコストをかけず、適切な速度を実現する可能性があります。 YMMV。