box2d盒子碰撞不准确

时间:2014-08-08 03:16:47

标签: libgdx box2d collision-detection

Box2d多边形框不会准确碰撞。我使用Box2ddebug渲染器并多次重复使用Polygonshape。当boxshape位于地面体(静态)上时,这些物体之间存在间隙。谁能帮我这个?

public class BoxShape extends Shape implements ShapeAccessor {

private DotShape a, b, c, d;
private Rectangle rect;
private Vector2 temp = new Vector2();
private float hw = 0, hh = 0;

public BoxShape(float x, float y, float u, float v) {
    a = new DotShape(x, y, this);
    b = new DotShape(u, y, this);
    c = new DotShape(u, v, this);
    d = new DotShape(x, v, this);
    hw = u - x;
    hh = y - v;
    rect = new Rectangle(d.getX(), d.getY(), hw, hh);
    rect.getCenter(temp);
    center = new DotShape(temp.x, temp.y, this);
    center.setColor(Color.MAGENTA);
    bodyDef.position.set(temp.x * Assets.ws, temp.y * Assets.ws);
    this.setColor(Color.BLUE);
}
@Override
public Body createBody(World world) {
    Body b = world.createBody(bodyDef);
    b.setUserData(new Data(getName()));
    return b;
}

@Override
public Fixture createFixture(Body body) {
    Assets.p.setAsBox(((rect.width / 2) * Assets.ws),
            ((rect.height / 2) * Assets.ws));//ws does scaling. world ranges from 0.1 to 20 meter
    fixtureDef.shape = Assets.p;
    return body.createFixture(fixtureDef);
}
      ........................
      ........................

然后通过以下方式制作主体和夹具:

public void createWorld(World world) {
    for (Shape s : shapes) {
        Body b=s.createBody(world);
        s.createFixture(b);
    }
    for (JointShape j : joints) {
        j.createJoint(world);
    }
}

1 个答案:

答案 0 :(得分:2)

你的形状非常小吗?您可能需要扩展您的世界,以便常见的形状大小约为1个单位。

当灯具重叠时,它们被推开以便它们不会重叠,但是许多情况(特别是堆叠的物体)使得难以保持这种情况稳定。顶部的盒子由于重力向下移动并触及下面的盒子,然后被推回,等等,永远。除了从周围的所有抖动看起来很糟糕,这将永远不会稳定并浪费计算时间,因为身体永远无法入睡。

为了解决这个问题,在固定装置周围有一个很小的空间用作缓冲器,其中两个相邻的固定装置可以同意他们正在接触,但是没有重叠因此不需要进行校正 - 他们可以微笑彼此放松。这个缓冲区的大小是b2Settings中的一个值,虽然你可以改变它(b2_linearSlop),但在你做之前你应该知道你在做什么。 (请记住,这是在Box2D中使用的#define常量,因此您需要重新编译库本身以使更改生效。)我建议您缩放世界以使用更大的尺寸。

http://www.iforce2d.net/b2dtut/gotchas#smallgap