Странное обнаружение столкновения полигонов - PullRequest
0 голосов
/ 08 января 2020

Я пишу игру, используя libGDX, и мне нужно обнаружение полигонов, но метод Intersector.overlapConvexPolygons возвращает совсем не то, что должен, если он касается сложных фигур.

Исходя из этого, какой смысл в этом методе, если он возвращает то же, что проверка прямоугольника?

Может я что-то не так делаю?

public Vector getOverlap(Entity a, Entity b){
    Vector v=new Vector(); //my implementation of Vector2 class
    Intersector.MinimumTranslationVector mv=new Intersector.MinimumTranslationVector();
    if(Intersector.overlapConvexPolygons(a.getBounds(), b.getBounds(), mv)){
        v.set(mv.normal.x, mv.normal.y).scl(mv.depth);
    }
    return v;
}

Скриншоты ниже: enter image description here enter image description here enter image description here

1 Ответ

0 голосов
/ 16 января 2020

Ваши полигоны, скорее всего, не являются выпуклыми, полигоны определяются как выпуклые, если линии, определяющие многоугольник, не пересекаются при удлинении векторных линий.

Difference between concave and convex polygons diagramatically

Чтобы использовать вогнутые многоугольники в LibGDX, можно разбить вогнутый многоугольник на треугольники, используя класс EarClippingTriangulator, включенный в LibGDX. Пример использования этого класса для разбиения сложного многоугольника можно найти в этом вопросе .

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

public class ConcavePolygon {
    ...

    public boolean isColliding(Polygon polygon) {
        for(Polygon triangle : triangles) {
            if(Intersector.overlapConvexPolygons(polygon, triangle, mv)) {
                return true; //Returns true if any triangles overlap polygon
            }
        }

        return false; //Returns false if none overlap
    }

    public boolean isColliding(ConvexPolygon convexPolygon) {
        for(Polygon triangle : triangles) {
            if(convexPolygon.isColliding(triangle)) {
                return true; //Returns true if any triangles overlap convex polygon
            }
        }

        return false; //Returns false if none overlap
    }
}

...