Page 1 of 2

Create a rotating wheel

Posted: Tue Nov 03, 2009 6:13 am
by Thom
Hello,
I would like to create a rotationg wheel with chipmunk which means one main circle and couple of edges

Code: Select all

// Create the body
	Entity.m_PhysicBody = cpBodyNew(fMass, fMoment);
	Entity.m_PhysicBody->p = [RESOURCES ConvertCocos2DPointToChipmunkPoint:PPosition];
	cpBodySetAngle(Entity.m_PhysicBody, fAngle);
	cpSpaceAddBody(space, Entity.m_PhysicBody);
	
	// Create the Circle
	Entity.m_PhysicShape = cpCircleShapeNew(Entity.m_PhysicBody, Radius, cpvzero);
	Entity.m_PhysicShape->e = 0; 
	Entity.m_PhysicShape->u = 0; 
	
	Entity.m_PhysicShape->data = Entity.m_EntitySprite;
	Entity.m_PhysicShape->collision_type = 0;
	cpSpaceAddShape(space, Entity.m_PhysicShape);
	
	// Create the Rectangles
	// Define our shape's vertexes
	int width = 30;
	int height = 35;
	
	cpVect verts0[4] = {cpv(-width/2,height/2), cpv(width/2, height/2), cpv(width/2, -height/2), cpv(-width/2,-height/2)};
	
	float angle = (2*3.14)/Edges;
	float currentangle = 0;
	int offset = Radius + width/2;
	
	for (int i=0; i<Edges; i++) {
		// Create a obstacle	
		Entity.m_PhysicShape = cpPolyShapeNew(Entity.m_PhysicBody, 4, verts0, cpv(cos(currentangle)*offset,sin(currentangle)*offset));
		Entity.m_PhysicShape->e = 0.3; 
		Entity.m_PhysicShape->u = 0.3; 
		Entity.m_PhysicShape->data = tempsprite;
		Entity.m_PhysicShape->collision_type = 0;
		cpSpaceAddShape(space, Entity.m_PhysicShape);
		
		currentangle += angle;
	}
it's working if the wheel doesn't rotate, as soon as I rotate the body, my ball pass through the edges with a weird behaviour, the ball should bounce on the edge of the wheel.
Thanks for your time

Re: Create a rotating wheel

Posted: Tue Nov 03, 2009 9:30 am
by Thom
oki I've tried a different way but I'm still having trouble.
Just for testing I create my main circle and a polygon. it works fine
And then I try to add a joint between those 2 entities and they both disappear from the screen, theirs bodies positions are NaN

Code: Select all

	cpSpaceAddJoint(space, cpPinJointNew(Entity.m_PhysicBody,tempbody,cpv(Radius,0.0),cpv(-15.0,0.0)));
I'm not sure about the two vectors. It's the offset from the center of the entity right ?
Thanks

Re: Create a rotating wheel

Posted: Tue Nov 03, 2009 9:38 am
by slembcke
Not quite sure what you are doing exactly. A couple of things I don't understand:

What are the edges for exactly? They aren't square, and you are attaching them around the edge without rotating them. I'm guessing that's not really what you meant. What ball is supposed to bounce? How are you rotating the wheel exactly?

You are also overwriting this instance variable several times in your for loop:

Code: Select all

      Entity.m_PhysicShape = cpPolyShapeNew(Entity.m_PhysicBody, 4, verts0, cpv(cos(currentangle)*offset,sin(currentangle)*offset));

Re: Create a rotating wheel

Posted: Tue Nov 03, 2009 9:45 am
by Thom
The edges are squares attached to the wheel. And I want those squares to rotates with the wheel.
The ball is another physic entity that I've created and which move around. basically you move the ball around on your ipod and the wheel is an obstacle.

To rotate the wheel I do

Code: Select all

m_fangle += 0.1;
cpBodySetAngle(m_PhysicBody, m_fangle);

Re: Create a rotating wheel

Posted: Tue Nov 03, 2009 9:45 am
by slembcke
Thom wrote:oki I've tried a different way but I'm still having trouble.
Just for testing I create my main circle and a polygon. it works fine
And then I try to add a joint between those 2 entities and they both disappear from the screen, theirs bodies positions are NaN

Code: Select all

	cpSpaceAddJoint(space, cpPinJointNew(Entity.m_PhysicBody,tempbody,cpv(Radius,0.0),cpv(-15.0,0.0)));
I'm not sure about the two vectors. It's the offset from the center of the entity right ?
Thanks
Yes, the offsets are from the center of each body. What are you doing with tempbody exactly?

Re: Create a rotating wheel

Posted: Tue Nov 03, 2009 9:51 am
by Thom
Oh yes sorry I forgot this piece of code

Code: Select all

	float offset = Radius + width/2;

	tempbody = cpBodyNew(fMass, fMoment);
	tempbody->p = cpv(Entity.m_PhysicBody->p.x + (cos(currentangle)*offset) ,Entity.m_PhysicBody->p.y + (sin(currentangle)*offset));
	cpBodySetAngle(tempbody, fAngle);
	cpSpaceAddBody(space, tempbody);
So I add this square to the right of my wheel and I would like to attach it to the wheel, then when I rotate the wheel the square rotates with it.

Re: Create a rotating wheel

Posted: Tue Nov 03, 2009 10:39 am
by Thom
Oki forget about the post before, it's fixed now, I wasn't setting the Masse properly.
But....
When I rotate my wheel without the joint with the function

Code: Select all

cpBodySetAngle(m_PhysicBody, m_fangle);
it works fine.
As soon as I add the PinJoint the rotation of the wheel stop at some point and come back to its initial position, and the square is not rotating with the wheel
Any ideas?
Thanks

Re: Create a rotating wheel

Posted: Tue Nov 03, 2009 11:09 am
by slembcke
You shouldn't move things by setting position/rotation explicitly. What happens is that you move the object, but you don't update it's rotational velocity. When things collide with it, they won't know how fast it's moving. They will only know that they somehow started overlapping with it and will get pushed apart by a corrective force that is much smaller than the one it needs for a collision with a moving object.

Not quite sure what you are trying to do with the pin joint, but I think maybe you need some other kind of joint. A pin joint attaches the two anchor points on each body by a pin or rod so that the anchor points stay the same distance apart as when the joint was created.

Re: Create a rotating wheel

Posted: Tue Nov 03, 2009 11:19 am
by Thom
Ok I attached a sprite of the wheel because I don't think it's clear for everyone.
[img]wheel_large.png[/img]
So I have one main wheel and 4 squares around, I want when I rotate the wheel taht the squares rotates as well.
What kind of joint do you recommend ?
Thanks a lot for your help

Re: Create a rotating wheel

Posted: Tue Nov 03, 2009 12:04 pm
by Thom
Alright I fixed it !!!
I create my squares around my circle and they all have the same PivotJoin it's works perfectly now.
Thank you for your help
Bye