GLdouble _e_y_e_Y, GLdouble _e_y_e_Z, GLdouble _c_e_n_t_e_r_X, GLdouble _c_e_n_t_e_r_Y, GLdouble _c_e_n_t_e_r_Z, GLdouble _u_p_X, GLdouble _u_p_Y, GLdouble _u_p_Z )
delim $$
The matrix maps the reference point to the negative _z axis and the eye point to the origin. When a typical projection matrix is used, the center of the scene therefore maps to the center of the viewport. Similarly, the direction described by the _U_P vector projected onto the viewing plane is mapped to the positive _y axis so that it points upward in the viewport. The _U_P vector must not be parallel to the line of sight from the eye point to the reference point.
Let
F ~=~ left ( down 20 { ~ matrix {
ccol {"centerX" above "centerY" above "centerZ"}
ccol { ~-~ above ~-~ above ~-~}
ccol {"eyeX" above "eyeY" above "eyeZ"}
} } ~~ right )
Let _U_P be the vector $("upX", "upY", "upZ")$.
Then normalize as follows: f ~=~ F over {|| F ||}
UP sup prime ~=~ UP over {|| UP ||}
Finally, let $s ~=~ f ~times~ UP sup prime$, and $u ~=~ s ~times~ f$.
M is then constructed as follows:
M ~=~ left ( matrix {
ccol { ~s[0] above ~u[0] above -f[0] above 0 }
ccol { ~s[1] above ~u[1] above -f[1] above 0 }
ccol { ~s[2] above ~u[2] above -f[2] above 0 }
ccol { 0 above 0 above 0 above 1 }
} ~~right )
and gglluuLLooookkAAtt is equivalent to glMultMatrixf(M); glTranslated (-eyex, -eyey, -eyez);