OpenGL 任意の軸での回転

OpenGLで任意の軸回転をしたいと思っていた.
x,y,z軸回転に変換してglRotatefを使わなくてもいいコードがあったのでメモ.

#define RADIAN( n ) ( ( n ) * ( 3.1415926535897932384626 / 180.0 ) )

void FreeRotate( float n[3], float r )
{
    float v[16];
    float w =(float)cos( RADIAN( r ) / 2.0f );
    float w2 = w * w;
    float s = (float)sin( RADIAN( r ) / 2.0f );
    float x = n[0] * s;
    float y = n[1] * s;
    float z = n[2] * s;
    float x2 = x * x;
    float y2 = y * y;
    float z2 = z * z;

    v[0] = w2 + x2 - y2 - z2;
    v[4] = 2 * ( ( x * y ) - ( w * z ) );
    v[8] = 2 * ( ( x * z ) + ( w * y ) );
    v[12] = 0.0f;

    v[1] = 2 * ( ( x * y ) + ( w * z ) );
    v[5] = w2 - x2 + y2 - z2;
    v[9] = 2 * ( ( y * z ) - ( w * x ) );
    v[13] = 0.0f;

    v[2] = 2 * ( ( x * z ) - ( w * y ) );
    v[6] = 2 * ( ( y * z ) + ( w * x ) );
    v[10] = w2 - x2 - y2 + z2;
    v[14] = 0.0f;

    v[3] = 0.0f;
    v[7] = 0.0f;
    v[11] = 0.0f;
    v[15] = 1.0f;

    glMultMatrixf( v );
}