Recently I've started using a damping smaller than 1 on cpSpace.
Setting a constant velocity with cpBodySetVel was not very usefull after that.
To keep a constant velocity/angularVelocity on bodies, they needed a force/torque to be applied.
As calculating that is not really simple, these two misc functions were created to help, such as cpMomentForCircle.
They're based on cpBodyUpdateVelocity, isolating body->f and body->t.
Code: Select all
cpVect
cpForceForConstantVelocity(cpBody *body, cpVect velocity)
{
cpAssertHard(!cpBodyIsStatic(body), "Body must not be static.");
cpFloat mass = cpBodyGetMass(body);
cpAssertHard(mass != INFINITY, "Mass must not be infinity.");
cpSpace *space = cpBodyGetSpace(body);
cpFloat dt = cpSpaceGetCurrentTimeStep(space);
cpFloat dt_inv = 1. / dt;
cpFloat damping = cpSpaceGetDamping(space);
cpVect gravity = cpSpaceGetGravity(space);
// f = ((v - g*dt - v*d^dt) * m) / dt
return cpvmult(cpvmult((cpvsub(cpvsub(velocity, cpvmult(gravity, dt)), cpvmult(velocity, cpfpow(damping, dt)))), mass), dt_inv);
}
cpFloat
cpTorqueForConstantAngularVelocity(cpBody *body, cpFloat angularVelocity)
{
cpAssertHard(!cpBodyIsStatic(body), "Body must not be static.");
cpFloat moment = cpBodyGetMoment(body);
cpAssertHard(moment != INFINITY, "Moment must not be infinity.");
cpSpace *space = cpBodyGetSpace(body);
cpFloat dt = cpSpaceGetCurrentTimeStep(space);
cpFloat damping = cpSpaceGetDamping(space);
// t = (m * w * (1 - d^dt)) / dt
return (moment * angularVelocity * (1 - cpfpow(damping, dt))) / dt;
}
This is a fine solution for now, however it would be less expansive to replace update velocity function of objects that I need to keep constant velocity.
It would be nice if Chipmunk have a few built-in cpBodyUpdateVelocity functions as:
ignore gravity, ignore velocity damping, ignore angular velocity damping
Thanks