0

短いintベースのマスクはC++でどのように機能しますか(たとえば、Bulletのマスク)?

弾丸を見る

CollisionFilterGroups { 
  DefaultFilter = 1, 
  StaticFilter = 2, 
  KinematicFilter = 4, 
  DebrisFilter = 8, 
  SensorTrigger = 16, 
  CharacterFilter = 32, 
  AllFilter = -1 
}

そして、すべての値が2度であることを確認し、私はそれを知っています:

shortは、格納に2バイトかかり、-32,768〜+32,767の符号付き整数です。

しかし、自分のグループを作成する方法:マスクの交差を計算する方法は?

たとえば、CollisionFilterGroupsに加えて次のようなものを作成する方法:

MyCollisionFilterGroups { 
  Cubes= ?,
  Boxes= ?, 
  Spheres= ?
}

どこ

  • 「飛行機」が「飛行機」、「ボックス」、「球」と衝突しないようにします(「参照」)。
  • 「ボックス」を他の「ボックス」や「球」と衝突させたい
  • 「球」は「球」と衝突せず、「ボックス」と衝突させたい
4

3 に答える 3

2

基本的に、それが2の累乗である場合、つまり、バイナリ表現の場合よりも1ビットが1つだけで、残りは0です。たとえば、1 = 1、2 = 10、4 = 100、8 = 1000、16 = 10000など。ここで、a = 1、b = 2、c = 4、d = 8、e = 16、f = 32としましょう。数値があり、aとeがあるかどうかを確認したい場合は、次のようなマスクを作成します。 :a | b(または)...これにより、10001のバイナリ表現になります。

aとeをテストする数をXとしましょう。次のステートメントは、Xにaとeが含まれている場合にのみ当てはまります。X&(a | e)== X、つまりXであり、(aまたはe)はXに等しい。

最初の例では、Xは11001であり、これにはaとeが含まれています。11001と10001は10001になるので、それは本当です。したがって、Xにはaとeが含まれていることがわかります。

2番目の例:Xは100111です。つまり、aは含まれていますが、eは含まれていません。a | e(10001)を使用して「and」を実行すると、結果は000001になりますが、これはXと等しくないため、Xには含まれません。

ここで初期化するために、数値にa、c、eを含める場合は、次のように記述します。X = a | c | e

それはすべて、数値の2進表現に帰着します。あなたが書いた例では、-1もあります。これは、バイナリ表現では1111..11であり、すべてをカバーしていることを意味します。

お役に立てれば

于 2012-11-05T13:04:49.143 に答える
1

あなたの質問は明確ではありませんが、シミュレーションでオブジェクトのカテゴリとマスクビットを設定しようとしていると思います。

MyCollisionFilterGroups { 
    Plane= 64,
    Box= 128, 
   Sphere= 256
}

平面、カテゴリビット=平面、マスク= 0

ボックス、カテゴリビット=ボックス、マスク=ボックス+球(またはボックス|球)

球、カテゴリビット=球、マスク=ボックス

簡単に言うと、フィルターグループごとに2の累乗を作成し、各オブジェクトのカテゴリマスクをグループ列挙型に設定し、そのマスクを衝突させたいオブジェクトタイプの列挙型に設定します(または0と衝突する場合は0)。 。

于 2012-11-05T20:52:08.873 に答える
0

Bullet固有がどのように機能するかはわかりませんが、アイデアは次のとおりです。

各オブジェクトには、衝突グループフラグと衝突マスクがあります。衝突グループは、オブジェクト(オブジェクトの種類)の分類子です。衝突マスクは、オブジェクトが衝突するすべてのグループ(分類子)です(通常、0xffffで始まり、すべてと衝突することを意味します)

衝突テストでは、次のようになります。

if( obj->group & otherObj->mask
    &&
    obj->mask & otherObj->group )
 ..check collision..

新しいグループを作成したい場合(弾丸がどのように機能するか、これを許可するかはわかりません)、1ビットだけを設定して作成しますが、まだ設定されていません(投稿に表示されているグループ)。 ints、混乱しています、私はビットシフトを好みます:

DefaultFilter = 1 equals (1<<0)
StaticFilter = 2, equals (1<<1)
KinematicFilter = 4, equals (1<<2)
DebrisFilter = 8, equals (1<<3)
SensorTrigger = 16, equals (1<<4)
CharacterFilter = 32, equals (1<<5)
AnewGroup_Box = (1<<6),
AnewGroup_Sphere = (1<<7)

ショートのビット数まで(ほとんどの場合16ビット)。オブジェクト(グループではない)が衝突するグループを設定するには、マスク内のグループを組み合わせるだけです。

myObj->mask = AnewGroup_Box | StaticFilter | DebrisFilter; // groups obj will collide

Bulletがどのように機能するかわかりません。

これがお役に立てば幸いです。Imが間違っている場合は訂正してください。

于 2012-11-06T22:11:48.470 に答える