現在、物理エンジン(Hobbyプロジェクト)用のKDTreeを作成しています。KDTree分割
KDTreeにはポイントが含まれていません。 代わりに、環境内のさまざまなオブジェクトをバインドするAxis Alignedバウンディングボックスが含まれています。
私の問題は、KDTreeノードがフルになったときに分割する方法を決めることです。 私は2つの方法を試しています:
方法1:ノードを常に最大軸の半分に分割します。
- これは、かなり均等に間隔を置いたツリーの利点があります。
- 大きな欠点:オブジェクトがノードの小さな領域に集中していると、冗長なサブディビジョンが作成されます。これは、すべてのボリュームが正確に半分に分割されているためです。
方法2:オブジェクトを含むノードの領域を見つけます。その領域を半分に分割する平面上のノードを、その最大軸上で分割します。例 - すべてのオブジェクトがノードの底に集中している場合、長さ方向に分割して底を2つに分割します。
- これは、それが細長いノードを作成
- 同じ平面(例えば地形)上に存在するものをインデックス上記の方法で問題を解決します。同じ平面上にない他のオブジェクトを後で追加する場合、これらの細長いノードはインデックス作成が非常に貧弱です。
私がここで探しているのは、私のKD-Treeノードを分割するより良い方法です。 これが物理エンジンになることを考慮すると、決定はリアルタイムで作成するのに十分シンプルである必要があります。
あなたが言及した「ビン化された」SAH論文は、Hunt、Mark、and Stollの「適応的なエラーに縛られたヒューリスティックを持つ高速kd-tree構築」かもしれません。この論文の中核となるアイデアは、それを知的にサンプリングすることによって、真のSAH関数に対する区分的二次近似を使用することです。私の経験上、これは高速で効果的なアルゴリズムです。 – vedantk
ええ、それはそのように見えます。 – celion