1

私はPythonでBlender用のこのパーティクルエンジンに取り組み始めています:http ://www.youtube.com/watch?v = uoK4QV3jg58&feature = channel_video_title

すべてのデータは私のスクリプトによって処理されます。Blenderはビジュアルのためだけにあります。今のところ、私の問題は、上のビデオで、すべてのパーティクルの各パーティクル間の距離を計算して、それらが互いに衝突しているかどうかを検出することです。

私はについて読み始めています:

  • 八分木
  • kdTree
  • BVHTree
  • AABBtree
  • ...などなど

Kdtreeは、最も近いネイバーを検索するのに非常に効率的であるように見えますが、静的クラウドのみを検索します。私のパーティクルは常に移動するため、反復ごとにkdTreeを再生成する必要があり、多くのプロセスを消費すると思います。私は多くのゲームがAABBツリーを使用していることを読みました。少し迷ってしまいました…何を選べばいいのかわかりません。私が欲しいのは:

  • 非常に大量の粒子(25万以上)間の衝突を検出します
  • リアルタイムである必要はありません(とにかく250000個のパーティクルでは実際には不可能です)。200万個のパーティクルに対してフレームあたり20分は私にとって問題ではありません。
  • 私の粒子は常に球です
  • パーティクルとポリゴンオブジェクト間の衝突を検出します
  • 必要な距離計算を減らすためのアルゴリズム(遠くにある場合でも、互いにすべてのパーティクルまたはポリゴンを計算するなどの回避)
  • パーティクルは動的であり、ポリゴンオブジェクトは動的または静的にすることができます。

誰かが私に最良の推測が何であるか、そして私がPythonのドキュメントとその例をどこで見つけることができるかを教えてくれるなら。

4

1 に答える 1

0

「すべてが動的」である場合、検索が高速で挿入が低速なデータ構造の利点が失われます。

理想的には、実行時間を単純化するために、データ内に何らかの構造を見つけることができます。おそらく、移動するポリゴンはすべて同じ方向に移動するため、それらを参照フレームとして使用して、効果的に静的にすることができます。おそらく動きは小さいので、パスごとにゼロから再構築するのではなく、データ構造をその場で更新できます。または、パーティクルとポリゴンの動きが小さな近傍に限定されるため、計算上扱いにくい大きな問題をより小さな問題に減らすことができます。

追加の制約なしで「すべてが動く」と言うのは、データが反復ごとに完全にランダムであると言うのと同じです。したがって、問題の鍵は、前の反復からの計算が再利用可能かどうかを識別することです。これにより、適切なデータ構造とアルゴリズムが決まります。

于 2011-11-24T17:44:48.850 に答える