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);
您的代码中还有两个错误:
BodyDef = new BodyDef();
而不是 BodyDef def = new BodyDef();
我猜是错字的结果
- Box2D中没有
BodyType.RigidBody
!你应该在那里使用 BodyType.DynamicBody
在我的 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);
您的代码中还有两个错误:
BodyDef = new BodyDef();
而不是BodyDef def = new BodyDef();
我猜是错字的结果- Box2D中没有
BodyType.RigidBody
!你应该在那里使用BodyType.DynamicBody