Если ваш код подобен приведенному ниже:
glMatrixMode(GL_MODELVIEW)
glLoadIdentity();
gluLookAt(......);
, то матрица просмотра модели выполняется с помощью вызова gluLookAt.Итак, сначала получите матрицу вида модели, вызвав
float modelViewMat[16];
glGetFloatv(GL_MODELVIEW_MATRIX, modelViewMat);
Теперь найдите инвертированную матрицу modelViewMat.
float invertMat[16];
__gluInvertMatrixd(modelViewMat, invertMat);
Вот код для получения инвертированной матрицы.
int __gluInvertMatrixd(const float src[16], float inverse[16])
{
int i, j, k, swap;
float t;
GLfloat temp[4][4];
for (i=0; i<4; i++)
for (j=0; j<4; j++)
temp[i][j] = src[i*4+j];
for(int i=0;i<16;i++)
inverse[i] = 0;
inverse[0] = inverse[5] = inverse[10] = inverse[15] = 1.0f;
for(i=0; i<4; i++)
{
swap = i;
for (j = i + 1; j < 4; j++)
if (fabs(temp[j][i]) > fabs(temp[i][i]))
swap = j;
if (swap != i) {
//Swap rows.
for (k = 0; k < 4; k++) {
t = temp[i][k];
temp[i][k] = temp[swap][k];
temp[swap][k] = t;
t = inverse[i*4+k];
inverse[i*4+k] = inverse[swap*4+k];
inverse[swap*4+k] = t;
}
}
if (temp[i][i] == 0)
return 0;
t = temp[i][i];
for (k = 0; k < 4; k++) {
temp[i][k] /= t;
inverse[i*4+k] /= t;
}
for (j = 0; j < 4; j++) {
if (j != i) {
t = temp[j][i];
for (k = 0; k < 4; k++) {
temp[j][k] -= temp[i][k]*t;
inverse[j*4+k] -= inverse[i*4+k]*t;
}
}
}
}
return 1;
}
Теперь умножьте значение invertMat на любую матрицу объектов, если вы не хотите добавлять эффект матрицы вида модели.
Как:
glPushMatrix();
glMultMatrixf(invertMat);
glRotatef(...);
glTranslatef(...);
...
...
glDrawArrays(....);
glPopMatrix();