【问题标题】:Box2D non-friction bodyBox2D 非摩擦体
【发布时间】:2016-02-20 20:16:37
【问题描述】:

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

这个世界的重力为 9.8 m/s,每米像素 (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();

【问题讨论】:

    标签: java libgdx box2d


    【解决方案1】:

    它们已经没有摩擦了 - 问题是 你正在另一个体内创造身体,而 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

    【讨论】:

    • 感谢您的回答。我现在在想我想要的东西在 Box2D 中并不适用。我已经更正了代码,所以如果您想自己尝试并检查以获得相同的结果,我将非常感激。
    • 您的代码现在创建了两个旋转的多边形 - 一个高于第二个 - 一个正在下落,与第二个幻灯片发生碰撞,没有摩擦。是你的目标吗? - 如果是,这就是我看到的结果
    猜你喜欢
    • 2021-03-15
    • 1970-01-01
    • 1970-01-01
    • 2015-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多