Группы столкновения box2d

Кто-нибудь знает, будут ли только тела сталкиваться, когда (body1.categoryBits и body2.maskBits) && & && (body1.maskBits и body2.categoryBits)?  или они уже сталкиваются, когда (body1.categoryBits и body2.maskBits) || (body1.maskBits и body2.categoryBits)?

Ответ 2

Из 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;

Коллизии между формами разных индексы групп фильтруются согласно бит категории и маски. В других слова, групповая фильтрация выше предпочтителен, чем фильтрация по категориям.

Ответ 3

Вот так я понял, как работают маски и биты. Скажем, у вас есть 3 объекта: objectA, objectB и objectC.

Определите для каждого объекта категорию:

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

Затем установите maskBits, которые определяют правила коллизий для каждой категории:

- > objectA сталкивается со всеми (0xFFFF) и (&) не (~) objectB (0x0004)
objectA.maskBits = 0xFFFF и ~ 0x0004;

- > objectB сталкивается с objectA (0x0002) или (|) objectC (0x0008), но никого больше нет objectB.maskBits = 0x0002 | 0x0008;

- > objectC сталкивается с objectA (0x0002), но никто другой
objectC.maskBits = 0x0002;

Я не знаю, правильно ли это, но это сработало для меня.

НТН

Ответ 4

Глядя на источник Box2d, он показывает, что если светильники принадлежат к разным группам (или группы равны 0), то их можно сравнить следующим образом:

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

Таким образом, похоже, что привязка только сталкивается, если столкновение разрешено обеими масками. (IE: И логика)

Ответ 5

Я использовал стены и множество игроков (нашего Игрока и врагов). Мой игрок и враги сталкиваются со стенами, но не сталкиваются друг с другом. Я сделал так, и это сработало. Вы должны установить для параметра 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));