Box2D non-friction body

Box2D non-friction body

在我的 LibGDX 项目中,我将 Box2D 用于物理学。当我尝试制作两个没有摩擦力 (0.0f) 的物体时,当它们相互移动时看起来仍然有摩擦力。一个 body 是静态的,旋转了 45 度,另一个是动态的。我错过了什么?

世界重力设置为9.8m/s,每米像素(PPM)为32。我想要的是两个物体完全没有摩擦。在我的示例代码中,第二个 body 落在第一个上。当物体没有摩擦时,我期望发生的是第二个 object 滑落。但是发生的是第二个 object 而不是停止并且 "drags" 沿着第一个 object.

代码如下:

    Body b1, b2;
    BodyDef def1 = new BodyDef();
    PolygonShape shape1 = new PolygonShape();
    FixtureDef fDef1 = new FixtureDef();
    def1.type = BodyType.StaticBody;
    b1 = world.createBody(def1);
    shape1.setAsBox(64 / 2 / PPM, 32 / 2 / PPM);
    b1.setTransform(20 / PPM, 0, (float)Math.toRadians(60.0));
    fDef1.shape = shape1;
    fDef1.friction = 0.0f;
    fDef1.density = 1.0f;
    b1.createFixture(fDef1);
    shape1.dispose();

    BodyDef def2 = new BodyDef();
    PolygonShape shape2 = new PolygonShape();
    FixtureDef fDef2 = new FixtureDef();
    def2.type = BodyType.DynamicBody;
    b2 = world.createBody(def2);
    shape1.setAsBox(32 / 2 / PPM, 32 / 2 / PPM);
    b2.setTransform(0, 100 / PPM, (float)Math.toRadians(60.0));
    fDef2.shape = shape2;
    fDef2.friction = 0.0f;
    fDef2.density = 1.0f;
    b2.createFixture(fDef2);
    shape2.dispose();

它们已经没有摩擦了 - 问题是 你正在另一个内部创建物体 而 Box2D 正试图推开它们。这种情况甚至在official Box2D manual中都没有提到,这让我觉得结果也可能出乎意料。

如果您的意图是创建 "one body over second" 请记住这是 Box2d - 2D ;)

要检查正在工作的机构,请将它们移动到以下位置(例如):

    b1.setTransform(new Vector2(20 / PPM, 0), (float)Math.toRadians(45.0));
    b2.setTransform(new Vector2(0, 100 / PPM), (float)Math.toRadians(45.0));

另请注意,如果其中一个物体的摩擦力设置为 0,则第二个物体的摩擦力无关紧要。您可以使用以下方法检查:

    ...
    b1.createFixture(fDef);

    shape.setAsBox(32/2, 32/2);
    fDef.shape = shape;
    fDef.friction = 1.0f; // <-- ADD THIS
    b2.createFixture(fDef);

您的代码中还有两个错误:

  1. BodyDef = new BodyDef(); 而不是 BodyDef def = new BodyDef(); 我猜是错字的结果
  2. Box2D中没有BodyType.RigidBody!你应该在那里使用 BodyType.DynamicBody