Box2d中动态和静态物体之间的约束行为

时间:2016-01-03 04:20:52

标签: java android libgdx box2d physics

我在游戏画面的周边创建了链形状(静态物体),其尺寸为:

    (2f*camera.viewportWidth,2f*camera.viewportHeight).

每个链形的密度为5f

我还创建了一个圆形(动态体)

    density = 0.5f 
    friction = 0.25f
    restitution =0.2f. 

此外,我创建了一个多边形形状设置为盒形(动态体),它具有与圆形相同的密度,恢复和摩擦力。

世界的引力是(0,-5.8f)

所有形状都适当渲染。然而,盒子形状只是一直穿过位于屏幕底部的底链形状。圆形不会通过,但盒子形状确实通过。我不希望这种情况发生。盒子形状的大小是

    (1.96f*camera.viewportWidth, 1.96f*camera.viewportHeight). 

此身体的位置(盒子形状)设置为

    (0.02f*camera.viewportWidth, 0.02f*camera.viewportHeight). 

我不知道为什么箱子的形状会不断下降并且不会被底链形状阻挡,就像圆形的形状停止一样。谁能提供任何见解?

此外,我试图设置我的box2d世界的原因是当我使用camera.translate移动世界时消除一些相机滞后运动。我的想法是通过对其身体施加线性速度来移动盒子形状。请任何想法将不胜感激。

1 个答案:

答案 0 :(得分:0)

您可能没有在这些灯具上设置filtering。看一下下面的例子

    FixtureDef f = new FixtureDef();

    f.density = density;
    f.friction = friction;
    f.restitution = restitution;

现在,如果您希望Box2D为您处理碰撞,您应该通过分配categoryBitsmaskBits来判断它与哪个碰撞,并且您正在这样做:

    f.filter.categoryBits = categoryBits; //who am I?
    f.filter.maskBits = maskBits;         //with who I will collide?

位应为short类型且 2的幂 - 您不能将两个位定义为相同的值。您可以使用逻辑和(' | '运算符)设置多个maskBits。

    public static final short BIT_F1 = 2;
    public static final short BIT_F2 = 8;
    public static final short BIT_F3 = 32;

    FixtureDef f1, f2, f3;

    //creating f1, f2, f3...

    f1.filter.categoryBits = BIT_F1;
    f2.filter.categoryBits = BIT_F2;
    f3.filter.categoryBits = BIT_F3;

    f1.filter.maskBits = BIT_F1; //now every body having f1 fixture will collide with another f1
    f2.filter.maskBits = BIT_F1; //f2 will collide with f1
    f3.filter.maskBits = (short)(BIT_F1 | BIT_F2 | BIT_F3); //f3 collides with everything

请注意,如果你想要夹具避免任何碰撞,你可以像sensor一样:

    f.isSensor = sensor;

Here is link to official documentation虽然说实话并不是很有帮助。