Box2D无摩擦体

时间:2016-02-20 20:16:37

标签: java libgdx box2d

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

世界的重力为9.8米/秒,每米像素(PPM)为32.我想要的是两个完全没有摩擦的物体。在我的示例代码中,第二个主体落在第一个主体上。当身体没有摩擦时,我期望发生的是第二个物体滑落。然而,会发生的是第二个对象停止而且"拖动"沿着第一个对象。

以下是代码:

    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();

1 个答案:

答案 0 :(得分:0)

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

如果你打算创造一个超过第二个身体的身体。请记住,这是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那里