octreesまたはkd-treesのライブラリは何ですか?[閉まっている]


8

オブジェクトのインデックスを作成するための堅牢なパフォーマンスライブラリはありますか?

オブジェクトは、点で表されるのではなく、境界自体を持ちます。したがって、インデックスが固定サイズのパーティションに物を分割する場合、オブジェクトは複数のコンパートメントに存在する可能性があります。

それは、錐台の選別と、光線が当たったオブジェクトの訪問、および近傍検索が必要になります。

多くの場合、単純なCではなく代数としてコンポーネントパーツの数学を示す記事をたくさん見つけることができますが、それらをまとめたものは何もありません(おそらくOgreを除いて、PyOrgeはoctreeを公開していません)。確かに、趣味のゲームメーカーは、独自の部分インデックスを作成する必要はありませんか?

(私は自分の球球、球線、光線aabb、円錐aabb、円錐fustrum、abb fustrumおよびoctreeの実装を書いているところに座っています。確かに、より良い方法があります。つまり、誰かがすでにこれを行って、素敵なパッケージ?!?!)

(PythonまたはC / C ++ w /バインディングを推奨)

回答:


10

確かに趣味のゲームメーカーは、すべて独自のオクツリーを作成する必要はありませんか?

より大きなもの(Ogre、または別の物理/レンダリングエンジンなど)を使用していない限り、多くの人が使用しています。octreeは、実装するのがかなり簡単な構造であり、多くのトレードオフがあります。

  • オクツリーは邪魔にならないか?煩わしい場合は、キャッシュのパフォーマンスは向上しますが、構造が大きくなります。
  • 邪魔にならない場合は、ポインタまたは何らかの安全なハンドルを格納しますか?
  • フラットに格納されていますか、それとも子ポインタで格納されていますか?
  • それはどのようにタイプセーフですか?テンプレートを使用する場合、実行時のオーバーヘッドを最小限に抑えてはるかに安全になりますが、Pythonにバインドするのははるかに難しくなります。
  • 空間クエリを使用するすべてのoctreeには、ある種のベクトル/ポイント/レイタイプを含める必要があり、錐台カリングを使用するすべてのものには、錐台と行列数学ルーチンを含める必要があります。実際に使用している他のすべてのライブラリーから既にドラッグしたダースのマトリックス/ベクトルクラスにインターフェースするコードを書いているのは、必要な基本オクツリーを書いているだけの場合よりも作業が少ないですか?
  • スレッドセーフですか?

そうは言っても、オンラインには多くのoctree実装があります。そのうちの1つを取得することで多くの作業を節約できると想定しないでください。また、配列以外のデータ構造を作成するための1つの真の方法があると想定しないでください。


素晴らしい洞察力!それがKDツリーにとってどのようになっているのか、それらから見たものは、実装するのはかなり良いですが(考慮すべき多くの注意が必要な詳細があります)。たぶん誰かがこれについてもっと知っていますか?
Nef

kdツリーは実際に実装するのが難しいですか?それらは、特に絵を描くことなく、理由を理解するのが難しいと思います。なぜなら、ジオメトリをより直感的でない方法で分割するからです。しかし、基本的な構築/クエリアルゴリズムは、実際にはoctreeより長く、またはそれほど探索されていません。

2
Octreeは、実際には特別なケースのKDツリーです。固定位置分割平面を使用。KDツリーを実装するには、ノードごとに「最良の」軸分割オフセットを見つけるための何らかの方法が必要になります。

2

公平を期すために、リンクされたPython Octreeは2006年に投稿されたので、Python-OgreはこれまでにOctreeクラスを十分に公開している可能性があります。

しかし、Ogreのソースを見ると、2つのOctree実装が見Plugins/OctreeSceneManager/OgreOctree.hられPlugins/OctreeZone/OgreOctreeZoneOctree.hます。

あなたが公開する必要があるものを私に向けたら、私はそれを自分の手書きのPythonラッパーのtodoリストに追加します(これは、私のプロフィールにリンクされているbitbucketで利用できます)。

とにかく、頑張ってください。:D


それはとても親切なオファーです。私はエヘンすでに自分かかわらを書きました。
ウィル

1

「octree python」をグーグルするだけここにPython octree実装のコードが見つかりました。; D

これはライブラリーに依存しておらず(元々はPyOgre用に作成されました)、よくコメントされています。


純粋なPythonのoctreesで私が見つけた1つのことは、ツリートラバーサルの関数呼び出しの追加のオーバーヘッドがランタイムをすばやく支配し、リスト内の単純な検索よりも、純粋なPythonでとにかく処理できるオブジェクトの量が多くなることです。その特定の例も非常に最適化されていないように見えます。

これは、独自のoctreeを作成する場合に消化するのに適したコードですが、そのままでは、octreeには、質問で引用したすべての機能(たとえば、光線と錐台の交差)がありません。実際、最近傍検索すらありません。彼らがそのオクトツリーを何のために使うのか、もし彼らがデータを入れることができるが正確なポイント以外でそれをクエリすることができないなら?また、境界を持つものではなく、ポイントを保存します。これは、私がWebで見つけたすべてのpythonオクトリーを示しているため、これらの欠点をすべてリストします。多分他の人はグーグルでより完全なオクツリーを見つけることができますか?私はできません:(
ウィル

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