C# 询问Box2d是否发生碰撞

C# 询问Box2d是否发生碰撞,c#,xna,box2d,physics-engine,C#,Xna,Box2d,Physics Engine,我使用的是Box2dx(移植到C#,针对XNA进行了优化)。它处理碰撞分辨率,但如何判断两个对象当前是否发生碰撞 这就是我要写的函数: public bool IsColliding(GameObjectController collider1, GameObjectController collider2) 其中collider1.Model.Body是Box2dBody,而collider1.Model.BodyDef是Box2dBodyDef。(当然,collider2也是如此。) 更新

我使用的是Box2dx(移植到C#,针对XNA进行了优化)。它处理碰撞分辨率,但如何判断两个对象当前是否发生碰撞

这就是我要写的函数:

public bool IsColliding(GameObjectController collider1, GameObjectController collider2)
其中
collider1.Model.Body
是Box2d
Body
,而
collider1.Model.BodyDef
是Box2d
BodyDef
。(当然,
collider2
也是如此。)

更新:看起来像联系人侦听器,或者这可能很有用:

        AABB collisionBox;
        model.Body.GetFixtureList().GetAABB(out collisionBox);

为什么
GetFixtureList()
返回一个夹具?

如果知道形状类型,可以使用以下任何函数直接检查重叠

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);
它们都有两种形状和两种变换。结果是一个流形对象,其中包含形状边界相交处的点集合。如果点数大于零,则发生碰撞

通过类实现ContactListener接口,可以间接获得相同的信息

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) {}
}
这两具尸体禁止接触。_fixtureA.Body和Contact。_fixtureB.Body。您必须向World注册侦听器对象

GetFixtureList()、GetBodyList()、GetJointList()等。返回链接列表中的第一个元素。通过对元素调用GetNext()可以找到列表中的下一个元素。您可以使用以下代码迭代列表。当GetNext()返回null时,没有更多的元素

// Given there is a Body named body.
for (Fixture fix = body.GetFixtureList(); fix; fix = fix.GetNext()) {
    // Operate on fix.
}