ゲームで衝突検出にoctreeを使用する場合は、フレームごとにツリーを再構築するか、オブジェクトの半分がフレーム内を移動すると仮定した方が良いでしょうか?フレームごとにオクトリーを再構築する必要がありますか?
答えて
フレームごとにシーンが変化する場合は、ツリーをやり直す必要があります。
シーンに静的ジオメトリがたくさんある場合は、別々のオクトツリーを作成することを検討してください。静的と非静的なジオメトリを区別するより複雑なリーフノードを持つことで、同じアイデアを表現することもできます。
ボトムライン:必要なものを再生します。
非常に動的なデータが1フレームごとに移動し、衝突検出を高速化する必要がある場合は、実際に固定3Dグリッドを使用することをお勧めします。 2次元の等価物は:
またようなので(同じグリッドセル内の次の要素へのインデックスのいずれかとしてnext
インデックスを利用して、一定時間の削除を可能にするフリーリストとして上倍増できますそれが削除された場合には無料のスタックからオフにポップするか、次の空き要素):
もう一つの例:
3次元では、爆発的なメモリが必要になるようです。しかし、このトリックは、各セルに32ビットのインデックスを配列に格納させるだけで、基本的には単一リンクインデックスリストとして機能します。これにより、各セルのサイズが32ビットに縮小されます。 100x100x100のグリッド(100万個のセル)を保存すると、4メガバイト未満になります。
要素が移動するときに、要素を占有しているセルから削除し、移動して新しいセルに挿入することができます。これを行うために必要なのは、ある種のセルから他のセルへ要素を転送するためのメモリ割り当て/割り当て解除なしの32ビットインデックスを操作することだけです。これはすべて一定の時間であり、あまりにも混雑したり、そのようなものになる木々の再平衡や分割を必要としません。
グリッドの階層を使用することもできます(これはオクトリーのように聞こえるかもしれませんが、異なる場合があります)。つまり、シーン内のメッシュオブジェクト全体に対して1つの粗いグリッドがあるかもしれません。次に、各メッシュオブジェクトは、その各部分に対して粗いグリッド、例えば、10x10x10を格納することができる。次に、各パーツはポリゴンごとに細かいグリッドまたはオクトリーを格納します。これは、例えばロボットのように回転している部品で剛体でない非メッシュを可能にし、ポリゴンの細かいグリッド/オクトリーを更新することを避け、それ自身の粗いグリッドのグリッドとワールドオブジェクトの粗いグリッドを更新するそれはその脚と腕を回転させ始める。オーガニックモデルのみが骨によって変形されると、細かいグリッドを更新する必要があります。
私はあなたの完全に静的な要素/フレームごとに更新する必要はありませんパーツと私は良い親和性のあるoctreeを使用したいと思います。おそらくキャッシュに優しいメモリアクセスのために後処理をします。一度構築されると、オクトリーが更新される必要がないと考えることができる場合、それらの検索を高速化し、メモリー使用を最小限に抑えるために、もう少し時間があります。
- 1. VBOを変更する必要がある場合、VAOを再構築する必要はありますか?
- 2. なぜMODIFY AUTO_INCREMENTはテーブルを再構築する必要がありますか?
- 3. RealmSwiftを再構築する必要があります。ダウンロードできるアップデートはありますか?
- 4. ウェブスパイダーを構築するときに、再帰を使用する必要がありますか?
- 5. 高速ソートデータグリッドアプリケーション(デスクトップクライアント)を構築する必要があります
- 6. エラー:HiveでSparkを構築する必要があります
- 7. NDKのバージョンをアップグレードすると、すべてのライブラリを再構築する必要がありますか?
- 8. TensorFlowのBazelとは何ですか?いつ再構築する必要がありますか?
- 9. コンテナを再構築して再起動する必要があります。ブラウザからリロードできない
- 10. Symfony2 - FOSUserBundle - ユーザー管理を再構築するためにFOSを使用する必要がありますか?
- 11. タイトルごとに要素を探す必要があります。
- 12. システムのアップデート後に依存するlibを再構築する必要がありますか?
- 13. dddデバッガ:exeはCygWin内に構築する必要がありますか?
- 14. 私はいつも私のプロジェクトを実行する前に再構築する必要があります
- 15. Python:QWidget:QPaintDeviceの前にQApplicationを構築する必要があります
- 16. QWidget:QPaintDeviceの前にQApplicationを構築する必要があります - SpyderのPyQt4
- 17. SQLはクエリを構築するのに役立つ必要があります
- 18. xcodeプロジェクトのURLを更新するには、アプリケーションを再構築する必要はありませんか?
- 19. 助けを必要とするPHPの配列を再構築
- 20. 要求ごとにcsrfトークンを含める必要がありますか?
- 21. SQL Server 2005 - インデックスをどのくらいの頻度で再構築する必要がありますか?
- 22. 単体テスト時にPOMファイルを更新した後に再構築する必要はありますか?
- 23. はすべての変更後にVS 2010で再構築する必要があります
- 24. すべてのプロジェクトまたはプロジェクトの一部を再構築する必要はありますか?
- 25. unordered_mapを構築するときにバケットカウント数を定義する必要がありますか?
- 26. 私はウィンドウce 4.1のアプリケーションを構築する必要があります
- 27. DFA(確定的有限オートマトン)を構築する必要があります
- 28. Xcodeプロジェクトファイルを再構築する方法はありますか?
- 29. Scene/ScreenごとにViewController.Swiftを作成する必要がありますか?
- 30. 画像ごとにサムファイルを作成する必要がありますか?
シーンがフレームごとに変化する場合は、ツリーを更新する必要があります。ツリー全体を常に「再実行」する必要はありません。私の実装は、オブジェクトが動くときに必要に応じて更新することができます。天気はあなたがそれをどうやって実装するかによって決まります。 – phkahler
redo == update;私はそれらを同義語と考える。しかし、あなたのポイントは正しい - それはあなたが変更された部分をマークするために汚い旗が必要なようなものです。 – duffymo