box2d(libgdx)堆叠体不稳定

时间:2016-04-24 16:40:59

标签: libgdx box2d

当我将很多身体(矩形)堆叠在一起时,它们不能保持稳定。即使将恢复原状设定为0.它们也是有弹性的并且相互脱落。我尝试将密度设置为一个非常低的值,但它没有改变。

是否有可能解决这个问题?

    shape.setAsBox(0.1f, 0.1f, new Vector2(0, 0), 0);
    bDef = new BodyDef();
    bDef.type = BodyDef.BodyType.DynamicBody;
    bDef.position.set(0, 0);

    fDef.shape = shape;
    fDef.density = 0.001f;
    fDef.friction = 0.5f;
    fDef.restitution = 0.0f;

    for (int i = 1; i < 50; i++) {
        bDef.position.set(0, i * 0.201f);
        body1 = world.createBody(bDef);
        fixture = body1.createFixture(fDef);
    }

1 个答案:

答案 0 :(得分:0)

只要这是我认为的问题,那么是的,这是可以修复的。虽然有额外的工作。但在短期内,没有。

当我从Box2D 2.3.2运行Testbed的“垂直堆栈”测试时,我看到一堆盒子在垂直堆栈中相互叠加。起初他们堆叠,然后他们摇晃,然后他们翻倒。这就是Box2D的设计工作方式。我不喜欢这种行为所以我改变了它。

我怀疑这与您所看到的问题基本相同。我用来修改它并获得稳定堆叠行为的“修复”涉及更改内部Box2D库代码。

从算法上讲,我修改了位置分辨率的方式,从解决一次应用一个碰撞流形点的脉冲到解决按穿透深度顺序应用的脉冲,或者当它们几乎相等时同时解决。代码方面,我基本上将此算法更改为Erin的b2ContactSolver::SolvePositionConstraintsb2ContactSolver::SolveTOIPositionConstraints方法(在Erin的b2ContactSolver.cpp中)。

此更改算法的代码位于dev branch of my fork of Box2D中(请参阅SolvePositionConstraint文件中的ContactSolver.cpp函数)。不幸的是,我没有一个只适用于那些方法的差异,因为我的代码更改超出了那些。此外,我所做的更改修改了Box2D库公共接口,因此即使您可以为您的平台构建它,您仍然需要调整您的代码到我拥有的新接口。