box2d碰撞组

时间:2009-06-01 21:40:50

标签: box2d collision

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

5 个答案:

答案 0 :(得分:29)

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

答案 1 :(得分:15)

来自Box2D manual

  

<强> 6.2.3。过滤

     

碰撞过滤是一个系统   防止形状之间的碰撞。   例如,假设你创造了一个角色   骑自行车。你想要的   自行车与地形相撞   与角色碰撞的角色   地形,但你不想要   性格与自行车碰撞   (因为它们必须重叠)。 Box2D的   支持这种碰撞过滤   使用类别和组。

     

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

playerShapeDef.filter.categoryBits = 0x0002;
monsterShapeDef.filter.categoryBits = 0x0004;
playerShape.filter.maskBits = 0x0004;
monsterShapeDef.filter.maskBits = 0x0002;
     

碰撞组让您指定一个   积分组指数。你可以拥有一切   具有相同组索引的形状   总是碰撞(正面指数)或   从不碰撞(负面指数)。组   索引通常用于事物   这是某种程度上相关的,比如   自行车的一部分。在下面的   例如,shape1和shape2总是如此   碰撞,但shape3和shape4永远不会   碰撞。

shape1Def.filter.groupIndex = 2;
shape2Def.filter.groupIndex = 2;
shape3Def.filter.groupIndex = -8;
shape4Def.filter.groupIndex = -8;
     

不同形状之间的碰撞   组索引按照过滤   类别和掩码位。其他   单词,组过滤有更高   优先于类别过滤。

答案 2 :(得分:11)

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

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

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

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

- &GT; objectA与所有人(0xFFFF)和(&amp;)not(〜)objectB(0x0004)发生冲突 objectA.maskBits = 0xFFFF&amp; 〜0x0004;

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

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

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

HTH

答案 3 :(得分:3)

查看Box2d的来源,它显示如果灯具属于不同的组(或组是0),那么将比较如下的传感器和掩码:

    bool collide = (filterA.maskBits & filterB.categoryBits) != 0 && 
                   (filterA.categoryBits & filterB.maskBits) != 0;

因此,如果两个灯具的掩模都允许碰撞,那么看起来夹具只会发生碰撞。 (IE:AND逻辑)

答案 4 :(得分:0)

我使用了墙壁和许多玩家(我们的玩家和敌人)。我的玩家和敌人与墙壁碰撞,但不会相互碰撞。我这样做了,它起作用了。您必须将groupIndex设置为负值,以使对象不会相互冲突。像这样定义灯具。

    /* The categories. */
public static final short CATEGORYBIT_WALL = 1;
public static final short CATEGORYBIT_PLAYERS = 2;

/* And what should collide with what. */
public static final short MASKBITS_WALL = CATEGORYBIT_WALL + CATEGORYBIT_PLAYERS;

public static final FixtureDef WALL_FIXTURE_DEF = PhysicsFactory.createFixtureDef(0, 0.5f, 0.5f, false, CATEGORYBIT_WALL, MASKBITS_WALL, (short)0);
public static final FixtureDef PLAYERS_FIXTURE_DEF = PhysicsFactory.createFixtureDef(1, 0.5f, 0.5f, false, CATEGORYBIT_PLAYERS, MASKBITS_WALL, (short)-1);

并适用于你的身体。

AnimatedSprite player, enemy;
Body playerBody, enemyBody;

player= new AnimatedSprite(CAMERA_WIDTH/2, CAMERA_HEIGHT/2,     this.playerRegion, this.getVertexBufferObjectManager());
playerBody = PhysicsFactory.createBoxBody(this.mPhysicsWorld, player,     BodyType.DynamicBody, PLAYERS_FIXTURE_DEF);   
this.mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(player, playerBody, true, false));

enemy= new AnimatedSprite(CAMERA_WIDTH/4, CAMERA_HEIGHT/2, this.enemyRegion, this.getVertexBufferObjectManager());

enemyBody= PhysicsFactory.createCircleBody(this.mPhysicsWorld, enemy, BodyType.DynamicBody, PLAYERS_FIXTURE_DEF);
this.mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(enemy, enemyBody, true, false));