qualcuno sa se i corpi si scontrano solo quando (body1.categoryBits & body2.maskBits) & & (body1.maskBits & body2.categoryBits)? o si scontrano già quando (body1.categoryBits & body2.maskBits) || (body1.maskBits & body2.categoryBits)?gruppi di collisione box2d
risposta
Dal Box2D manual:
6.2.3. Filtro
Il filtro di collisione è un sistema per che impedisce la collisione tra le forme. Ad esempio, supponi di creare un personaggio che va in bicicletta. Si vuole la bicicletta a collidere con il terreno e il carattere entrare in collisione con il terreno , ma non si desidera che il carattere a collidere con la bicicletta (perché devono sovrapporsi). Box2D supporta tale filtro di collisione utilizzando categorie e gruppi.
Box2D supporta 16 collisioni categorie. Per ogni forma è possibile specificare a quale categoria appartiene. È inoltre possibile specificare quali altre categorie possono entrare in collisione con questa forma. Ad esempio, è possibile specificare in un gioco multiplayer che tutti i giocatori non entrare in collisione con l'altro e mostri non si scontrano gli uni con gli altri , ma i giocatori e mostri dovrebbero scontrano. Questo è fatto con mascheratura bit. Per esempio:
playerShapeDef.filter.categoryBits = 0x0002; monsterShapeDef.filter.categoryBits = 0x0004; playerShape.filter.maskBits = 0x0004; monsterShapeDef.filter.maskBits = 0x0002;
gruppi di collisione consentono di specificare un indice gruppo integrale . È possibile avere tutte le forme con lo stesso indice di gruppo collidere sempre (indice positivo) o non collidere mai (indice negativo). Gli indici di gruppo vengono solitamente utilizzati per le cose che sono in qualche modo correlate, come le parti di una bicicletta . Nel seguente esempio , shape1 e shape2 sono sempre collide, ma shape3 e shape4 mai collide.
shape1Def.filter.groupIndex = 2; shape2Def.filter.groupIndex = 2; shape3Def.filter.groupIndex = -8; shape4Def.filter.groupIndex = -8;
collisioni tra forme dei diversi indici gruppo vengono filtrati in base i bit di categoria e della maschera. Nelle altre parole, il filtro di gruppo ha una precocità superiore a rispetto al filtro di categoria.
Guardando la fonte di Box2d, mostra che se gli infissi appartengono a diversi gruppi (oi gruppi sono 0) poi il catgory e le maschere sono confrontati come segue:
bool collide = (filterA.maskBits & filterB.categoryBits) != 0 &&
(filterA.categoryBits & filterB.maskBits) != 0;
Quindi sembra come il dispositivo si scontrano solo se la collisione è consentita da entrambe le maschere dei proiettori. (IE: logica AND)
Questo è il modo in cui ho capito come funzionano maskBits e categoryBit. Supponiamo di avere 3 oggetti: oggettoA, oggettoB e oggettoC.
Definire per ogni oggetto una categoria:
objectA.categoryBits = 0x0002;
objectB.categoryBits = 0x0004;
objectC.categoryBits = 0x0008;
Poi, impostare le maskBits, che definiscono le regole di collisioni per ogni categoryBits:
-> Objecta entrare in collisione con tutti (0xFFFF) e (&) non (~) ObjectB (0x0004)
objectA.maskBits = 0xFFFF & ~ 0x0004;
-> objectB collide con objectA (0x0002) o (|) objectC (0x0008) ma nessun altro
objectB.maskBits = 0x0002 | 0x0008;
-> objectC collisione con objectA (0x0002) ma nessun altro
objectC.maskBits = 0x0002;
Non so se questo è corretto, ma ha funzionato per me.
HTH
Se qualcuno è ancora alla ricerca di ulteriori spiegazioni, ho fatto un tutorial dettagliato qui:
http://aurelienribon.wordpress.com/2011/07/01/box2d-tutorial-collision-filtering/
Ho usato pareti e molti giocatori (il nostro giocatore e nemici) . Il mio giocatore e i suoi nemici entrano in collisione con i muri ma non si scontrano tra loro. Ho fatto così e ha funzionato. Devi impostare groupIndex su un valore negativo affinché gli oggetti non entrino in collisione tra loro. Definire i dispositivi come questo.
/* 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);
e applicare ai vostri corpi.
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. Rileva collisione iniziale di due corpi box2d senza collisioni continua
- 2. Friction in Box2d
- 3. Solo l'integrazione del rilevamento di collisione Box2D nel mio motore 2d?
- 4. Box2D Connessione gerarchica tra corpi
- 5. Gruppi nidificati di Django: Gruppi in gruppi
- 6. Programmazione collisione oggetto (caso collisione multipla)
- 7. Threading Box2D con pthreads
- 8. Python OpenCV Box2D
- 9. Cocos2d + Box2d o Chipmunk
- 10. Balance box2d objects
- 11. Rilevatore/risposta di collisione voxel
- 12. EndContact di ContactListner (Box2d) non chiamato ogni volta in LibGDX
- 13. Box2D velocità del corpo cap?
- 14. Box2D più apparecchi e posizionamento
- 15. Box2d: massima velocità lineare possibile?
- 16. Android GDX Box2D Triangle Shape
- 17. Spostamento di corpi Box2d come oggetti CCSprite
- 18. Box2d: mousejoint senza ritardo inerziale
- 19. Risoluzione collisione in HashMap
- 20. Rilevazione collisione canvas JavaScript
- 21. Rilevazione collisione continua 2D
- 22. rilevamento collisione retta d3js
- 23. Predizione collisione cerchio-cerchio
- 24. Nome anonimo Collisione
- 25. java collisione HashMap
- 26. javascript nome collisione
- 27. Rilevamento di collisione e modello di attore
- 28. Rimozione di un oggetto in caso di collisione
- 29. OpenCL gruppi di lavoro
- 30. Rilevamento sfera - sfera di collisione -> reazione
Grazie, ha funzionato per me. – noob