jBox2D Circle最终水平或垂直移动

时间:2011-04-14 07:20:00

标签: box2d collision geometry jbox2d

我试图在4个墙之间实现一个圆圈弹跳。但是,这个圆的初始速度矢量是什么并不重要,经过一段时间它总是最终水平或垂直移动。这是正常的行为吗?如果没有,我该如何解决?

感谢您的回复。

墙:

BodyDef bd = new BodyDef();
    Body body = w.createBody(bd);
    PolygonDef sd = new PolygonDef();
    sd.density = 0.0f;
    sd.friction = 0.01f;
    sd.restitution = 1f;

    sd.setAsBox(250, 10f, new Vec2(250, 1), 0);
    body.createShape(sd);

    sd.setAsBox(250, 10f, new Vec2(250, 499), 0.0f);
    body.createShape(sd);

    sd.setAsBox(250, 10f, new Vec2(1, 250), (float) (Math.PI / 2));
    body.createShape(sd);

    sd.setAsBox(250, 10f, new Vec2(499, 250), (float) (Math.PI / 2));
    body.createShape(sd);

//圈子:

BodyDef bd = new BodyDef();
    bd.position.set((float) (Math.random() * 400 + 50), (float) (Math.random() * 400 + 50));
    //bd.isBullet = true;
    Body body = w.createBody(bd);
    Vec2 v = new Vec2((float) (Math.random() * 20 - 10), (float) (Math.random() * 20 - 10));
    System.out.println(body + "  " + v);
    body.setLinearVelocity(v);
    body.setAngularVelocity(0.1f);

    CircleDef sd = new CircleDef();
    sd.radius = (float) (Math.random() * 40 + 5);
    sd.density = 15.0f;
    sd.restitution = 0.8f;

    body.createShape(sd);
    body.setMassFromShapes();

1 个答案:

答案 0 :(得分:1)

尝试将球的夹具的摩擦力设置为0。

我的故事:

我有类似的设置和问题(4个墙,没有重力,球弹跳在里面 - 虽然在LibGDX下,而不是jBox2D)。经过几个小时的搜索和摆弄,我发现将球夹具的摩擦力设置为0使得球在墙内弹跳/反射得当。非零,它会在奇数反射角度(不是正方形/直角,如预期)反弹几次,以水平或垂直方向弹跳的稳定状态结束。

有关我的案例的更多信息,以防它与任何人相关(Google几乎没有任何内容!):

长时间盯着它后,我终于意识到它实际上并没有完全水平或垂直弹跳。根据我对物理学的理解(当然非常差),我认为Box2D中存在一个错误; w.l.o.g在水平墙上反弹你会期望v.x * = -1f;但在稳定状态下它也会做v.y * = -1f。角速度没有影响(我甚至尝试在身体上设置固定角度,并且每次勾选时分别向物体添加角速度抖动),它与身体类型无关(使墙壁具有动态,静态和动态)都产生了同样的效果)。我尝试使用速度阈值0f和默认值,并使用皮肤半径和没有。改变恢复原状会影响在水平/垂直稳定状态下结束所需的时间;但它总是达到它。

效果可能与(基于声称在无重力空间中速度影响反射角度的声称发生的事情有关):http://www.box2d.org/forum/viewtopic.php?f=3&t=7716