title: Revolute Joints in box2d
body: <p>I have been trying to follow <a href="http://www.iforce2d.net/b2dtut/joints-revolute" rel="nofollow">the tutorial here</a> to construct a revolving joint; essentially, an arm.
  I need the arm, a rectangle, to be pinned to a point on a square and revolve around it. When force is applied I expect the two shapes to behave as one, pinned together while the arm flies around the box like a ragdoll.</p>
  
  <p>Unfortunately, this is not working at all. The arm is joined at first, then when I apply force the two shapes separate and behave in strange ways that I cannot explain. Its almost as though the anchors were in some wonky positions.</p>
  
  <p>I'm using jbox2d and a lot of the code from <a href="http://www.youtube.com/watch?v=ZKJC2cloIqc" rel="nofollow">this tutorial</a> also.</p>
  
  <p>(I have set the initial anchors to the centres just to see if it will work)
  (There are some strange conversions because I am using openGl)</p>
  
  <p>Here's the gist:</p>
  
  <pre><code>    public class New_char
      {
      Vec2             torso_pos,    arm_pos;
      Body             torso,        arm;
      PolygonShape     torso_shape,  arm_shape;
      BodyDef          torso_def,    arm_def;
      FixtureDef       torso_fix,    arm_fix;
  
      RevoluteJointDef torsoArmDef; 
      RevoluteJoint    torsoArmJoint; 
  
      //float[] torSize = {0.5f, 0.5f}, armSize={0.75f, 0.10f};
  
  
      public New_char(World world, float[] pos)
      {
          //this.torso_pos = new Vec2(pos[0], pos[1]) ;   this.arm_pos = new Vec2(pos[0]+10,pos[1]+10);   
          //out.println(this.arm_pos+" thepos "+this.torso_pos);
  
          this.torso_def = new BodyDef()            ;  this.arm_def = new BodyDef();
          torso_def.type = BodyType.DYNAMIC         ;  arm_def.type = BodyType.DYNAMIC;
          torso_def.position.set(320 / 30 / 2, 240 / 30 / 2)    ;  arm_def.position.set(320 / 30 / 2, 240 / 30 / 2);
  
          this.torso_shape = new PolygonShape()     ;  this.arm_shape = new PolygonShape();
          this.torso_shape.setAsBox(0.50f, 0.50f)   ;  this.arm_shape.setAsBox(0.75f, 0.10f);
  
          this.torso_fix = new FixtureDef()         ;  this.arm_fix = new FixtureDef();
          this.torso_fix.density = 0.1f             ;  this.arm_fix.density = 0.5f;
          this.torso_fix.shape = this.torso_shape   ;  this.arm_fix.shape = this.arm_shape;
  
          this.torso = world.createBody(this.torso_def) ;  this.arm = world.createBody(this.arm_def);
          this.torso.createFixture(this.torso_fix)      ;  this.arm.createFixture(this.arm_fix);
  
          this.torsoArmDef = new RevoluteJointDef();
          this.torsoArmDef.bodyA = this.torso ; this.torsoArmDef.bodyB = this.arm;
          this.torsoArmDef.collideConnected = false;
          this.torsoArmDef.localAnchorA.set(this.torso.getWorldCenter());
          //Vec2 armpin = new Vec2(1f, 1f);
          this.torsoArmDef.localAnchorB.set(this.arm.getWorldCenter());
          this.torsoArmJoint = (RevoluteJoint)world.createJoint(this.torsoArmDef);
  </code></pre>