PolygonShape断言“area> 1.19209289550781250000e-7F”

时间:2015-02-17 17:18:57

标签: java libgdx box2d

我正在制作一个游戏,其中地板是随机生成的非凸多边形。

将多边形的顶点传递给以下(伪代码)方法:

private void createPolygon (FloatArray vertices) {
        short[] triangleIndices = new EarClippingTriangulator()
                                            .computeTriangles(vertices)
                                                .items;
        myPolygon = new PolygonSprite(
                            new PolygonRegion(textureRegion, vertices.items, triangleIndices));
        //  myPolygon is correctly rendered
        //  now I want to create a Box2D static body with this shape
        PolygonShape myShape = new PolygonShape();
        Array<Vector2> vect = toVector2Array(vertices);
        for (int i = 0; i < triangleIndices.length / 3; i++) {
            // Error!
            myShape.set(new float[] {
                    vect.get(triangleIndices[3 * i + 0]).x,
                    vect.get(triangleIndices[3 * i + 0]).y,
                    vect.get(triangleIndices[3 * i + 1]).x,
                    vect.get(triangleIndices[3 * i + 1]).y,
                    vect.get(triangleIndices[3 * i + 2]).x,
                    vect.get(triangleIndices[3 * i + 2]).y });
            myBody.createFixture(myShape, 0);
        }

    }

通常这种方法效果很好,但有时候游戏会崩溃:

  

AL lib:(EE)alc_cleanup:1个设备未关闭
  断言失败!
  程序:C:\ Program Files \ Java \ jre1.8.0_25 \ bin \ javaw.exe
  文件:/var/lib/jenkins/workspace/libgdx/extensions/gdx-box2d/gdx-box2d/jni/Box2D/Collision/Shapes/b2PolygonShape.cpp,第158行
223

     

表达式:false

  

表达式:area&gt; 1.19209289550781250000e-7F

float []传递给&#34; myShape.set()&#34;包含(当它崩溃时):

- x1: -1061.4121;
- y1: -2178.179;
- x2: 888.95154;
- y2: -154.1218;
- x3: 888.98663;
- y3: -154.08865;

如果我理解正确,这是因为三角形太小了。 我该怎么做才能避免这个问题,或者忽略这些小三角形呢? 提前致谢

2 个答案:

答案 0 :(得分:3)

点#2和#3非常接近,也许这就是图书馆不喜欢的。

也许,您可以改进随机点生成器,以避免两点过于接近。

答案 1 :(得分:0)

解决这个问题的原始但有效的方法就是使用Box2D执行的相同检查来触发断言。查看b2PolygonShape.cpp中函数内部的代码,该代码决定是否触发此断言。将该代码复制(或移植)到您自己的程序中,以便您可以先发制人地检查断言是否会触发。如果它会触发,请不要创建该夹具:)