box2d碰撞组

10 collision box2d

有谁知道身体是否只在(body1.categoryBits&body2.maskBits)&&(body1.maskBits&body2.categoryBits)时发生碰撞?或者当(body1.categoryBits&body2.maskBits)||时它们已经发生碰撞 (body1.maskBits&body2.categoryBits)?

Aur*_*bon 29

如果有人还在寻找更多解释,我在这里做了详细的教程:http:
//aurelienribon.wordpress.com/2011/07/01/box2d-tutorial-collision-filtering/


Mit*_*eat 15

来自Box2D 手册:

6.2.3.过滤

碰撞过滤是用于防止形状之间碰撞的系统.例如,假设您制作一个骑自行车的角色.您希望自行车与地形碰撞并且角色与地形碰撞,但您不希望角色与自行车碰撞(因为它们必须重叠).Box2D使用类别和组支持此类冲突过滤.

Box2D支持16种碰撞类别.对于每个形状,您可以指定它属于哪个类别.您还可以指定此形状可以与之碰撞的其他类别.例如,您可以在多人游戏中指定所有玩家不会相互碰撞,怪物不会相互碰撞,但玩家和怪物应该发生碰撞.这是通过屏蔽位完成的.例如:

playerShapeDef.filter.categoryBits = 0x0002;
monsterShapeDef.filter.categoryBits = 0x0004;
playerShape.filter.maskBits = 0x0004;
monsterShapeDef.filter.maskBits = 0x0002;
Run Code Online (Sandbox Code Playgroud)

碰撞组允许您指定整数组索引.您可以使具有相同组索引的所有形状始终碰撞(正索引)或永不碰撞(负索引).组索引通常用于某种相关的事物,例如自行车的部件.在以下示例中,shape1和shape2始终发生碰撞,但shape3和shape4永远不会发生碰撞.

shape1Def.filter.groupIndex = 2;
shape2Def.filter.groupIndex = 2;
shape3Def.filter.groupIndex = -8;
shape4Def.filter.groupIndex = -8;
Run Code Online (Sandbox Code Playgroud)

根据类别和掩码位过滤不同组索引的形状之间的冲突.换句话说,组过滤具有比类别过滤更高的优先级.


小智 11

这是我理解maskBits和categoryBits如何工作的方式.假设你有3个对象:objectA,objectB和objectC.

为每个对象定义一个类别:

objectA.categoryBits = 0x0002;
objectB.categoryBits = 0x0004;
objectC.categoryBits = 0x0008;

然后,设置maskBits,它定义每个categoryBits的冲突规则:

- > objectA与所有人冲突(0xFFFF)和(&)not(〜)objectB(0x0004)
objectA.maskBits = 0xFFFF&~0x0004;

- > objectB与objectA(0x0002)或(|)objectC(0x0008)冲突,但没有其他人
objectB.maskBits = 0x0002 | ×0008;

- > objectC与objectA(0x0002)冲突,但没有其他人
objectC.maskBits = 0x0002;

我不知道这是否正确,但它对我有用.

HTH