From ce9466c9aed06a86a79b1e27e91dd40375be492c Mon Sep 17 00:00:00 2001 From: cinnaboot Date: Fri, 29 Jun 2018 15:06:26 -0400 Subject: [PATCH] "working" free camera for perspective view --- src/renderer.h | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/src/renderer.h b/src/renderer.h index e9d405f..3de95fd 100644 --- a/src/renderer.h +++ b/src/renderer.h @@ -286,19 +286,28 @@ initMatrices(projection_type p) glm::vec3 &p = g_camera.position; glm::vec3 &t = g_camera.target; g_camera.hAngle = 0; - g_camera.vAngle = glm::atan((p.z - t.z) / (p.y - t.y)); + g_camera.vAngle = glm::atan((t.z - p.z) / (t.y - p.y)); + + ////// + camera &c = g_camera; + float &h = c.hAngle; + float &v = c.vAngle; + c.forward = glm::vec3( + glm::cos(v) * glm::sin(h), + glm::cos(v) * glm::cos(h), + glm::sin(v) + ); + ////// g_camera.up = glm::vec3(0,1,0); - g_camera.forward = glm::normalize(g_camera.position - g_camera.target); g_camera.left = glm::normalize(glm::cross(g_camera.up, g_camera.forward)); g_camera.up = glm::cross(g_camera.forward, g_camera.left); - glm::mat4 mV = glm::lookAt( + g_scene_matrices.view = glm::lookAt( g_camera.position, // camera position - g_camera.target, // look at position + g_camera.position + g_camera.forward, g_camera.up // "up" vector ); - g_scene_matrices.view = mV; } else // ORTHO { @@ -388,17 +397,17 @@ moveCamera(bool up, bool left, bool down, bool right) glm::vec3 u = g_camera.up; glm::vec3 old = g_camera.position; glm::vec3 &p = g_camera.position; - if (up) p -= (f * d); - if (down) p += (f * d); + if (up) p += (f * d); + if (down) p -= (f * d); if (left) { glm::vec3 l = glm::cross(f, u); - p += l * d; + p -= l * d; } if (right) { glm::vec3 r = glm::cross(u, f); - p += r * d; + p -= r * d; } glm::vec3 diff = old - p; @@ -413,11 +422,12 @@ rotateCamera(int32 xrel, int32 yrel) float &h = c.hAngle; float &v = c.vAngle; h += 0.005f * xrel; + v -= 0.005f * yrel; c.forward = glm::vec3( - glm::cos(v) * glm::sin(h), - glm::cos(v) * glm::cos(h), - glm::sin(v) - ); + glm::cos(v) * glm::sin(h), + glm::cos(v) * glm::cos(h), + glm::sin(v) + ); glm::mat4 &m = g_scene_matrices.view; m = glm::lookAt(c.position, c.position + c.forward, c.up);