PulleyJoint奇怪的行为Box2D

时间:2014-12-24 15:36:00

标签: java libgdx box2d

我正在尝试使用box2d和libgdx在Android游戏中构建一个杠杆。当游戏开始时,杠杆的两个平台完美平衡,当我在杠杆的一个平台上移动一个盒子时,它按预期下降但是当我将身体移出时,两个平台再次平衡和以前一样。

我正在使用此代码创建2个平台:

private Body setupShape(World world, float cx, float cy, float cw, float ch){
    Body ptf;
    PolygonShape shape = new PolygonShape();
    shape.setAsBox(cw / 2, ch / 2);
    FixtureDef fdef = new FixtureDef();
    fdef.shape = shape;
    fdef.density = 1.0f;
    fdef.friction = 1.0f;
    fdef.restitution = 0.0f;
    BodyDef bd = new BodyDef();
    //bd.allowSleep = false;
    bd.position.set(cx, cy);
    bd.fixedRotation = true;
    ptf = world.createBody(bd);
    //lever.setGravityScale(10);
    ptf.createFixture(fdef);
    ptf.setType(BodyDef.BodyType.DynamicBody);
    ptf.setUserData("Lever");
    shape.dispose();
    return ptf;
}

这个代码用于使用" PulleyJoint":

创建杠杆
PulleyJointDef pulleyDef = new PulleyJointDef();
    Vector2 bodyoneanchor = new Vector2(Constants.Pixel2SIf(360), Constants.Pixel2SIf(400));
    Vector2 bodytwoanchor = new Vector2(Constants.Pixel2SIf(660), Constants.Pixel2SIf(400));
    pulleyDef.initialize(bodyA, bodyB, bodyoneanchor, bodytwoanchor, bodyA.getWorldCenter(), bodyB.getWorldCenter(), 1);
    world.createJoint(pulleyDef);

我想知道我的代码有什么问题,以及如何在移出对象后再次重新平衡杠杆。

这是一张能够更清楚地展示我的问题的图画: http://costheta.net/quest.png

如果你能帮助我解决这个问题,我们将非常感激。

祝你好运!

更新: 添加Prismatic关节后,这是我的新代码:

PulleyJointDef pulleyDef = new PulleyJointDef();
    Vector2 bodyoneanchor = new Vector2(Constants.Pixel2SIf(360), Constants.Pixel2SIf(400));
    Vector2 bodytwoanchor = new Vector2(Constants.Pixel2SIf(660), Constants.Pixel2SIf(400));
    pulleyDef.initialize(bodyA, bodyB, bodyoneanchor, bodytwoanchor, bodyA.getWorldCenter(), bodyB.getWorldCenter(), 1);
    world.createJoint(pulleyDef);

    BodyDef bd0 = new BodyDef();
    bd0.position.set(bodyoneanchor.x, bodyoneanchor.y);
    Body ptf0 = world.createBody(bd0);
    PrismaticJointDef pjd0 = new PrismaticJointDef();
    pjd0.initialize(ptf0, bodyA, ptf0.getWorldCenter(), new Vector2(0, 1));
    pjd0.motorSpeed = 200f;
    pjd0.maxMotorForce = 30.0f;
    pjd0.enableMotor = true;
    pjd0.lowerTranslation = -Math.abs(bodyA.getWorldCenter().y - bodyoneanchor.y);
    pjd0.upperTranslation = 0;//Math.abs(bodyA.getWorldCenter().y - bodyoneanchor.y);
    pjd0.enableLimit = true;
    world.createJoint(pjd0);

    BodyDef bd1 = new BodyDef();
    bd1.position.set(bodytwoanchor.x, bodytwoanchor.y);
    Body ptf1 = world.createBody(bd1);
    PrismaticJointDef pjd1 = new PrismaticJointDef();
    pjd1.initialize(ptf1, bodyB, ptf1.getWorldCenter(), new Vector2(0, 1));
    pjd1.motorSpeed = 200f;
    pjd1.maxMotorForce = 30.0f;
    pjd1.enableMotor = true;
    pjd1.lowerTranslation = -Math.abs(bodyB.getWorldCenter().y - bodytwoanchor.y);
    pjd1.upperTranslation = 0;//Math.abs(bodyB.getWorldCenter().y - bodytwoanchor.y);
    pjd1.enableLimit = true;
    world.createJoint(pjd1);

1 个答案:

答案 0 :(得分:1)

它们不应该重新平衡,因为每一侧的重量是相同的,并且张力相互抵消,导致没有移动(得到一些字符串并在现实生活中建立设置)。

如果您想要重新平衡,请在每个平台上添加一个长度为零的弹簧放置在盒子的初始位置和中心。