【问题标题】:Weird polygon collision detection奇怪的多边形碰撞检测
【发布时间】:2020-01-08 18:33:39
【问题描述】:

我正在使用 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;
}

以下截图:

【问题讨论】:

  • 几个问题:你的多边形是逆时针缠绕的凸多边形吗?白线是否应该完美包裹黑色“尖峰”?如果我在图像上看到的白线是用于调试您的多边形创建可能需要修复
  • @LuisFernandoFrontanilla 经过几个小时的测试后,很可能在创建多边形时出错了。
  • 如果您可以共享创建多边形的代码部分,那就太好了

标签: java libgdx


【解决方案1】:

您的多边形很可能不是凸面,如果在向量线延伸时定义多边形的线不相交,则多边形被定义为凸面。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-24
    • 1970-01-01
    • 2013-03-09
    相关资源
    最近更新 更多