14

私は現在、物理エンジン(趣味のプロジェクト)用のKDTreeを書いています。

KDTreeにはポイントが含まれていません。代わりに、環境内のさまざまなオブジェクトをバインドするAxisAlignedバウンディングボックスが含まれています。

私の問題は、KDTreeノードがいっぱいになったときに分割する方法を決定することです。私は2つの方法を試しています:

方法1:ノードを常に最大軸上で正確に半分に分割します。

  • これには、かなり等間隔に配置されたツリーという利点があります。
  • 大きな欠点:オブジェクトがノードの小さな領域に集中している場合、冗長なサブディビジョンが作成されます。これは、すべてのボリュームが正確に半分に分割されているためです。

方法2:オブジェクトを含むノードの領域を見つけます。最大軸上でその領域を半分に分割する平面上でノードを分割します。例-すべてのオブジェクトがノードの下部に集中している場合、オブジェクトは縦方向に分割され、それによって下部が2つに分割されます。

  • これにより、上記の方法の問題が解決します
  • 同じ平面上に存在するもの(たとえば地形)にインデックスを付けると、長くて狭いノードが作成されます。同じ平面上にない他のオブジェクトを後で追加する場合、これらの細長いノードは非常に貧弱なインデックスを提供します。

したがって、ここで探しているのは、KDツリーノードを分割するためのより良い方法です。これが物理エンジンになることを考えると、決定はリアルタイムで行われるのに十分単純である必要があります。

4

2 に答える 2

24

「表面積ヒューリスティック」(SAH)は、少なくともレイトレーシングコミュニティ内でkdツリーを構築するための最良の分割方法と見なされています。アイデアは、各子のオブジェクトの数で重み付けされた2つの子スペースの表面積が等しくなるように平面を追加することです。

この主題に関する良い参考資料は、Ingo Waldの論文、特に7.3章「高品質のBSP構築」であり、これはSAHを私よりもよく説明しています。

現時点では適切なリンクを見つけることができませんが、「ビン化された」SAHに関する論文を探す必要があります。これは、真のSAHの近似値ですが、はるかに高速です。

とはいえ、最近では、バウンディングボリューム階層(BVH)、別名AABBツリーの方がkdツリーよりもはるかに人気があるようです。繰り返しになりますが、Ingo Waldの出版ページは、おそらく「SAHベースのバウンディングボリューム階層の高速構築について」の論文を読んでからしばらく経っていますが、良い出発点です。

OMPFフォーラムは、この種のことを議論するのに適した場所でもあります。

お役に立てば幸いです。幸運を!

于 2011-01-08T09:57:16.127 に答える
4

確かに、前提が多くの移動するジオメトリである物理エンジンの場合、bvhがおそらくより良い選択です。それらはそれほど速く移動しませんが、構築がはるかに速く、フレームごとに再フィット/再構築するのがはるかに簡単です。フレームベースであり、多くの場合、すべてのフレームを完全に再構築する必要はありません(一連のフレームで並行して実行できるもので、その間に再調整されたbvhで十分ですが、これもwaldを参照してください)。

物理学におけるこれの例外は、粒子や光子などのボリュームを持たないエンティティを扱っている場合です。kdツリーの構築は、個々のプリミティブの境界を解決する必要がないという事実によって単純化されます。 。それは本当にアプリケーションに依存します。優れた物理エンジンは、空間加速構造のバランスの取れた組み合わせを使用する必要があります。たとえば、浅い八分木でより広い位相分割を解決してから、実行していることの性質により適した別のスキームでリーフノードを拡張するのが一般的な方法です。BSPは静的ジオメトリ、特に2Dで、構造が変更されていない場合は、さまざまなスキームや構造を試して、それらがいつどのように最適に機能するかを確認するのが最善の方法です。

于 2013-10-07T18:36:00.533 に答える