gluLookAt
просто умножает текущую матрицу на четко определенную матрицу, созданную из входных данных. Его справочная страница содержит необходимые вам формулы.
Так, например:
void mygluLookAt(GLfloat eyeX, GLfloat eyeY, GLfloat eyeZ, GLfloat centreX, GLfloat centreY, GLfloat centreZ, GLfloat upX, GLfloat upY, GLfloat upZ)
{
GLfloat f[3] =
{
centreX - eyeX,
centreY - eyeY,
centreZ - eyeZ,
};
// make f and the up vector have unit length
GLfloat lengthOfF = sqrtf(f[0]*f[0] + f[1]*f[1] + f[2]*f[2]);
f[0] /= lengthOfF;
f[1] /= lengthOfF;
f[2] /= lengthOfF;
GLfloat lengthOfUp = sqrtf(upX*upX + upY*upY + upZ*upZ);
upX /= lengthOfUp;
upY /= lengthOfUp;
upZ /= lengthOfUp;
// use the cross product of f and Up to get s,
// and the cross product of s and f to get u
GLfloat s[3] =
{
f[1]*upZ - upY*f[2],
f[2]*upX - upZ*f[0],
f[0]*upY - upX*f[1]
};
GLfloat u[3] =
{
s[1]*f[2] - f[1]*s[2],
s[2]*f[0] - f[2]*s[0],
s[0]*f[1] - f[0]*s[1]
};
// Fill the matrix as prescribed.
// Note: OpenGL is "column major"
GLfloat M[16] =
{
s[0], u[0], -f[0], 0.0f,
s[1], u[1], -f[1], 0.0f,
s[2], u[2], -f[2], 0.0f,
0.0f, 0.0f, 0.0f, 1.0f
};
glMultMatrixf(M);
glTranslatef(-eyeX, -eyeY, -eyeZ);
}
Это набрано прямо здесь, со страницы руководства.Так что это не проверено, но должно быть легко обнаружить, если я сделал какие-либо ошибки.