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);
}
}
答案 0 :(得分:2)
你的形状非常小吗?您可能需要扩展您的世界,以便常见的形状大小约为1个单位。
当灯具重叠时,它们被推开以便它们不会重叠,但是许多情况(特别是堆叠的物体)使得难以保持这种情况稳定。顶部的盒子由于重力向下移动并触及下面的盒子,然后被推回,等等,永远。除了从周围的所有抖动看起来很糟糕,这将永远不会稳定并浪费计算时间,因为身体永远无法入睡。
为了解决这个问题,在固定装置周围有一个很小的空间用作缓冲器,其中两个相邻的固定装置可以同意他们正在接触,但是没有重叠因此不需要进行校正 - 他们可以微笑彼此放松。这个缓冲区的大小是b2Settings中的一个值,虽然你可以改变它(b2_linearSlop),但在你做之前你应该知道你在做什么。 (请记住,这是在Box2D中使用的#define常量,因此您需要重新编译库本身以使更改生效。)我建议您缩放世界以使用更大的尺寸。