True Axis Physics SDK 1.2.0.1 Beta Documentation
www.trueaxis.com

SlipRatioToNormalisedTractionExample.cpp

Example of a slip ratio to normalised traction function.

//---------------------------------------------------------------------------------
// 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;
    }
}


© Copyright 2004-2006 TRUE AXIS PTY LTD Australia. All rights reserved.