¿alguien sabe si los cuerpos solamente cuando chocan (body1.categoryBits & body2.maskBits) & & (body1.maskBits & body2.categoryBits)? o ya colisionan cuando (body1.categoryBits & body2.maskBits) || (body1.maskBits & body2.categoryBits)?grupos de colisión box2d
Respuesta
Desde el Box2D manual:
6.2.3. Filtrado
Filtrado de colisión es un sistema para que evita la colisión entre las formas. Por ejemplo, supongamos que hace un personaje que monta una bicicleta. Desea que la bicicleta colisione con el terreno y el carácter para colisionar con el terreno , pero no desea que el carácter colisione con la bicicleta (porque deben superponerse). Box2D admite dicho filtro de colisión utilizando categorías y grupos.
Box2D admite 16 categorías de colisión . Para cada forma, puede especificar a qué categoría pertenece. También especifica con qué otras categorías puede colisionar esta forma. Para ejemplo, se podría especificar en un juego multijugador que todos los jugadores no colisionan entre sí y monstruos no chocan entre otros, pero los jugadores y los monstruos debería colisionar. Esto se hace con enmascaramiento de bits. Por ejemplo:
playerShapeDef.filter.categoryBits = 0x0002; monsterShapeDef.filter.categoryBits = 0x0004; playerShape.filter.maskBits = 0x0004; monsterShapeDef.filter.maskBits = 0x0002;
grupos de colisión permiten especificar un índice del grupo integrante . Puede tener todas las formas con el mismo índice de grupo colisionar siempre (índice positivo) o nunca colisionar (índice negativo). Los índices del grupo se usan generalmente para las cosas que están relacionadas de alguna manera, como las partes de una bicicleta. En el siguiente ejemplo , shape1 y shape2 siempre colisionan, pero shape3 y shape4 nunca colisionan.
shape1Def.filter.groupIndex = 2; shape2Def.filter.groupIndex = 2; shape3Def.filter.groupIndex = -8; shape4Def.filter.groupIndex = -8;
Las colisiones entre las formas de diferentes índices grupo se filtran de acuerdo la categoría y la máscara de bits. En otras palabras , el filtrado de grupo tiene una precendencia mayor a que el filtrado de categoría.
En cuanto a la fuente de Box2D, muestra que si los aparatos pertenecen a diferentes grupos (o los grupos son 0), entonces el catgory y máscaras se comparan de la siguiente manera:
bool collide = (filterA.maskBits & filterB.categoryBits) != 0 &&
(filterA.categoryBits & filterB.maskBits) != 0;
Así que parece como el artefacto solo colisionan si la colisión está permitida por las máscaras de ambos artefactos. (IE: lógica Y)
Esta es la forma en que he entendido cómo funcionan maskBits y categoryBits. Digamos que tiene 3 objetos: objectA, objectB y objectC.
Definir para cada objeto una categoría:
objectA.categoryBits = 0x0002;
objectB.categoryBits = 0x0004;
objectC.categoryBits = 0x0008;
A continuación, establezca las maskBits, que definen las reglas de colisiones por cada categoryBits:
-> Objecta colisionar con todo el mundo (0xFFFF) y (&) no (~) objectB (0x0004)
objectA.maskBits = 0xFFFF & ~ 0x0004;
-> objectB chocar con Objecta (0x0002) o (|) objectC (0x0008) pero nadie más
objectB.maskBits = 0x0002 | 0x0008;
-> objectC colisiona con objectA (0x0002) pero nadie más
objectC.maskBits = 0x0002;
No sé si esto es correcto, pero funcionó para mí.
HTH
Si alguien está buscando todavía más explicaciones, hice un tutorial detallado aquí:
http://aurelienribon.wordpress.com/2011/07/01/box2d-tutorial-collision-filtering/
he utilizado paredes y muchos jugadores (nuestro jugador y enemigos) . Mi jugador y mis enemigos colisionan con las paredes pero no colisionan entre ellos. He hecho esto y funcionó. Debe establecer groupIndex en valor negativo para que los objetos no colisionen entre sí. Definir los accesorios como este.
/* 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);
y aplicar a sus cuerpos.
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));
- 1. detectar la colisión inicial de dos cuerpos box2d sin colisión continua
- 2. ¿Cómo detectar colisión pero no colisionar en box2d?
- 3. detección de colisión y colisión de respuesta
- 4. Enhebrar Box2D con pthreads
- 5. Python OpenCV Box2D
- 6. Fricción en Box2d
- 7. Cocos2d + Box2D o Chipmunk
- 8. Detección de colisión Chipmunk
- 9. zend: colisión de parámetros
- 10. Box2d: velocidad lineal máxima posible?
- 11. Android GDX Box2D Triangle Forma
- 12. colisión Puntos en GJK
- 13. SHA1 demo de colisión/ejemplo
- 14. 2D Detección de colisión continua
- 15. detección de colisión en cocos2d
- 16. Predicción de colisión Circle-Circle
- 17. Javascript canvas detección de colisión
- 18. Conceptos básicos de Android, libgdx y box2d
- 19. Desventajas de los cuerpos dormidos en Box2D
- 20. Eliminar un objeto cuando ocurre una colisión
- 21. ¿Solamente está integrando la detección de colisiones Box2D en mi motor 2d?
- 22. Pregunta de desarrollo de juego de iPhone 2d conceptual. ¿Cuarzo? ¿Cocos2d? Chipmunk? Box2d?
- 23. entendimiento SHA-1 debilidad colisión
- 24. ¿Cómo detectar colisión en three.js?
- 25. colisión del teléfono en "reanudar"
- 26. Mercurial HG colisión caso plegado?
- 27. ¿Cómo detectar colisión en webgl?
- 28. Box2dweb - Punto de contacto de colisión
- 29. Detección de colisión de círculo rápido
- 30. Buenas referencias de respuesta de colisión 2D
Gracias, funcionó para mí. – noob