在我的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();
答案 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);
您的代码中还有两个错误:
BodyDef = new BodyDef();
而非BodyDef def = new BodyDef();
这是错字导致我猜BodyType.RigidBody
!您应该使用BodyType.DynamicBody
那里