JBox2D — найти координаты столкновения

Я пишу программу на Java, используя JBox2D. Мне нужно найти точную точку столкновения двух текстур, если и когда они столкнутся.

У меня есть код, чтобы определить, происходит ли столкновение, и, очевидно, я могу просто вызвать идентификатор объекта столкновения, чтобы определить, какие текстуры сталкиваются.

Чего я не могу понять, так это того, как получить фактические координаты самого столкновения. Я читал документацию, но она очень сложна и не решает эту проблему напрямую.

Вот мой код:

import org.jbox2d.callbacks.ContactImpulse;
import org.jbox2d.callbacks.ContactListener;
import org.jbox2d.collision.Manifold;
import org.jbox2d.common.Vec2;
import org.jbox2d.dynamics.Fixture;
import org.jbox2d.dynamics.contacts.Contact;


public class MyContactListener implements ContactListener{


    //When they start to collide
    public void beginContact(Contact c) {

    System.out.println("CONTACT");

    Fixture fa = c.getFixtureA();
    Fixture fb = c.getFixtureB();

    Vec2 posA = fa.getBody().getPosition();
    Vec2 posB = fb.getBody().getPosition();



}

public void endContact(Contact c) {

}

public void preSolve(Contact c, Manifold m) {}

public void postSolve(Contact c, ContactImpulse ci){}

}

person bigcodeszzer    schedule 11.08.2015    source источник


Ответы (1)


Чтобы знать, где произошло столкновение, следует знать, что иногда существует не одна точка столкновения, а множество точек.

извлечено из руководства

(Изображение взято из этого руководства)

Как сказано в приведенном выше руководстве:

Box2D имеет функции для вычисления точек контакта для перекрывающихся фигур. [...] Эти точки [...] группируют их в многообразную структуру. [...]

Обычно вам не нужно вычислять контактные коллекторы напрямую, однако вы, скорее всего, будете использовать результат, полученный при моделировании.[...] Если вам нужны эти данные, обычно лучше использовать Структура WorldManifold [...].

Вы можете получить к нему доступ внутри класса Contact c:

public void beginContact(Contact c) {
    System.out.println("CONTACT");
    
    WorldManifold worldmanifold;
    worldmanifold = c.getWorldManifold();
    
    for(Vec2 point : worldmanifold.points){
        System.out.println("Contact at : [" + point.x + ", " + point.y "]");
    }
}

Важно: я никогда не использовал эту библиотеку (JBox2D), однако я с ней знаком (поскольку libGDX, по-видимому, использует аналогичную (Box2D)). Кроме того, я не знаю, является ли JBox2D Box2D (один из C++) для Java, и связаны ли вообще JBox2D и Box2D (один из libGDX). Так что, возможно, некоторые методы могут измениться (point.x может быть point.getX()).

Вы также можете проверить этот сайт, но это для C++ (я используйте их ответ, чтобы ответить вам).

person Alex Sifuentes    schedule 11.08.2015