How to rotate a body manually in Box2D?

By | January 24, 2011

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 *