1
\$\begingroup\$

I'm trying to make a physicsBody rotate as soon as it is instantiated.

CCNode* ball = [CCBReader load:@"Ball"]; [ball.physicsBody applyForce:force]; [ball.physicsBody applyAngularImpulse:arc4random_uniform(360) - 180];

Applying force works fine, the last line however throws an error in cpBody.c line 123: cpAssertHard(body->w == body->w && cpfabs(body->w) != INFINITY, "Body's angular velocity is invalid.");

When I don't apply force and merely rotate the problem persists. If I send applyAngularImpulse at some later point (in this case on a touch) it does work. Is this function not supposed to be called right after instantiation, or is this a bug?

\$\endgroup\$
0
\$\begingroup\$

The problem was in CCPhysicsBody.m. Upon instantiation the body's moment is 0, causing divide by zero errors, making the angular velocity NaN.

I fixed it by changing the function to the code below:

-(void)applyAngularImpulse:(CGFloat)impulse { if (_body.moment == 0) _body.angularVelocity += impulse; else _body.angularVelocity += impulse/_body.moment; }

Another error in my code was that arc4random_uniform returns an unsigned integer, thus creating very large numbers when going below 0. Casting to a signed integer solves that problem.

EDIT: This fix does however cause the object to go spinning wildly. In the didLoadFromCCB override I start a timer spawning these objects. Apparently, creating objects with physics while in this method doesn't end well. A proper workaround would be to call scheduleOnce with a delay of 0.1 on a function to apply the angular velocity properly.

\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.