Pidiendo Box2D si ocurrió una colisión
-
22-09-2019 - |
Pregunta
estoy usando Box2dx (portado a C #; optimizada para XNA). Se ocupa de resolución de colisiones, pero ¿cómo puedo saber si dos objetos chocan actualmente?
Esta es la función que estoy tratando de escribir:
public bool IsColliding(GameObjectController collider1, GameObjectController collider2)
Donde collider1.Model.Body
es la Body
Box2D, y collider1.Model.BodyDef
es la BodyDef
Box2D. (Lo mismo ocurre con collider2
, por supuesto.)
ACTUALIZACIÓN: Parece como oyentes de contacto o esto podría ser útil:
AABB collisionBox;
model.Body.GetFixtureList().GetAABB(out collisionBox);
¿Por qué el retorno GetFixtureList()
un accesorio?
Solución
Si conoce los tipos de forma que se puede utilizar cualquiera de las siguientes funciones para comprobar directamente para la superposición.
public static void Collision.CollideCircles(ref Manifold manifold,
CircleShape circle1, XForm xf1, CircleShape circle2, XForm xf2);
public static void Collision.CollidePolygonAndCircle(ref Manifold manifold,
PolygonShape polygon, XForm xf1, CircleShape circle, XForm xf2);
public static void Collision.CollideEdgeAndCircle(ref Manifold manifold,
EdgeShape edge, XForm transformA, CircleShape circle, XForm transformB);
public static void Collision.CollidePolyAndEdge(ref Manifold manifold,
PolygonShape polygon, XForm transformA, EdgeShape edge, XForm transformB);
public static void Collision.CollidePolygons(ref Manifold manifold,
PolygonShape polyA, XForm xfA, PolygonShape polyB, XForm xfB);
todos toman dos formas y dos transformadas. El resultado es un objeto del múltiple que contiene una colección de puntos en los que los bordes de las formas se cruzan. Si el número de puntos es mayor que cero tiene una colisión.
Se puede obtener la misma información indirecta mediante la implementación de la interfaz ContactListener por una clase.
public class MyContactListener : ContactListener {
// Called when intersection begins.
void BeginContact(Contact contact) {
// ...
// Make some indication that the two bodies collide.
// ...
}
// Called when the intersection ends.
void EndContact(Contact contact) {
// ...
// Make some indication that the two bodies no longer collide.
// ...
}
// Called before the contact is processed by the dynamics solver.
void PreSolve(Contact contact, Manifold oldManifold) {}
// Called after the contact is processed by the dynamics solver.
void PostSolve(Contact contact, ContactImpulse impulse) {}
}
Los dos cuerpos prohibición puede encontrar desde Contact._fixtureA.Body y Contact._fixtureB.Body. Usted tiene que registrar el objeto detector con el mundo.
GetFixtureList (), GetBodyList (, GetJointList (), etc.) devolver el primer elemento de una lista enlazada. El siguiente elemento de la lista se encuentra llamando GetNext () en el elemento. Se puede recorrer la lista con el código siguiente. Cuando GetNext () devuelve null no hay más elementos.
// Given there is a Body named body.
for (Fixture fix = body.GetFixtureList(); fix; fix = fix.GetNext()) {
// Operate on fix.
}