How to rotate a body manually in Box2D?

By | June 21, 2012

The below code helps you to rotate a body in Box2D manually.

-(void) start
{
    rot_sprite = [CCSprite spriteWithFile:[NSString stringWithFormat:@"rot_sprite.png" ]];
    [self addChild: rot_sprite];
    b2BodyDef bodyDef;
    b2Vec2 initVel;
    b2PolygonShape shape;
    b2CircleShape circleShape;
    b2FixtureDef fd;
    b2Body * rotating_body;
    b2RevoluteJointDef revJointDef;
    b2DistanceJointDef jointDef;
    b2Vec2 pos;
    bodyDef.position.Set(11.043825f, 4.984064f);
    bodyDef.angle = 0.000000f;
    bodyDef.userData = rot_sprite;
    rotating_body = world->CreateBody(&bodyDef;);
    initVel.Set(0.000000f, 0.000000f);
    rotating_body->SetLinearVelocity(initVel);
    rotating_body->SetAngularVelocity(0.000000f);
    b2Vec2 rotating_body_vertices[4];
    rotating_body_vertices[0].Set(-0.143426f, -1.565737f);
    rotating_body_vertices[1].Set(0.143426f, -1.565737f);
    rotating_body_vertices[2].Set(0.143426f, 1.565737f);
    rotating_body_vertices[3].Set(-0.143426f, 1.565737f);
    shape.Set(rotating_body_vertices, 4);
    fd.shape = &shape;
    fd.density = 0.015000f;
    fd.friction = 0.300000f;
    fd.restitution = 0.600000f;
    fd.filter.groupIndex = int16(0);
    fd.filter.categoryBits = uint16(65535);
    fd.filter.maskBits = uint16(65535);
    rotating_body->CreateFixture(&fd;);
 
            //calling the schedular at intervals to rotate the body.
 
    [self schedule: @selector(rotateBody) interval:0.01];
}
-(void)rotateBody
{
    angle += 0.02;
    b2Vec2 pos = rotating_body.GetPosition();
    rotating_body.SetTransform(pos, angle);
}

Here the body is named “rotating_body” which is going to rotate and a sprite named “rot_sprite” is it’s userData, please give your own image for it.
Make sure that you have it in your resources otherwise your program will crash.

Note: call this function in a schedular for the body, here-rotating_body to rotate.
Adjust the angle and the schedular-interval for better results.

Leave a Reply

Your email address will not be published. Required fields are marked *