2
votes

I am trying to build a lever in an android game using box2d and libgdx. When the game starts, the 2 platforms of the lever are balancing perfectly and when I move a box on one platform of the lever, it goes down as expected but when I move the body out, the 2 platforms doesn't balance again as before.

I am using this code to create the 2 platforms:

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;
}

And this code for creating the lever using "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);

I would like to know what's wrong with my code and how to make the lever re-balance again after moving out objects from it.

Here's a drawing to demonstrate my problem more clearly: http://costheta.net/quest.png

It will be very much appreciated if you could help me fixing that problem.

Best regards!

UPDATE: Here's my new code after adding Prismatic joints:

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

1 Answers

1
votes

They shouldn't re-balance because the weight of each side is the same and the tensions cancel each other out, resulting in no movement (get some string and build the setup in real life).

If you want it to re-balance, add a spring on each platform with a length of zero placed on the initial position and center of the box.