Спрашивая Box2d, произошло ли столкновение - PullRequest
0 голосов
/ 26 марта 2010

Я использую 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() возвращает один прибор?

1 Ответ

0 голосов
/ 02 июля 2010

Если вам известны типы фигур, вы можете использовать любую из следующих функций для прямой проверки на перекрытие.

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);

Все они принимают две формы и два преобразования.Результатом является объект Manifold, который содержит набор точек, где пересекаются границы фигуры.Если число точек больше нуля, у вас есть коллизия.

Вы можете получить ту же информацию косвенно, реализовав интерфейс 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) {}
}

Запрет двух телнайдено из Contact._fixtureA.Body и Contact._fixtureB.Body.Вы должны зарегистрировать объект слушателя в World.

GetFixtureList (), GetBodyList (), GetJointList () и т. Д. Возвращают первый элемент в связанном списке.Следующий элемент в списке найден путем вызова GetNext () для элемента.Вы можете перебрать список с помощью следующего кода.Когда GetNext () возвращает ноль, больше нет элементов.

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