如何在JBox2D中创建复合凸多边形体?

时间:2016-03-08 14:50:30

标签: java box2d jbox2d

我正在尝试通过组合凸多边形在JBox2D中制作凹多边形体。这就是我尝试过的:

Vec2[][] v = { { new Vec2(-3.5f, 0), new Vec2(-3.5f, 0.5f), new Vec2(3.5f, 0.5f), new Vec2(3.5f, 0) },
        { new Vec2(-3.5f, 0.5f), new Vec2(-3.5f, 3), new Vec2(-3, 3), new Vec2(-3, 0.5f) },
        { new Vec2(3.5f, 0.5f), new Vec2(3.5f, 3), new Vec2(3, 3), new Vec2(3, 0.5f) } };

BodyDef bodyDef = new BodyDef();
bodyDef.position.set(x, y);
bodyDef.type = BodyType.DYNAMIC;
Body body = WORLD.createBody(bodyDef);

for (int i = 0; i < v.length; i++) {
    PolygonShape polygonShape = new PolygonShape();
    polygonShape.set(v[i], v[i].length);
    FixtureDef fixtureDef = new FixtureDef();
    fixtureDef.density = 0.1f;
    fixtureDef.shape = polygonShape;
    body.createFixture(fixtureDef);
}

但这不行。它产生混乱的形状,身体在与其他身体接触时冻结。经过一些错误测试后,我发现这是因为顶点搞乱了。我将此代码添加到最后:

for (Fixture f = body.getFixtureList(); f != null; f = f.getNext()) {
    Vec2[] v = ((PolygonShape) f.getShape()).getVertices();
    for (int i = 0; i < v.length; i++) {
        System.out.println(v[i].x + "  " + v[i].y);
    }
    System.out.println();
}

它给了我这个:

3.5  0.5
3.5  3.0
3.0  3.0
3.0  0.5
0.0  0.0
0.0  0.0
0.0  0.0
0.0  0.0

-3.5  0.5
-3.5  3.0
-3.0  3.0
-3.0  0.5
0.0  0.0
0.0  0.0
0.0  0.0
0.0  0.0

-3.5  0.0
-3.5  0.5
3.5  0.5
3.5  0.0
0.0  0.0
0.0  0.0
0.0  0.0
0.0  0.0

哪个是正确的,除了它还为每个夹具在(0.0,0.0)处产生四个额外的顶点。这导致多边形变得凹陷,这是不好的。 我自然开始测试,发现这个形状工作得很好,并没有产生那些额外的顶点:

float sqrt2 = (float) Math.sqrt(2);
Vec2[][] v = { { new Vec2(2, 0), new Vec2(sqrt2, sqrt2), new Vec2(0, 2), new Vec2(-sqrt2, sqrt2),
        new Vec2(-2, 0), new Vec2(-sqrt2, -sqrt2), new Vec2(0, -2), new Vec2(sqrt2, -sqrt2) } };

所以我认为它与多个灯具有关,但我发现这不起作用(在0,0产生那四个额外的顶点):

Vec2[][] v = { { new Vec2(2, 2), new Vec2(2, -2), new Vec2(-2, -2), new Vec2(-2, 2) } };

这让我再次感到困惑!如果那些额外的四个顶点不会出现,那么一切都会好起来的,那么我做错了什么?

我对Box2D有些新意,所以请记住这一点。

0 个答案:

没有答案