How to rotate a body manually in Box2D?

By | January 24, 2011

The below code helps you to rotate a body in Box2D manually.
[java]
-(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);
}
[/java]
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 *