camera.c (2492B)
1 #include <math.h> 2 #include "minecraft.h" 3 4 Camera camera; 5 6 void camera_update_vectors(void) { 7 float yr = camera.yaw * PI / 180.0f; 8 float pr = camera.pitch * PI / 180.0f; 9 10 vec3 front; 11 front.x = cosf(yr) * cosf(pr); 12 front.y = sinf(pr); 13 front.z = sinf(yr) * cosf(pr); 14 15 camera.front = vec3_norm(front); 16 camera.right = vec3_norm(vec3_cross(camera.front, camera.world_up)); 17 camera.up = vec3_norm(vec3_cross(camera.right, camera.front)); 18 } 19 20 void camera_init(vec3 position) { 21 camera.position = position; 22 camera.world_up = vec3_make(0.0f, 1.0f, 0.0f); 23 camera.yaw = 0.0f; 24 camera.pitch = 0.0f; 25 camera.speed = CAMERA_SPEED; 26 camera.sensitivity = CAMERA_SENSITIVITY; 27 camera.fov = CAMERA_FOV; 28 camera_update_vectors(); 29 } 30 31 mat4 camera_get_view(void) { 32 vec3 f = vec3_norm(camera.front); 33 vec3 s = vec3_norm(vec3_cross(f, camera.up)); 34 vec3 u = vec3_cross(s, f); 35 vec3 e = camera.position; 36 37 mat4 v; 38 v.m[0] = s.x; v.m[4] = s.y; v.m[8] = s.z; v.m[12] = -vec3_dot(s, e); 39 v.m[1] = u.x; v.m[5] = u.y; v.m[9] = u.z; v.m[13] = -vec3_dot(u, e); 40 v.m[2] = -f.x; v.m[6] = -f.y; v.m[10] = -f.z; v.m[14] = vec3_dot(f, e); 41 v.m[3] = 0.0f; v.m[7] = 0.0f; v.m[11] = 0.0f; v.m[15] = 1.0f; 42 return v; 43 } 44 45 void camera_process_keyboard(float dt) { 46 float v = camera.speed * dt; 47 48 if (glfwGetKey(Window, GLFW_KEY_E) == GLFW_PRESS) { 49 camera.position.x += camera.front.x * v; 50 camera.position.y += camera.front.y * v; 51 camera.position.z += camera.front.z * v; 52 } 53 if (glfwGetKey(Window, GLFW_KEY_D) == GLFW_PRESS) { 54 camera.position.x -= camera.front.x * v; 55 camera.position.y -= camera.front.y * v; 56 camera.position.z -= camera.front.z * v; 57 } 58 if (glfwGetKey(Window, GLFW_KEY_S) == GLFW_PRESS) { 59 camera.position.x -= camera.right.x * v; 60 camera.position.y -= camera.right.y * v; 61 camera.position.z -= camera.right.z * v; 62 } 63 if (glfwGetKey(Window, GLFW_KEY_F) == GLFW_PRESS) { 64 camera.position.x += camera.right.x * v; 65 camera.position.y += camera.right.y * v; 66 camera.position.z += camera.right.z * v; 67 } 68 if (glfwGetKey(Window, GLFW_KEY_SPACE) == GLFW_PRESS) 69 camera.position.y += v; 70 if (glfwGetKey(Window, GLFW_KEY_Z) == GLFW_PRESS) 71 camera.position.y -= v; 72 } 73 74 void camera_process_mouse(float dx, float dy) { 75 camera.yaw += dx * camera.sensitivity; 76 camera.pitch += dy * camera.sensitivity; 77 78 if (camera.pitch > 89.0f) camera.pitch = 89.0f; 79 if (camera.pitch < -89.0f) camera.pitch = -89.0f; 80 81 camera_update_vectors(); 82 }