奇怪的多边形碰撞检测

时间:2020-01-08 18:33:39

标签: java libgdx

我正在使用libGDX编写游戏,我需要检测多边形,但是Intersector.overlapConvexPolygons方法返回的复杂形状根本不返回。

基于此,如果此方法返回与Rectangle检查相同的结果,那又有什么意义呢?

也许我做错了什么?

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 :(得分:0)

您的多边形很可能不是凸形的,如果在扩展矢量线时定义多边形的线不相交,则将多边形定义为凸形。

Difference between concave and convex polygons diagramatically

要在LibGDX中使用凹面多边形,可以使用LibGDX随附的EarClippingTriangulator类将凹面多边形拆分为三角形。在this question中可以找到有关如何使用此类拆分复杂多边形的示例。

Polygon进行了三角剖分后,就可以创建一个对象来封装整个三角形集合,它具有自己的碰撞方法,该方法可以反复检查另一个Polygon对象是否与任何{组成整个对象的Polygon个组成部分。

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
    }
}

相关问题