这次使用opengl es 2.0中,由于里面没有gluLookAt这个函数,参考了网上的一些代码自己封装了一个,经过使用,没发现问题,具体代码如下:
void ESUTIL_API esGluLookAt(ESMatrix *result, float eyeX, float eyeY, float eyeZ, float centerX, float centerY, float centerZ, float upX, float upY, float upZ) { float fx, fy, fz; float rlf, rls; float sx, sy, sz; float ux, uy, uz; fx = centerX - eyeX; fy = centerY - eyeY; fz = centerZ - eyeZ; // Normalize f rlf = 1.0f / sqrt(fx * fx + fy * fy + fz * fz); fx *= rlf; fy *= rlf; fz *= rlf; // compute s = f x up (x means "cross product") sx = fy * upZ - fz * upY; sy = fz * upX - fx * upZ; sz = fx * upY - fy * upX; // and normalize s rls = 1.0f / sqrt(sx * sx + sy * sy + sz * sz); sx *= rls; sy *= rls; sz *= rls; // compute u = s x f ux = sy * fz - sz * fy; uy = sz * fx - sx * fz; uz = sx * fy - sy * fx; result->m[0][0] = sx; result->m[0][1] = ux; result->m[0][2] = -fx; result->m[0][3] = 0.0f; result->m[1][0] = sy; result->m[1][1] = uy; result->m[1][2] = -fy; result->m[1][3] = 0.0f; result->m[2][0] = sz; result->m[2][1] = uz; result->m[2][2] = -fz; result->m[2][3] = 0.0f; result->m[3][0] = 0.0f; result->m[3][1] = 0.0f; result->m[3][2] = 0.0f; result->m[3][3] = 1.0f; esTranslate(result, -eyeX, -eyeY, -eyeZ); }
上面的ESMatrix就是一个float[4][4]数组而已。
void ESUTIL_API esMatrixTranspose(ESMatrix *result, ESMatrix *src) { int i, j; for(i = 0; i < 4; i++) for(j = 0; j < 4; j++) { result->m[i][j] = src->m[j][i]; } }
其中的result是用来存储转换之后的矩阵,src是用来存储转换之前的矩阵。
void ESUTIL_API esMatrixInvert(ESMatrix *result, ESMatrix *src) { ESMatrix tt, mat; float tmp[12]; //temporary pair storage float det; int i, j;//determinant esMatrixTranspose(&tt, src); //calculate pairs for first 8 elements (cofactors) tmp[0] = tt.m[2][2] * tt.m[3][3]; tmp[1] = tt.m[2][3] * tt.m[3][2]; tmp[2] = tt.m[2][1] * tt.m[3][3]; tmp[3] = tt.m[2][3] * tt.m[3][1]; tmp[4] = tt.m[2][1] * tt.m[3][2]; tmp[5] = tt.m[2][2] * tt.m[3][1]; tmp[6] = tt.m[2][0] * tt.m[3][3]; tmp[7] = tt.m[2][3] * tt.m[3][0]; tmp[8] = tt.m[2][0] * tt.m[3][2]; tmp[9] = tt.m[2][2] * tt.m[3][0]; tmp[10] = tt.m[2][0] * tt.m[3][1]; tmp[11] = tt.m[2][1] * tt.m[3][0]; //calculate first 8 elements (cofactors) mat.m[0][0] = tmp[0]*tt.m[1][1] + tmp[3]*tt.m[1][2] + tmp[4]*tt.m[1][3] - tmp[1]*tt.m[1][1] - tmp[2]*tt.m[1][2] - tmp[5]*tt.m[1][3]; mat.m[0][1] = tmp[1]* tt.m[1][0] + tmp[6]*tt.m[1][2] + tmp[9]*tt.m[1][3] - tmp[0]*tt.m[1][0]- tmp[7]*tt.m[1][2] - tmp[8]*tt.m[1][3]; mat.m[0][2] = tmp[2]*tt.m[1][0] + tmp[7]*tt.m[1][1] + tmp[10]*tt.m[1][3]- tmp[3]*tt.m[1][0] - tmp[6]*tt.m[1][1] - tmp[11]*tt.m[1][3]; mat.m[0][3] = tmp[5]*tt.m[1][0] + tmp[8]*tt.m[1][1] + tmp[11]*tt.m[1][2]- tmp[4]*tt.m[1][0] - tmp[9]*tt.m[1][1] - tmp[10]*tt.m[1][2]; mat.m[1][0] = tmp[1]*tt.m[0][1] + tmp[2]*tt.m[0][2] + tmp[5]*tt.m[0][3]- tmp[0]*tt.m[0][1] - tmp[3]*tt.m[0][2] - tmp[4]*tt.m[0][3]; mat.m[1][1] = tmp[0]*tt.m[0][0] + tmp[7]*tt.m[0][2] + tmp[8]*tt.m[0][3] - tmp[1]*tt.m[0][0] - tmp[6]*tt.m[0][2] - tmp[9]*tt.m[0][3]; mat.m[1][2] = tmp[3]*tt.m[0][0] + tmp[6]*tt.m[0][1] + tmp[11]*tt.m[0][3] - tmp[2]*tt.m[0][0] - tmp[7]*tt.m[0][1] - tmp[10]*tt.m[0][3]; mat.m[1][3] = tmp[4]*tt.m[0][0] + tmp[9]*tt.m[0][1] + tmp[10]*tt.m[0][2]- tmp[5]*tt.m[0][0] - tmp[8]*tt.m[0][1] - tmp[11]*tt.m[0][2]; //calculate pairs for second 8 elements (cofactors) tmp[0] = tt.m[0][2]*tt.m[1][3]; tmp[1] = tt.m[0][3]*tt.m[1][2]; tmp[2] = tt.m[0][1]*tt.m[1][3]; tmp[3] = tt.m[0][3]*tt.m[1][1]; tmp[4] = tt.m[0][1]*tt.m[1][2]; tmp[5] = tt.m[0][2]*tt.m[1][1]; tmp[6] = tt.m[0][0]*tt.m[1][3]; tmp[7] = tt.m[0][3]*tt.m[1][0]; tmp[8] = tt.m[0][0]*tt.m[1][2]; tmp[9] = tt.m[0][2]*tt.m[1][0]; tmp[10] = tt.m[0][0]*tt.m[1][1]; tmp[11] = tt.m[0][1]*tt.m[1][0]; //calculate second 8 elements (cofactors) mat.m[2][0] =tmp[0]*tt.m[3][1] + tmp[3]*tt.m[3][2] + tmp[4]*tt.m[3][3] - tmp[1]*tt.m[3][1] - tmp[2]*tt.m[3][2] - tmp[5]*tt.m[3][3]; mat.m[2][1] = tmp[1]*tt.m[3][0] + tmp[6]*tt.m[3][2] + tmp[9]*tt.m[3][3] - tmp[0]*tt.m[3][0] - tmp[7]*tt.m[3][2] - tmp[8]*tt.m[3][3]; mat.m[2][2] = tmp[2]*tt.m[3][0] + tmp[7]*tt.m[3][1] + tmp[10]*tt.m[3][3] - tmp[3]*tt.m[3][0] - tmp[6]*tt.m[3][1] - tmp[11]*tt.m[3][3]; mat.m[2][3] = tmp[5]*tt.m[3][0] + tmp[8]*tt.m[3][1] + tmp[11]*tt.m[3][2] - tmp[4]*tt.m[3][0] - tmp[9]*tt.m[3][1] - tmp[10]*tt.m[3][2]; mat.m[3][0] = tmp[2]*tt.m[2][2] + tmp[5]*tt.m[2][3] + tmp[1]*tt.m[2][1]- tmp[4]*tt.m[2][3] - tmp[0]*tt.m[2][1] - tmp[3]*tt.m[2][2]; mat.m[3][1] = tmp[8]*tt.m[2][3]+ tmp[0]*tt.m[2][0] + tmp[7]*tt.m[2][2] - tmp[6]*tt.m[2][2] - tmp[9]*tt.m[2][3] - tmp[1]*tt.m[2][0]; mat.m[3][2] = tmp[6]*tt.m[2][1] + tmp[11]*tt.m[2][3] + tmp[3]*tt.m[2][0] - tmp[10]*tt.m[2][3] - tmp[2]*tt.m[2][0] - tmp[7]*tt.m[2][1]; mat.m[3][3] = tmp[10]*tt.m[2][2] + tmp[4]*tt.m[2][0] + tmp[9]*tt.m[2][1] - tmp[8]*tt.m[2][1] - tmp[11]*tt.m[2][2] - tmp[5]*tt.m[2][0]; // calculate determinant det = tt.m[0][0]*mat.m[0][0] +tt.m[0][1]*mat.m[0][1] +tt.m[0][2]*mat.m[0][2] +tt.m[0][3]*mat.m[0][3]; if(det==0.0f) { esMatrixLoadIdentity(&tt); } det = 1.0 / det; for(i = 0; i < 4; i++) for(j = 0; j < 4; j++) { result->m[i][j] = tt.m[i][j] * det; } //esMatrixTranspose(result); }