Box2D(2 1a)引擎的群組篩選碰撞詳解

2021-09-27 04:05:43 字數 2235 閱讀 4843

關於box2d的群組篩選功能是怎麼回事一直有點不明所以,現在經過一系列實驗,終於明白box2d群組篩選的控制機制了。群組碰撞篩選的核心屬性有2個,分別是b2filterdata的categorybits屬性以及maskbits屬性;(b2filterdata作為b2fixturedef的filter物件存在)categorybits是剛體的所屬群組id值域為0x0000-0xffff;而maskbits屬性則是當前剛體接受碰撞的"掩碼";測試結果顯示,兩個物體是否碰撞,受到兩個條件的制約。分為3個步驟;這裡舉例剛體a和剛體b;

1:會對a的掩碼和b的群組id進行按位或運算,得到結果a1(這裡簡化為true/false);

2:對b的掩碼和a的群組id進行按位或運算,得到b1(true/false);

3:決定碰撞,對a1和b1進行與運算;得到結果為true則兩物體進行碰撞;否則穿過;

所以,預設情況下所有的b2filterdata的maskbits屬性為0xffff——與所有物體碰撞;

例如下面測試**

矩形物體會從中間開始下落到靜態體圓形上;從而觀察碰撞效果;

import box2d.collision.shapes.b2circleshape;

import box2d.collision.shapes.b2polygonshape;

import box2d.dynamics.b2world;

import box2d.dynamics.b2body;

import box2d.common.math.b2vec2;

import box2d.dynamics.b2fixture;

import box2d.dynamics.b2fixturedef;

import box2d.dynamics.b2bodydef;

import box2d.dynamics.b2debugdraw;

var world:b2world=new b2world(new b2vec2(0,2),true);

var b2d:b2bodydef=new b2bodydef();

b2d.position.set(200/30,100/30);

b2d.type=b2body.b2_dynamicbody;

var bb:b2body=world.createbody(b2d);

var fx:b2fixturedef=new b2fixturedef();

fx.friction=1;

fx.restitution=0.1;

fx.shape=b2polygonshape.asbox(400/30,7.5/30);

fx.density=1;

fx.filter.categorybits=0x1100;//方形體群id

fx.filter.maskbits=0x1101;//方形體掩碼(對於碰撞對方的)因為是按位或運算所以每位的數字就不重要了;(過濾群id為0x00x0)的id

bb.createfixture(fx);

//完成方形建立

fx.shape=new b2circleshape(100/30);

fx.filter.categorybits=0x0011;//圓形體群id

fx.filter.maskbits=0x0111;//圓形體掩碼(過濾群id為0xx000)的群

//通過兩輪過濾之後還要將結果進行與運算,得出最終是否可碰撞;

b2d.position.set(400/30,300/30);

b2d.type=b2body.b2_staticbody;

bb=world.createbody(b2d);

bb.createfixture(fx);

//完成圓形建立

var sp:sprite=new sprite();

addchild(sp);

var dbg:b2debugdraw=new b2debugdraw();

dbg.setsprite(sp);

dbg.setflags(b2debugdraw.e_shapebit);

dbg.setdrawscale(30);

dbg.setlinethickness(0);

dbg.setfillalpha(0.5);

world.setdebugdraw(dbg);

addeventlistener(event.enter_frame,run);

function run(e:event)

物理引擎Box2D之剛體

剛體代表乙個質點,因此它只有位置,沒有大小。物理引擎box2d把剛體分為三種型別。1 靜態剛體。靜態剛體沒有質量,沒有速度,如果你想改變它的位置,只能通過 修改。2 稜柱剛體。稜柱剛體沒有質量,但有速度,引擎會根據速度計算並更新它的位置。3 動態剛體。動態剛體有質量也可以有速度,這是我們最常用的剛體...

物理引擎Box2D 憤怒的小鳥

2010 05 15 13 28 box2d 是乙個用於遊戲的 2d 剛體 庫。程式設計師可以在他們的遊戲裡使用它,它可以使物體的運動 更加可信,讓世界看起來更具互動性。從遊戲的視角來看,物理引擎就是乙個程式性動畫 procedural animation 的系統,而不是由動畫師去移動你的物體。你可...

Box 2D物理引擎C Box 2D環境配置

簡單介紹 box2d 是乙個用於遊戲的 2d 剛體 庫.程式設計師可以在他們的遊戲裡使用它,它可以使物體的運動 更加可信,讓世界看起來更具互動性.從遊戲的視角來看,物理引擎就是乙個程式性動畫 procedural animation 的系統,而不是由動畫師去移動你的物體.你可以讓牛頓來做導演.最近在...