FgMatrixC<T,3,3>
fgMatRotateAxis(                   // RHR rotation around an arbitrary axis
    T           radians, 
    const       FgMatrixC<T,3,1> &axis)             // vector describing that axis
{
    FgMatrixC<T,3,3> mat;
    FgTypeAttributeFloatingS<T>();
    T           len = axis.length();
    FGASSERT(len > T(0));
    FgMatrixC<T,3,1>    ax = axis * (T(1) / len);   // Ensure the rotation axis is normalized
    T           ct = (T)cos(radians);
    T           st = (T)sin(radians);
    T           vt = T(1)-ct;
    mat.elem(0,0) = ax[0]*ax[0]*vt + ct;
    mat.elem(0,1) = ax[0]*ax[1]*vt - ax[2]*st;
    mat.elem(0,2) = ax[0]*ax[2]*vt + ax[1]*st;
    mat.elem(1,0) = ax[0]*ax[1]*vt + ax[2]*st;
    mat.elem(1,1) = ax[1]*ax[1]*vt + ct;
    mat.elem(1,2) = ax[1]*ax[2]*vt - ax[0]*st;
    mat.elem(2,0) = ax[0]*ax[2]*vt - ax[1]*st;
    mat.elem(2,1) = ax[1]*ax[2]*vt + ax[0]*st;
    mat.elem(2,2) = ax[2]*ax[2]*vt + ct;
    return mat;
}
FgMatrixC<T,nrows,ncols>
fgNormalize(FgMatrixC<T,nrows,ncols> m)
{
    return m / m.length();
}