『 QuickBox2DやBox2DFlashAS3での衝突判定をグループ分け 』
2009 年 7 月 5 日
衝突判定のサンプル
●と壁、●と●、●と▲、▲と壁、■と壁の組み合わせは衝突が起こり、●と■、▲と■、■と■は衝突しない。
なるほど。
categoryBitsとmaskBitsを両方指定しないといけなかったのか。
QuickBox2DやBox2DFlashAS3でのオブジェクト同士の衝突判定をコントロールする話。
そもそもBox2DFlashAS3には(多分Box2Dにも)2種類の衝突判定方法が用意されている。
(1) groupIndexを使う方法
(2) categoryBits、maskBitsの組み合わせを使う方法
(1) groupIndexを使う方法
- 同じ正の数でグループ付けされたオブジェクトは必ず衝突する
- 同じ負の数でグループ付けされたオブジェクトは必ず衝突しない
デフォルトは0で、このときは次に書くcategoryBits、maskBitsの組み合わせを使う方法が優先される。0以外の数値を記述するとgroupIndexの方法が優先される。
(2) categoryBits、maskBitsの組み合わせを使う方法
- categoryBitsに、自分が所属するグループを記述する(デフォルトは0×0001)
- maskBitsに、自分と衝突が起こるグループを記述する(デフォルトは0xffff)
(2)のcategoryBits、maskBitsの組み合わせを使う方法についてちょっと解説。
自分と何かが衝突するかどうかは、自分のmaskBitsと相手のcategoryBitsの論理積をとって計算できる。結果が0なら衝突しない、0以外なら衝突する。
サンプルのソースコードは以下
import com.actionsnippet.qbox.*;
var sim:QuickBox2D = new QuickBox2D(this);
sim.setDefault( { lineAlpha:0, fillAlpha:0.5 } );
// 壁 (デフォルト値を使用)
// categoryBits = 0x0001 (0000 0000 0000 0001)
// maskBits = 0xffff (1111 1111 1111 1111)
sim.createStageWalls( { fillColor:0xCCCCCC } );
var i:uint;
// ●
// categoryBits 0000 0000 0000 0010
// maskBits 0000 0000 0000 0111
for (i = 0; i < 3; ++i)
{
sim.addCircle( { x:0.8 + 1.2 + i * 6, y:2, radius:0.5, fillColor:0xFF0000, categoryBits:0x0002, maskBits:0x0007 } );
}
sim.addBox( { x:3.2, y:5, width:3, height:3, density:0, fillColor:0xFF0000, categoryBits:0x0002, maskBits:0x0007 } );
// ▲
// categoryBits = 0x0002 (0000 0000 0000 0010)
// maskBits = 0x0007 (0000 0000 0000 0111)
for (i = 0; i < 3; ++i)
{
sim.addPoly( { x:0.8 + 2.4 + i * 6, y:2, verts:[[0, 0, 0.5, 0.87, -0.5, 0.87]], fillColor:0x00CC00, categoryBits:0x0004, maskBits:0x0007 } );
}
sim.addBox( { x:9.2, y:5, width:3, height:3, density:0, fillColor:0x00CC00, categoryBits:0x0004, maskBits:0x0007 } );
// ■
// categoryBits = 0x0008 (0000 0000 0000 1000)
// maskBits = 0x0001 (0000 0000 0000 0001)
for (i = 0; i < 3; ++i)
{
sim.addBox( { x:0.8 + 3.6 + i * 6, y:2, width:1, height:1, fillColor:0x0000FF, categoryBits:0x0008, maskBits:0x0001 } );
}
sim.addBox( { x:15.2, y:5, width:3, height:3, density:0, fillColor:0x0000FF, categoryBits:0x0008, maskBits:0x0001 } );
sim.start();
sim.mouseDrag();
QuickBox2Dを使う場合は上記サンプルのように、オブジェクトをaddするときに
maskBits
categoryBits
groupIndex
パラメータを指定する。
Box2DFlashAS3ならば
b2ShapeDef.filter.groupIndex
b2ShapeDef.filter.categoryBits
b2ShapeDef.filter.maskBits
を設定。
参考にさせていただいたページ
物理エンジンライブラリ Box2DFlashAS3 衝突判定と衝突のグループ・カテゴリ分け
Box2D:衝突判定のグループ分け
他のQuickBox2Dネタ一覧もどうぞ » tag : QuickBox2D