GLProgramming.com

home :: about :: development guides :: irc :: forums :: search :: paste :: links :: contribute :: code dump

-> Click here to learn how to get live help <-


New Paste :: Recent Pastes:: No Line Numbers


invert matrix by irid
1
 
/* code to invert a 4x4 matrix */

  void Invert( GLfloat *m )
  {
    float d, mn[16];
    mn[0]  = (m[6]*m[11]*m[13]) - (m[7]*m[10]*m[13]) + (m[7]*m[9]*m[14]) - (m[5]*m[11]*m[14]) - (m[6]*m[9]*m[15]) + (m[5]*m[10]*m[15]);
    mn[1]  = (m[3]*m[10]*m[13]) - (m[2]*m[11]*m[13]) - (m[3]*m[9]*m[14]) + (m[1]*m[11]*m[14]) + (m[2]*m[9]*m[15]) - (m[1]*m[10]*m[15]);
    mn[2]  = (m[2]*m[7]*m[13])  - (m[3]*m[6]*m[13])  + (m[3]*m[5]*m[14]) - (m[1]*m[7]*m[14])  - (m[2]*m[5]*m[15]) + (m[1]*m[6]*m[15]);
    mn[3]  = (m[3]*m[6]*m[9])   - (m[2]*m[7]*m[9])   - (m[3]*m[5]*m[10]) + (m[1]*m[7]*m[10])  + (m[2]*m[5]*m[11]) - (m[1]*m[6]*m[11]);
    mn[4]  = (m[7]*m[10]*m[12]) - (m[6]*m[11]*m[12]) - (m[7]*m[8]*m[14]) + (m[4]*m[11]*m[14]) + (m[6]*m[8]*m[15]) - (m[4]*m[10]*m[15]);
    mn[5]  = (m[2]*m[11]*m[12]) - (m[3]*m[10]*m[12]) + (m[3]*m[8]*m[14]) - (m[0]*m[11]*m[14]) - (m[2]*m[8]*m[15]) + (m[0]*m[10]*m[15]);
    mn[6]  = (m[3]*m[6]*m[12])  - (m[2]*m[7]*m[12])  - (m[3]*m[4]*m[14]) + (m[0]*m[7]*m[14])  + (m[2]*m[4]*m[15]) - (m[0]*m[6]*m[15]);
    mn[7]  = (m[2]*m[7]*m[8])   - (m[3]*m[6]*m[8])   + (m[3]*m[4]*m[10]) - (m[0]*m[7]*m[10])  - (m[2]*m[4]*m[11]) + (m[0]*m[6]*m[11]);
    mn[8]  = (m[5]*m[11]*m[12]) - (m[7]*m[9]*m[12])  + (m[7]*m[8]*m[13]) - (m[4]*m[11]*m[13]) - (m[5]*m[8]*m[15]) + (m[4]*m[9]*m[15]);
    mn[9]  = (m[3]*m[9]*m[12])  - (m[1]*m[11]*m[12]) - (m[3]*m[8]*m[13]) + (m[0]*m[11]*m[13]) + (m[1]*m[8]*m[15]) - (m[0]*m[9]*m[15]);
    mn[10] = (m[1]*m[7]*m[12])  - (m[3]*m[5]*m[12])  + (m[3]*m[4]*m[13]) - (m[0]*m[7]*m[13])  - (m[1]*m[4]*m[15]) + (m[0]*m[5]*m[15]);
    mn[11] = (m[3]*m[5]*m[8])   - (m[1]*m[7]*m[8])   - (m[3]*m[4]*m[9])  + (m[0]*m[7]*m[9])   + (m[1]*m[4]*m[11]) - (m[0]*m[5]*m[11]);
    mn[12] = (m[6]*m[9]*m[12])  - (m[5]*m[10]*m[12]) - (m[6]*m[8]*m[13]) + (m[4]*m[10]*m[13]) + (m[5]*m[8]*m[14]) - (m[4]*m[9]*m[14]);
    mn[13] = (m[1]*m[10]*m[12]) - (m[2]*m[9]*m[12])  + (m[2]*m[8]*m[13]) - (m[0]*m[10]*m[13]) - (m[1]*m[8]*m[14]) + (m[0]*m[9]*m[14]);
    mn[14] = (m[2]*m[5]*m[12])  - (m[1]*m[6]*m[12])  - (m[2]*m[4]*m[13]) + (m[0]*m[6]*m[13])  + (m[1]*m[4]*m[14]) - (m[0]*m[5]*m[14]);
    mn[15] = (m[1]*m[6]*m[8])   - (m[2]*m[5]*m[8])   + (m[2]*m[4]*m[9])  - (m[0]*m[6]*m[9])   - (m[1]*m[4]*m[10]) + (m[0]*m[5]*m[10]);
    memcpy( m, mn, 16*sizeof( GLfloat ) );
    d = 1.0f/determinant( m );
    m[0] *= d;
    m[1] *= d;
    m[2] *= d;
    m[3] *= d;
    m[4] *= d;
    m[5] *= d;
    m[6] *= d;
    m[7] *= d;
    m[8] *= d;
    m[9] *= d;
    m[10] *= d;
    m[11] *= d;
    m[12] *= d;
    m[13] *= d;
    m[14] *= d;
    m[15] *= d;
  }

  GLfloat determinant( GLfloat *m ) 
  {
    return
      m[3] * m[6] * m[9]  * m[12]-m[2] * m[7] * m[9]  * m[12]-m[3] * m[5] * m[10] * m[12]+m[1] * m[7] * m[10] * m[12]+
      m[2] * m[5] * m[11] * m[12]-m[1] * m[6] * m[11] * m[12]-m[3] * m[6] * m[8]  * m[13]+m[2] * m[7] * m[8]  * m[13]+
      m[3] * m[4] * m[10] * m[13]-m[0] * m[7] * m[10] * m[13]-m[2] * m[4] * m[11] * m[13]+m[0] * m[6] * m[11] * m[13]+
      m[3] * m[5] * m[8]  * m[14]-m[1] * m[7] * m[8]  * m[14]-m[3] * m[4] * m[9]  * m[14]+m[0] * m[7] * m[9]  * m[14]+
      m[1] * m[4] * m[11] * m[14]-m[0] * m[5] * m[11] * m[14]-m[2] * m[5] * m[8]  * m[15]+m[1] * m[6] * m[8]  * m[15]+
      m[2] * m[4] * m[9]  * m[15]-m[0] * m[6] * m[9]  * m[15]-m[1] * m[4] * m[10] * m[15]+m[0] * m[5] * m[10] * m[15];
 }

 
Comments by GLProgramming users
 
Author Comment by irid 15:15:16 13/Jul/2005 


     void Invert( GLfloat *m[] )
{
float mn[16];
mn[0] = m[6]*m[11]*m[13] - m[7]*m[10]*m[13] + m[7]*m[9]*m[14] - m[5]*m[11]*m[14] - m[6]*m[9]*m[15] + m[5]*m[10]*m[15];
mn[1] = m[3]*m[10]*m[13] - m[2]*m[11]*m[13] - m[3]*m[9]*m[14] + m[1]*m[11]*m[14] + m[2]*m[9]*m[15] - m[1]*m[10]*m[15];
mn[2] = m[2]*m[7]*m[13] - m[3]*m[6]*m[13] + m[3]*m[5]*m[14] - m[1]*m[7]*m[14] - m[2]*m[5]*m[15] + m[1]*m[6]*m[15];
mn[3] = m[3]*m[6]*m[9] - m[2]*m[7]*m[9] - m[3]*m[5]*m[10] + m[1]*m[7]*m[10] + m[2]*m[5]*m[11] - m[1]*m[6]*m[11];
mn[4] = m[7]*m[10]*m[12] - m[6]*m[11]*m[12] - m[7]*m[8]*m[14] + m[4]*m[11]*m[14] + m[6]*m[8]*m[15] - m[4]*m[10]*m[15];
mn[5] = m[2]*m[11]*m[12] - m[3]*m[10]*m[12] + m[3]*m[8]*m[14] - m[0]*m[11]*m[14] - m[2]*m[8]*m[15] + m[0]*m[10]*m[15];
mn[6] = m[3]*m[6]*m[12] - m[2]*m[7]*m[12] - m[3]*m[4]*m[14] + m[0]*m[7]*m[14] + m[2]*m[4]*m[15] - m[0]*m[6]*m[15];
mn[7] = m[2]*m[7]*m[8] - m[3]*m[6]*m[8] + m[3]*m[4]*m[10] - m[0]*m[7]*m[10] - m[2]*m[4]*m[11] + m[0]*m[6]*m[11];
mn[8] = m[5]*m[11]*m[12] - m[7]*m[9]*m[12] + m[7]*m[8]*m[13] - m[4]*m[11]*m[13] - m[5]*m[8]*m[15] + m[4]*m[9]*m[15];
mn[9] = m[3]*m[9]*m[12] - m[1]*m[11]*m[12] - m[3]*m[8]*m[13] + m[0]*m[11]*m[13] + m[1]*m[8]*m[15] - m[0]*m[9]*m[15];
mn[10] = m[1]*m[7]*m[12] - m[3]*m[5]*m[12] + m[3]*m[4]*m[13] - m[0]*m[7]*m[13] - m[1]*m[4]*m[15] + m[0]*m[5]*m[15];
mn[11] = m[3]*m[5]*m[8] - m[1]*m[7]*m[8] - m[3]*m[4]*m[9] + m[0]*m[7]*m[9] + m[1]*m[4]*m[11] - m[0]*m[5]*m[11];
mn[12] = m[6]*m[9]*m[12] - m[5]*m[10]*m[12] - m[6]*m[8]*m[13] + m[4]*m[10]*m[13] + m[5]*m[8]*m[14] - m[4]*m[9]*m[14];
mn[13] = m[1]*m[10]*m[12] - m[2]*m[9]*m[12] + m[2]*m[8]*m[13] - m[0]*m[10]*m[13] - m[1]*m[8]*m[14] + m[0]*m[9]*m[14];
mn[14] = m[2]*m[5]*m[12] - m[1]*m[6]*m[12] - m[2]*m[4]*m[13] + m[0]*m[6]*m[13] + m[1]*m[4]*m[14] - m[0]*m[5]*m[14];
mn[15] = m[1]*m[6]*m[8] - m[2]*m[5]*m[8] + m[2]*m[4]*m[9] - m[0]*m[6]*m[9] - m[1]*m[4]*m[10] + m[0]*m[5]*m[10];
memcpy( m, mn, 16 * sizeof( GLfloat ) );
d = determinant( m );
m[0] *= d;
m[1] *= d;
m[2] *= d;
m[3] *= d;
m[4] *= d;
m[5] *= d;
m[6] *= d;
m[7] *= d;
m[8] *= d;
m[9] *= d;
m[10] *= d;
m[11] *= d;
m[12] *= d;
m[13] *= d;
m[14] *= d;
m[15] *= d;
}

GLfloat determinant( GLfloat *m[] )
{
return
m[3] * m[6] * m[9] * m[12]-m[2] * m[7] * m[9] * m[12]-m[3] * m[5] * m[10] * m[12]+m[1] * m[7] * m[10] * m[12]+
m[2] * m[5] * m[11] * m[12]-m[1] * m[6] * m[11] * m[12]-m[3] * m[6] * m[8] * m[13]+m[2] * m[7] * m[8] * m[13]+
m[3] * m[4] * m[10] * m[13]-m[0] * m[7] * m[10] * m[13]-m[2] * m[4] * m[11] * m[13]+m[0] * m[6] * m[11] * m[13]+
m[3] * m[5] * m[8] * m[14]-m[1] * m[7] * m[8] * m[14]-m[3] * m[4] * m[9] * m[14]+m[0] * m[7] * m[9] * m[14]+
m[1] * m[4] * m[11] * m[14]-m[0] * m[5] * m[11] * m[14]-m[2] * m[5] * m[8] * m[15]+m[1] * m[6] * m[8] * m[15]+
m[2] * m[4] * m[9] * m[15]-m[0] * m[6] * m[9] * m[15]-m[1] * m[4] * m[10] * m[15]+m[0] * m[5] * m[10] * m[15];
}