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?

¿Fue útil?

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.
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top