私はかなり長い間Farseerを使用しており、物理教育プラットフォームプロジェクトに取り組んでいます。私の脳内のエンジンについては、かなり長い間答えられていない質問がいくつかあります。その多くは、エンジンの衝突処理に関するものです。
Farseerに適切なAPIがないこともあり、多くの人がエンジンの動作を理解するのに問題があるようです。知っている人は、次の概念を確認し、間違っている概念をすべて削除することをお勧めします。
コンセプト0:2つの段階
Farseerでの衝突は、次の2つの段階に分けられます。
- ブロードフェーズ衝突
- 正確な衝突(別の正式な名前がある場合は、私の用語の使用を修正してください...)
コンセプト1:ブロードフェーズ
Farseerは、広い位相の衝突を使用して、シーン内の潜在的な衝突を検出します。上記の広相衝突試験は、以下によって行われる。
パッケージ「Farseer.Collision」にある四分木を使用します。
クラス「Farseer.Dynamics.World」には、「Farseer.Collision.QuadTreeBroadphase」への参照があります。
「Farseer.Collision.QuadTreeBroadphase」には「Farseer.Collision.QuadTree」への参照があります。
さらにバウンディングボックステストも行われます。
フィクスチャのどのペアが衝突する可能性があるかを知る必要がある場合は、これを行うことができます...
/* Game.Initialize */ public override void Initialize() { OtherIrrelevantInitCode(); _world.OnBroadphaseCollision += BroadphaseHandler; base.Initialize(); } public void BroadphaseHandler(ref FixtureProxy fp1, ref FixtureProxy fp2) { // code to read about fp1 and fp2 }
しかしその後...
小さな質問1
どのフィクスチャのペアが衝突する可能性があるかを知ることが役立つ一般的な状況のいくつかは何ですか?
コンセプト2:イベントの意味
2つのキーワードの定義:
- 触れる:2つのオブジェクトが接触しています。配列Manifold.Pointsは空ではありません。
- 衝突:2つのオブジェクトが初めて接触します。
BeforeCollisionは、2つのオブジェクトが衝突しておらず、接触していないことを意味します。
OnCollisionは、2つのオブジェクトが衝突していることを意味しますが、触れてもこのイベントは発生しません。
AfterCollisionは、2つのオブジェクトが衝突していたことを意味しますが、現在は接触しているだけです。
OnSeparationは、2つのオブジェクトが接触していたことを意味しますが、現在は接触していません。
コンセプト3:イベントの使用
ブロードフェーズ衝突試験と精密衝突試験は常に実施されます。
OnCollisionイベントでfalseを返すか、IgnoreCollisionメソッドを使用すると、正確な衝突を無効にできます。
人々が「OnCollisionを空のままにしてtrueに戻すだけ」と言うのを何度も聞いたことがあります。一体どういう意味ですか?イベントを使用するということは、上記のイベントが発生したときに、追加の効果(たとえば、敵を倒す、スコアを付ける、サウンドを再生するなど)を適用したいということです。