11

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

4

5 回答 5

30

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

于 2011-07-05T17:55:13.670 回答
15

从 Box2D手册

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;

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

于 2009-06-02T01:19:26.630 回答
12

这就是我理解 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 | 0x0008;

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

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

高温高压

于 2011-02-03T10:44:30.317 回答
3

查看Box2d的源码,可以看出如果fixture属于不同的组(或者组为0),那么category和mask比较如下:

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

所以看起来只有当两个灯具的掩码都允许碰撞时,灯具才会发生碰撞。(即:与逻辑)

于 2011-01-18T17:43:43.093 回答
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));
于 2015-09-23T06:07:13.180 回答