エンティティシステムでの衝突の検出と応答


12

ESでもっと楽しく...

現在、私はいくつかのシステムを持っています:

  • レンダラー(レンダリング可能属性、変換属性)
  • モーション(移動可能な属性、変換属性、レンダリング可能な属性[境界ボックスなど])
  • 入力(InputReceiver属性)

衝突検出を追加しています。最初に考えたのは、衝突を実行する新しいシステムを追加することでした。これは、から分離され、これを維持するために私には理にかなってMotionカメラ等、霧、 - -移動またはが必ずしもアニメーション化されていることではないすべてのものは、衝突検出に関与するのでシステムが、と思われるCollisionとはMotion相互に依存しています。

Motionエンティティを移動する場合、変換はで検証する必要がCollisionあり、移動はキャンセルまたは調整(バウンス、壁での停止など)する必要があります。

別の方法として、衝突オブジェクトへの参照を保持するCollidable属性を作成する方法があります-kd-tree、octreeなどは、互いに衝突する可能性のあるエンティティ間で共有されます。Motionシステムは、その属性をチェックし、確認したり、動きを調整するためにそれを使用します。

コードの観点から見ると、これは許容できる解決策です。ただし、ECSアーキテクチャの観点からMotionは、Movable属性を持つすべてのエンティティに適用されないロジックをシステムにプッシュしているようです。

私はまた、動きベクトルを格納することができMovable、属性、および持っているColliderシステムは調整しTransform、必要に応じて、それは間の機能の重複を伴うだろうMotionCollider、またはからのコールバックColliderへのMotionバウンス/反射などのための衝突場所と表面データに関するいくつかのデータを持ちます。

これは「特別なケースハック」という見出しに該当する可能性がありますが、大量のエッジケースコードを作成せずにこれを処理したことがある人から入力を受け取りたいと思います。

質問 モーションシステムと衝突システムがお互いの知識を必要とするように思われる場合、それらのシステム間の密結合を回避する良い方法は何ですか?


1
質問は何ですか?
-jcora

@Baneは、衝突検出ロジックを配置し、衝突+移動を可能な限り分離し、システム間の相互依存関係を最小限に抑えるのに適した場所です。私の投稿はちょっとした
取り乱しでした...-3Dave

1
さて、質問にそれを太字で記入してください。:)
jcora

回答:


7

難しく考えすぎだよ。エンティティコンポーネントシステムも使用する私のエンジンでは、すべてGameObjectがへのポインターを持つことができますModuleCollision

ゲームが更新されるとどうなりますか:

  • シーンは、保持しているすべてのオブジェクトを更新します。それを呼び出しますUpdateそれぞれ関数をGameObject
  • Update関数内では、それぞれが速度と方向GameObject のみを更新し、位置更新しません
  • GameObject現在の位置、速度、方向をにアップロードしModuleCollisionます(利用可能な場合)。
  • シーンは、ModuleCollisionベースで衝突チェックを行います。
  • シーンは、UpdatePostそれぞれの関数を呼び出しますGameObject。オブジェクトに衝突モジュールがある場合、衝突モジュールから更新された位置、速度、および方向を取得します。位置は、速度と方向で更新されます。
  • GameObjectその位置と方位のうち最終の3×3行列を構築します。

はい、状態のいくつかの重複がありますが、それは大丈夫です。衝突処理を行うのModuleCollisionが最善の方法です。そうしないとGameObjectModuleCollisionハンドルを持っているかどうかをそれぞれ確認する必要があります。


2
したがって、衝突の場合にバックトラッキング位置を心配するのではなく、速度/加速度を平行移動から分割し、検出された衝突に基づいてそれらを変更し、それらの変更は同じフレーム内の2番目の特別な更新で伝播されますか?かなりきれいに見えます。ありがとう。
-3Dave

3

私はこのようにします...

3つのシステムがあります。

  1. ムーブメントシステム
  2. 加速システム
  3. 衝突システム

移動システムは、位置に速度を適用します。加速システムは速度に力を適用します。衝突システムは衝突を検出し、正しい方向に力を適用します。また、粗雑な衝突が必要な場合は、速度を直接変更します。

たとえば、atan2を使用して衝突間の角度を計算できますそれを使用して正しい力/速度をボディに適用できます。

必要に応じて、衝突検出システムにメッセージをブロードキャストさせる。

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