OpenGL translation becoming rotation using look_at matrix

Viewed 36

Here is the diver code:

camera.projection = CGL_mat4_perspective(((float)rx / ry), camera.fov, 0.01f, 100.0f);
camera.view = CGL_mat4_look_at(camera.pos, CGL_vec3_init(camera.pos.x, camera.pos.y, 
camera.pos.z + 1.0f), CGL_vec3_init(0.0f, 1.0f, 0.0f));
CGL_shader_set_uniform_mat4(main_shader.shader, main_shader.u_projection, &camera.projection);
CGL_shader_set_uniform_mat4(main_shader.shader, main_shader.u_view, &camera.view);

The functions:

#define CGL_mat4_perspective(aspect, fov, znear, zfar) (CGL_mat4){1.0f / (aspect * tanf(fov / 2.0f)), 0.0f, 0.0f, 0.0f, 0.0f, 1.0f / tanf(fov / 2.0f), 0.0f, 0.0f, 0.0f, 0.0f, -1.0f * ( (zfar + znear) / (zfar - znear) ), -1.0f, 0.0f, 0.0f, -2.0f * znear * zfar / (zfar - znear), 1.0f}
CGL_mat4 CGL_mat4_look_at(CGL_vec3 eye, CGL_vec3 target, CGL_vec3 up)
{
    CGL_vec3 z_axis = CGL_vec3_sub(target, eye);
    CGL_vec3_normalize(z_axis);
    CGL_vec3 x_axis = CGL_vec3_cross(up, z_axis);
    CGL_vec3_normalize(x_axis);
    CGL_vec3 y_axis = CGL_vec3_cross(z_axis, x_axis);
    CGL_mat4 mat;
    mat.m[0] = x_axis.x;
    mat.m[1] = x_axis.y;
    mat.m[2] = x_axis.z;
    mat.m[3] = -1.0f * CGL_vec3_dot(x_axis, eye);
    mat.m[4] = y_axis.x;
    mat.m[5] = y_axis.y;
    mat.m[6] = y_axis.z;
    mat.m[7] = -1.0f * CGL_vec3_dot(y_axis, eye);
    mat.m[8] = z_axis.x;
    mat.m[9] = z_axis.y;
    mat.m[10] = z_axis.z;
    mat.m[11] = -1.0f * CGL_vec3_dot(z_axis, eye);
    mat.m[12] = 0.0f;
    mat.m[13] = 0.0f;
    mat.m[14] = 0.0f;
    mat.m[15] = 1.0f;
    return mat;
}

The shader:

gl_Position = u_projection * u_view * vec4(position.xyz, 1.0f);

However when the camera.pos is changed the plane that is being rendered is being rotated rather than being translated.

enter image description here

0 Answers
Related