我试图在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();
答案 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