gluLookAt矩阵、矩阵的转置与求逆矩阵方法

1. gluLookAt矩阵

这次使用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]数组而已。

2. 矩阵转置

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是用来存储转换之前的矩阵。

 

3. 求逆矩阵

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);
}


 

你可能感兴趣的:(gluLookAt矩阵、矩阵的转置与求逆矩阵方法)