## Create a rotating wheel

Official forum for the Chipmunk2D Physics Library.
Thom
Posts: 11
Joined: Tue Nov 03, 2009 6:08 am
Contact:

### Create a rotating wheel

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);

// Create the Circle
Entity.m_PhysicShape->e = 0;
Entity.m_PhysicShape->u = 0;

Entity.m_PhysicShape->data = Entity.m_EntitySprite;
Entity.m_PhysicShape->collision_type = 0;

// 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;

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.
Thom
Posts: 11
Joined: Tue Nov 03, 2009 6:08 am
Contact:

### Re: Create a rotating wheel

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
slembcke
Posts: 4164
Joined: Tue Aug 14, 2007 7:13 pm
Contact:

### Re: Create a rotating wheel

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));``
Can't sleep... Chipmunks will eat me...
Check out our latest projects! -> http://howlingmoonsoftware.com/wordpress/
Thom
Posts: 11
Joined: Tue Nov 03, 2009 6:08 am
Contact:

### Re: Create a rotating wheel

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);
``````
slembcke
Posts: 4164
Joined: Tue Aug 14, 2007 7:13 pm
Contact:

### Re: Create a rotating wheel

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?
Can't sleep... Chipmunks will eat me...
Check out our latest projects! -> http://howlingmoonsoftware.com/wordpress/
Thom
Posts: 11
Joined: Tue Nov 03, 2009 6:08 am
Contact:

### Re: Create a rotating wheel

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);
``````
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.
Thom
Posts: 11
Joined: Tue Nov 03, 2009 6:08 am
Contact:

### Re: Create a rotating wheel

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
slembcke
Posts: 4164
Joined: Tue Aug 14, 2007 7:13 pm
Contact:

### Re: Create a rotating wheel

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.
Can't sleep... Chipmunks will eat me...
Check out our latest projects! -> http://howlingmoonsoftware.com/wordpress/
Thom
Posts: 11
Joined: Tue Nov 03, 2009 6:08 am
Contact:

### Re: Create a rotating wheel

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
Thom
Posts: 11
Joined: Tue Nov 03, 2009 6:08 am
Contact:

### Re: Create a rotating wheel

Alright I fixed it !!!
I create my squares around my circle and they all have the same PivotJoin it's works perfectly now.