0

我试图实现一个在 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();
4

1 回答 1

1

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

我的故事:

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

有关我的案例的更多信息,以防它与任何人相关(谷歌对此几乎一无所知!):

盯着它看了很长时间后,我终于意识到它实际上并没有完全水平或垂直弹跳。基于我(诚然非常差)对物理学的理解,我认为 Box2D 中的某个地方存在错误;wlog 在水平墙上弹跳,你会期望 vx *= -1f; 但在稳定状态下它也会做 vy *= -1f。角速度没有影响(我什至尝试在body上设置固定的角度,并且每个tick单独给物体添加一个角速度抖动),并且它与body类型无关(使墙壁运动,静态和动态都产生了相同的效果)。我尝试将速度阈值设置为 0f 和默认值,并尝试使用蒙皮半径和不使用蒙皮半径。改变恢复状态会影响它在水平/垂直稳定状态下的结束时间;

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

于 2012-03-25T07:19:25.943 回答