internal float ApplyImpulse()
{
//Compute relative velocity
float lambda = (RelativeVelocity
- targetSpeed) //Add in the extra goal speed
* velocityToImpulse; //convert to impulse
//Clamp accumulated impulse
float previousAccumulatedImpulse = accumulatedImpulse;
accumulatedImpulse += lambda;
//Don't brake, and take into account the motor's maximum force.
if (targetSpeed > 0)
accumulatedImpulse = MathHelper.Clamp(accumulatedImpulse, 0, maxMotorForceDt); //MathHelper.Min(MathHelper.Max(accumulatedImpulse, 0), myMaxMotorForceDt);
else if (targetSpeed < 0)
accumulatedImpulse = MathHelper.Clamp(accumulatedImpulse, maxMotorForceDt, 0); //MathHelper.Max(MathHelper.Min(accumulatedImpulse, 0), myMaxMotorForceDt);
else
accumulatedImpulse = 0;
//Friction
float maxForce = currentFrictionCoefficient * wheel.suspension.accumulatedImpulse;
accumulatedImpulse = MathHelper.Clamp(accumulatedImpulse, maxForce, -maxForce);
lambda = accumulatedImpulse - previousAccumulatedImpulse;
//Apply the impulse
#if !WINDOWS
Vector3 linear = new Vector3();
Vector3 angular = new Vector3();
#else
Vector3 linear, angular;
#endif
linear.X = lambda * linearAX;
linear.Y = lambda * linearAY;
linear.Z = lambda * linearAZ;
if (vehicleEntity.isDynamic)
{
angular.X = lambda * angularAX;
angular.Y = lambda * angularAY;
angular.Z = lambda * angularAZ;
vehicleEntity.ApplyLinearImpulse(ref linear);
vehicleEntity.ApplyAngularImpulse(ref angular);
}
if (supportIsDynamic)
{
linear.X = -linear.X;
linear.Y = -linear.Y;
linear.Z = -linear.Z;
angular.X = lambda * angularBX;
angular.Y = lambda * angularBY;
angular.Z = lambda * angularBZ;
supportEntity.ApplyLinearImpulse(ref linear);
supportEntity.ApplyAngularImpulse(ref angular);
}
return lambda;
}