inverse 함수

반응형


es에서 inverse함수를 잘 썻는데 아이패드에 넣으려니 안된다...이건 무슨..헐..

참고 : http://www.codeshade.com/talk/index.php?topic=85.0

그래서 아주 간단한 한줄이 100줄이 넘어 버렸다.

mat4 m = LocalToWorld;

 #define MAT(m,r,c) (m)[c][r]
 #define m11 MAT(m,0,0)
 #define m12 MAT(m,0,1)
 #define m13 MAT(m,0,2)
 #define m14 MAT(m,0,3)
 #define m21 MAT(m,1,0)
 #define m22 MAT(m,1,1)
 #define m23 MAT(m,1,2)
 #define m24 MAT(m,1,3)
 #define m31 MAT(m,2,0)
 #define m32 MAT(m,2,1)
 #define m33 MAT(m,2,2)
 #define m34 MAT(m,2,3)
 #define m41 MAT(m,3,0)
 #define m42 MAT(m,3,1)
 #define m43 MAT(m,3,2)
 #define m44 MAT(m,3,3)
 
 float det;
 float d12, d13, d23, d24, d34, d41;
 float tmp[16]; /* Allow out == in. */
 
 d12 = (m31*m42-m41*m32);
 d13 = (m31*m43-m41*m33);
 d23 = (m32*m43-m42*m33);
 d24 = (m32*m44-m42*m34);
 d34 = (m33*m44-m43*m34);
 d41 = (m34*m41-m44*m31);
 
 tmp[0] =  (m22 * d34 - m23 * d24 + m24 * d23);
 tmp[1] = -(m21 * d34 + m23 * d41 + m24 * d13);
 tmp[2] =  (m21 * d24 + m22 * d41 + m24 * d12);
 tmp[3] = -(m21 * d23 - m22 * d13 + m23 * d12);
 
 
 det = m11 * tmp[0] + m12 * tmp[1] + m13 * tmp[2] + m14 * tmp[3]; 
 
 if (det == 0.0)
 {
     //memcpy(out,_identity,16*sizeof(double));
 }
 else
 {
     float invDet = 1.0 / det;
 
     tmp[0] *= invDet;
     tmp[1] *= invDet;
     tmp[2] *= invDet;
     tmp[3] *= invDet;
 
     tmp[4] = -(m12 * d34 - m13 * d24 + m14 * d23) * invDet;
     tmp[5] =  (m11 * d34 + m13 * d41 + m14 * d13) * invDet;
     tmp[6] = -(m11 * d24 + m12 * d41 + m14 * d12) * invDet;
     tmp[7] =  (m11 * d23 - m12 * d13 + m13 * d12) * invDet;
 
     d12 = m11*m22-m21*m12;
     d13 = m11*m23-m21*m13;
     d23 = m12*m23-m22*m13;
     d24 = m12*m24-m22*m14;
     d34 = m13*m24-m23*m14;
     d41 = m14*m21-m24*m11;
 
     tmp[8] =  (m42 * d34 - m43 * d24 + m44 * d23) * invDet;
     tmp[9] = -(m41 * d34 + m43 * d41 + m44 * d13) * invDet;
     tmp[10] =  (m41 * d24 + m42 * d41 + m44 * d12) * invDet;
     tmp[11] = -(m41 * d23 - m42 * d13 + m43 * d12) * invDet;
     tmp[12] = -(m32 * d34 - m33 * d24 + m34 * d23) * invDet;
     tmp[13] =  (m31 * d34 + m33 * d41 + m34 * d13) * invDet;
     tmp[14] = -(m31 * d24 + m32 * d41 + m34 * d12) * invDet;
     tmp[15] =  (m31 * d23 - m32 * d13 + m33 * d12) * invDet;
 
     //memcpy(out, tmp, 16*sizeof(double));
 }
 for(int i=0; i<4; i++)
 {
  for(int j=0; j<4; j++)
  {
   m[i][j] = tmp[i*4 + j];
  }
 }

'Study > ES' 카테고리의 다른 글

Water 만들기.  (0) 2012.09.23
OPENGL ES 문법  (0) 2012.08.25
GLSL에서 사용하는 수식자, 식별자  (0) 2012.08.13
TAGS.

Comments