ogl_lookat.c (1927B)
1 /* 2 2018 David DiPaola 3 licensed under CC0 (public domain, see https://creativecommons.org/publicdomain/zero/1.0/) 4 */ 5 6 #include <GL/glew.h> 7 8 #include "ogl.h" 9 10 void 11 ogl_lookat( 12 struct ogl_vec3f eye, struct ogl_vec3f center, struct ogl_vec3f up, 13 struct ogl_mat4f * out_matrix 14 ) { 15 /* equivelant to gluLookAt() followed by glTranslatef(). see: https://www.opengl.org/discussion_boards/showthread.php/130409-using-gluLookAt-properly */ 16 /* see OpenGL 2.1 gluLookAt(): https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/gluLookAt.xml */ 17 /* see OpenGL 2.1 glTranslate(): https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glTranslate.xml */ 18 /* note: gluLookAt() and glTranslate() were deprecated, then removed from later OpenGL versions. don't use them */ 19 20 struct ogl_vec3f f = { 21 .x = center.x - eye.x, 22 .y = center.y - eye.y, 23 .z = center.z - eye.z, 24 }; 25 struct ogl_vec3f f_norm; 26 ogl_vec3f_normal(f, &f_norm); 27 28 struct ogl_vec3f up_norm; 29 ogl_vec3f_normal(up, &up_norm); 30 31 struct ogl_vec3f s; 32 ogl_vec3f_cross(f_norm, up_norm, &s); 33 34 struct ogl_vec3f s_norm; 35 ogl_vec3f_normal(s, &s_norm); 36 37 struct ogl_vec3f u; 38 ogl_vec3f_cross(s_norm, f_norm, &u); 39 40 GLfloat eye_translate_x; 41 ogl_vec3f_dot(s_norm, eye, &eye_translate_x); 42 eye_translate_x *= -1.0f; 43 44 GLfloat eye_translate_y; 45 ogl_vec3f_dot(u, eye, &eye_translate_y); 46 eye_translate_y *= -1.0f; 47 48 GLfloat eye_translate_z; 49 ogl_vec3f_dot(f_norm, eye, &eye_translate_z); 50 51 GLfloat * values = (*out_matrix).values; 52 values[ 0] = s.x; values[ 1] = s.y; values[ 2] = s.z; values[ 3] = eye_translate_x; 53 values[ 4] = u.x; values[ 5] = u.y; values[ 6] = u.z; values[ 7] = eye_translate_y; 54 values[ 8] = -f_norm.x; values[ 9] = -f_norm.y; values[10] = -f_norm.z; values[11] = eye_translate_z; 55 values[12] = 0.0f; values[13] = 0.0f; values[14] = 0.0f; values[15] = 1.0f; 56 } 57