2

この単純な状況でビットマスキングがどのように機能するかを説明することは可能ですか?

 A big (blue) ball.    Contact BitMask 0b0001

 A medium (red) ball.  Contact BitMask 0b0010

 A small (white) ball. Contact BitMask 0b0100

どういうわけか、これはそれらの間でオフになっているため、それらの間に衝突はありません。衝突マスクを 32 ビット全体で 00 に設定していると思いますが、それは別の質問にしましょう。これらをオフにする方法はまだわかりません。

各ボールに固有のコンタクト ビット マスクを設定したら、ボールがコンタクトしたときにコンタクト情報を提供するにはどうすればよいでしょうか?

どの 2 つのボールが互いに接触したかを知るにはどうすればよいでしょうか?

特定のコンタクトで最大のボールだけがコンタクト情報を受信することは可能ですか?


アップデート:

私は必ずしもコードを求めているわけではありません。何が何で、どのように機能し、なぜ何が何をするのかを説明するコードが必要な場合は、コードを使用してください。

しかし、私が本当に求めているのは、ビットマスキングがどのように機能して、接触に「誰」が関与したかを判断できるロジックを提供する方法を理解することです。

ボールのサイズごとに異なるビットマスクを指定した理由は、2 つのボール間の特定の接触において、より大きなボールを決定するのに役立つと考えたからです。しかし、私はこれについて間違っている可能性があります。

更新 2:

進行中のプロセスの理解:

私が理解しているように、これらはプロセスの一部です。

  1. SKView をサブクラス化した SKScene を、物理ワールドの連絡先通知デリゲートに準拠するものとして登録します。それもそうだと言う。

  2. シミュレーションで知りたい、および/または制御したい身体的相互作用タイプの欲求の各タイプのカテゴリとしてビットマスクを設定します

  3. これらのビットマスクを使用して、それらを適切に適用することにより、接触や衝突の一部にすることが望まれる各オブジェクトの性質を明確にします (ここでは魔法のような意思決定が行われます)。

  4. デリゲートとして登録された同じ SKView サブクラスで、何かを行うコードで連絡先コールバックをオーバーライドします

  5. 誰/何が誰に連絡したかを判断する魔法のコードを作成します。


私はこれらのいくつかを理解していますが、連絡先ビットマスクの設定とカテゴリビットマスクの命名の理由の違いは理解していません。また、誰が誰に連絡したかを判断する方法も理解していません。

4

2 に答える 2

2

ほとんどすべての物理エンジンでは、衝突レイヤーはビット マスクで表されます。同じ衝突レイヤー内のすべてのオブジェクトが互いに衝突します。ビット マスクでは、各レイヤーがビットで表されます。位置 0 のビットがオンの場合、オブジェクトは、ビット マスクの同じ位置にビットがオンになっている他のオブジェクトと衝突します。

衝突をチェックしている間、物理エンジンのブロード フェーズ ルーチンは、衝突ビット マスクで少なくとも 1 つの共通ビットが 1 に設定されている、衝突の可能性があるペアのみを報告します。&このチェックは、2 つのビット マスクを ANDing ( ) することによって簡単に実行できます。上記のチェックでゼロ以外の結果が返された場合にのみ、衝突する可能性のあるペアがナロー フェーズ ルーチンに報告されます。

たとえば、青のボールを赤と白のボールの両方と衝突させたいが、赤と白のボールは互いに衝突させたくない場合は、ビット マスクを次のように設定します。

Blue  -> 0b0011
Red   -> 0b0001
White -> 0b0010

あなたの例では、どのボディにも衝突ビットマスクに共通のビットが設定されていないため、互いに衝突することはありません。上記の例では、赤と白のボールはビット マスクに共通のビットがないため、衝突しません。

すべての衝突ビット マスクを-1(すべてのビットをオンにする) に設定し、XOR によってマスクからビット/カテゴリを削除することができます。上記の例は、次の疑似コードによって実装されます。

blueBody.collisionMask = -1;
whiteBody.collisionMask = -1;
redBody.collisionMask = -1;

redBodyCategory   = 0b0001;
whiteBodyCategory = 0b0010;

whiteBody.collisionMask ^= redBodyCategory;
redBody.collisionMask ^= whiteBodyCategory;

私は SpriteKit を使用しませんが、この SO answerから取得した小さな情報から、contactTestBitmaskは接触時にイベントが発生するcollisionBitmaskカテゴリを設定し、 はボディが実際に衝突するカテゴリを設定します。したがって、 Blue ballを含む連絡先からのみ連絡先情報が必要な場合contactTestBitmaskは、上記の例のように を値に設定します。

どのボールが互いに衝突しているかを確認するには、ビット マスクの値を確認して、どれがどれであるかを判別する必要があります。body.contactTestBitmask == 0b0011上記の例では、青色のボールは、他のボディの場合などをチェックすることで認識できます。

余談ですが、 Unityのような適切なゲーム エンジンを使用すると、これらすべてがはるかに簡単になります。

于 2016-10-08T07:10:50.890 に答える