//--------------------------------------------------------------------------------- // Standard Slip Ratio To Normalised Traction Example //--------------------------------------------------------------------------------- #include "TA/Common/Maths.h" #include "TA/Common/Geometry.h" //--------------------------------------------------------------------------------- // An implementation of TA::CarTemplate::FnSlipRatioToNormalisedTraction //--------------------------------------------------------------------------------- float TAC_CALL StandardSlipRatioToNormalisedTraction(float fSlipRatio, const SurfaceAttribute& surfaceAttribute) { const float fInitialGradient = 7.0f; const float fEndGradient = -0.2f; const float fEndOffset = 1.2f; const float fSegmentEndA = 0.12f; const float fSegmentEndB = 0.25f; const float fSegmentEndAOut = fInitialGradient * fSegmentEndA; const float fSegmentEndBOut = fEndGradient * fSegmentEndB + fEndOffset; const float fInvSegBLength = 1.0f / (fSegmentEndB - fSegmentEndA); const float fCubicGradA = fInitialGradient * (fSegmentEndB - fSegmentEndA); const float fCubicGradB = fEndGradient * (fSegmentEndB - fSegmentEndA); float fSign = TA::Sign(fSlipRatio); fSlipRatio *= fSign; fSign *= 8.0f; if (fSlipRatio < fSegmentEndA) { // As the slip ratio increases from zero // the traction increases linearly. return fSign * fInitialGradient * fSlipRatio; } else if (fSlipRatio < fSegmentEndB) { // As the slip ratio approaches its optimal level // the increase traction slows so a stop // then begins to fall away. // This means the wheels start slipping rather then gripping return fSign * TA::Geometry::CubicInterpolate( fSegmentEndAOut, fSegmentEndBOut, fCubicGradA, fCubicGradB, (fSlipRatio - fSegmentEndA) * fInvSegBLength); } else { // As slip ratio moves well past its optimal level // traction linearily decreases towards zero. float fValue = fEndGradient * fSlipRatio + fEndOffset; if (fValue < 0.0f) fValue = 0.0f; return fSign * fValue; } }