以下是两个矩阵逆,列主序,OpenGl里面用的// Computes the inverse matrix of a 3x3 colum-mojor matrix.
BOOL GenerateInverseMatrix3f(float i[9], const float m[9])
{
  float x=glmDeterminant3f(m);
  if (x==0) return FALSE;  i[0]=(-m[7]*m[5]+m[4]*m[8])/x;
  i[3]=( m[6]*m[5]-m[3]*m[8])/x;
  i[6]=(-m[6]*m[4]+m[3]*m[7])/x;
  i[1]=( m[7]*m[2]-m[1]*m[8])/x;
  i[4]=(-m[6]*m[2]+m[0]*m[8])/x;
  i[7]=( m[6]*m[1]-m[0]*m[7])/x;
  i[2]=(-m[4]*m[2]+m[1]*m[5])/x;
  i[5]=( m[3]*m[2]-m[0]*m[5])/x;
  i[8]=(-m[3]*m[1]+m[0]*m[4])/x;  return TRUE;
}// Computes the inverse matrix of a OpenGL style 4x4 column-mojor matrix.
BOOL GenerateInverseMatrix4f(float i[16], const float m[16])
{
  float x=glmDeterminant4f(m);
  if (x==0) return FALSE;  i[0]= (-m[13]*m[10]*m[7] +m[9]*m[14]*m[7] +m[13]*m[6]*m[11]
         -m[5]*m[14]*m[11] -m[9]*m[6]*m[15] +m[5]*m[10]*m[15])/x;
  i[4]= ( m[12]*m[10]*m[7] -m[8]*m[14]*m[7] -m[12]*m[6]*m[11]
         +m[4]*m[14]*m[11] +m[8]*m[6]*m[15] -m[4]*m[10]*m[15])/x;
  i[8]= (-m[12]*m[9]* m[7] +m[8]*m[13]*m[7] +m[12]*m[5]*m[11]
         -m[4]*m[13]*m[11] -m[8]*m[5]*m[15] +m[4]*m[9]* m[15])/x;
  i[12]=( m[12]*m[9]* m[6] -m[8]*m[13]*m[6] -m[12]*m[5]*m[10]
         +m[4]*m[13]*m[10] +m[8]*m[5]*m[14] -m[4]*m[9]* m[14])/x;
  i[1]= ( m[13]*m[10]*m[3] -m[9]*m[14]*m[3] -m[13]*m[2]*m[11]
         +m[1]*m[14]*m[11] +m[9]*m[2]*m[15] -m[1]*m[10]*m[15])/x;
  i[5]= (-m[12]*m[10]*m[3] +m[8]*m[14]*m[3] +m[12]*m[2]*m[11]
         -m[0]*m[14]*m[11] -m[8]*m[2]*m[15] +m[0]*m[10]*m[15])/x;
  i[9]= ( m[12]*m[9]* m[3] -m[8]*m[13]*m[3] -m[12]*m[1]*m[11]
         +m[0]*m[13]*m[11] +m[8]*m[1]*m[15] -m[0]*m[9]* m[15])/x;
  i[13]=(-m[12]*m[9]* m[2] +m[8]*m[13]*m[2] +m[12]*m[1]*m[10]
         -m[0]*m[13]*m[10] -m[8]*m[1]*m[14] +m[0]*m[9]* m[14])/x;
  i[2]= (-m[13]*m[6]* m[3] +m[5]*m[14]*m[3] +m[13]*m[2]*m[7]
         -m[1]*m[14]*m[7]  -m[5]*m[2]*m[15] +m[1]*m[6]* m[15])/x;
  i[6]= ( m[12]*m[6]* m[3] -m[4]*m[14]*m[3] -m[12]*m[2]*m[7]
         +m[0]*m[14]*m[7]  +m[4]*m[2]*m[15] -m[0]*m[6]* m[15])/x;
  i[10]=(-m[12]*m[5]* m[3] +m[4]*m[13]*m[3] +m[12]*m[1]*m[7]
         -m[0]*m[13]*m[7]  -m[4]*m[1]*m[15] +m[0]*m[5]* m[15])/x;
  i[14]=( m[12]*m[5]* m[2] -m[4]*m[13]*m[2] -m[12]*m[1]*m[6]
         +m[0]*m[13]*m[6]  +m[4]*m[1]*m[14] -m[0]*m[5]* m[14])/x;
  i[3]= ( m[9]* m[6]* m[3] -m[5]*m[10]*m[3] -m[9]* m[2]*m[7]
         +m[1]*m[10]*m[7]  +m[5]*m[2]*m[11] -m[1]*m[6]* m[11])/x;
  i[7]= (-m[8]* m[6]* m[3] +m[4]*m[10]*m[3] +m[8]* m[2]*m[7]
         -m[0]*m[10]*m[7]  -m[4]*m[2]*m[11] +m[0]*m[6]* m[11])/x;
  i[11]=( m[8]* m[5]* m[3] -m[4]*m[9]* m[3] -m[8]* m[1]*m[7]
         +m[0]*m[9]* m[7]  +m[4]*m[1]*m[11] -m[0]*m[5]* m[11])/x;
  i[15]=(-m[8]* m[5]* m[2] +m[4]*m[9]* m[2] +m[8]* m[1]*m[6]
         -m[0]*m[9]* m[6]  -m[4]*m[1]*m[10] +m[0]*m[5]* m[10])/x;  return TRUE;
}