heres how im doing it for my physics...

[pascal]
var
LVelocity: TRAGEVector3;
LCurVel: TRAGEVector3;
LLength: Single;
LMass: Single;
LTimeSlice: Single;

...

LCurVel := rpGetBodyVelocity(FPhysicsWorld, LPhysicsBallIndex);
LLength := VectorLength(LCurVel);

if LLength > GMaxSpeed then
Begin
LMass := rpGetBodyMass(FPhysicsWorld, LPhysicsBallIndex);
LTimeSlice := rpGetWorldTimeSlice(FPhysicsWorld);

LVelocity := VectorScale(LCurVel, GMaxSpeed / LLength);
rpSetBodyForces(FPhysicsWorld, LPhysicsBallIndex,
LMass * ((LVelocity[0] - LCurVel[0]) / LTimeSlice),
0, // dont change Y, otherwise it flies off if it goes up a ramp
LMass * ((LVelocity[2] - LCurVel[2]) / LTimeSlice));
end;
[/pascal]

time slice is in seconds, and it uses inverse dynamics to set the speed (and its pretty acuret).

gMaxSpeed is in meters per second


forces needed to get speed = Mass * (desired velocity - current velocity) / time step