【问题标题】:box2d(libgdx) stacked bodies not stablebox2d(libgdx) 堆叠体不稳定
【发布时间】:2017-01-13 10:26:20
【问题描述】:

当我将很多物体(矩形)堆叠在一起时,它们并不稳定。即使将恢复原状设置为 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);
    }

【问题讨论】:

  • 尝试增加盒子之间的间隙并让它们下落,您可能会将它们放在彼此的顶部,从而导致侧向移动。
  • 尝试了很多值。当它们相互摔倒时,它也不起作用。
  • “地面”块的恢复是否也设置为 0?另外,请尝试增加密度,因为当它有更多质量时,它会更少反弹。

标签: libgdx box2d


【解决方案1】:

只要这是我认为的问题,那么是的,这是可以解决的。尽管有额外的工作。但短期内不会。

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

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

从算法上讲,我修改了位置解析的方式,从一次解析施加一个碰撞流形点的脉冲,到解析按穿透深度顺序施加的脉冲,或者在它们几乎相等时同时解析脉冲。代码方面,我基本上对 Erin 的 b2ContactSolver::SolvePositionConstraintsb2ContactSolver::SolveTOIPositionConstraints 方法(在 Erin 的 b2ContactSolver.cpp 中)进行了这种算法更改。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多