diff --git a/modules/camera/include/vkcv/camera/CameraManager.hpp b/modules/camera/include/vkcv/camera/CameraManager.hpp index f69ea121fee52f5f09df941fc325b07647f27c9e..5651ebd9c5875e0c2da3629e366e5507ed23ba8b 100644 --- a/modules/camera/include/vkcv/camera/CameraManager.hpp +++ b/modules/camera/include/vkcv/camera/CameraManager.hpp @@ -20,7 +20,7 @@ namespace vkcv{ float m_width; float m_height; - bool m_roationActive = false; + bool m_rotationActive = false; double m_lastX ; double m_lastY ; diff --git a/modules/camera/include/vkcv/camera/TrackballCamera.hpp b/modules/camera/include/vkcv/camera/TrackballCamera.hpp index 21243532cbc2f146b91269ba140abee3593110b8..dd5ead6a51ba7c0ecbf8099043740dfb7472176d 100644 --- a/modules/camera/include/vkcv/camera/TrackballCamera.hpp +++ b/modules/camera/include/vkcv/camera/TrackballCamera.hpp @@ -8,6 +8,7 @@ namespace vkcv { protected: glm::vec3 m_center; float m_radius; + float m_scrollSensitivity; public: @@ -19,7 +20,7 @@ namespace vkcv { void setRadius(float radius); - glm::vec3& getCenter(); + glm::vec3 &getCenter(); void setCenter(const glm::vec3 ¢er); @@ -27,6 +28,10 @@ namespace vkcv { void setYaw(float yaw); + void changeFov(double fov); + + void panView(double xOffset, double yOffset); + glm::mat4 updateView(double deltaTime); void updatePosition(double deltaTime); diff --git a/modules/camera/src/vkcv/camera/Camera.cpp b/modules/camera/src/vkcv/camera/Camera.cpp index bc8a8498e67a6bd751f5a6ed1d4c4fba0279a68d..f60fd7455cc4731d489625980540e8c7f380358c 100644 --- a/modules/camera/src/vkcv/camera/Camera.cpp +++ b/modules/camera/src/vkcv/camera/Camera.cpp @@ -7,7 +7,7 @@ namespace vkcv { m_up = glm::vec3(0.0f, -1.0f, 0.0f); m_position = glm::vec3(0.0f, 0.0f, 0.0f); m_cameraSpeed = 2.f; - // front + m_pitch = 0.0; m_yaw = 180.0; @@ -148,8 +148,8 @@ namespace vkcv { } void Camera::panView(double xOffset, double yOffset) { - m_yaw += xOffset; - m_pitch += yOffset; + setYaw(m_yaw + xOffset); + setPitch(m_pitch + yOffset); } void Camera::updatePosition(double deltatime ){ diff --git a/modules/camera/src/vkcv/camera/CameraManager.cpp b/modules/camera/src/vkcv/camera/CameraManager.cpp index c3d52c3e5bf8f2a3114f74317af027a97b4f3247..efbbaa2723548a8abfebb4a841a681b60e8a3d0d 100644 --- a/modules/camera/src/vkcv/camera/CameraManager.cpp +++ b/modules/camera/src/vkcv/camera/CameraManager.cpp @@ -25,23 +25,22 @@ namespace vkcv{ } void CameraManager::mouseButtonCallback(int button, int action, int mods){ - if(button == GLFW_MOUSE_BUTTON_2 && m_roationActive == false && action == GLFW_PRESS){ + if(button == GLFW_MOUSE_BUTTON_2 && m_rotationActive == false && action == GLFW_PRESS){ glfwSetInputMode(m_window.getWindow(), GLFW_CURSOR, GLFW_CURSOR_DISABLED); - m_roationActive = true; - }else if(button == GLFW_MOUSE_BUTTON_2 && m_roationActive == true && action == GLFW_RELEASE){ + m_rotationActive = true; + }else if(button == GLFW_MOUSE_BUTTON_2 && m_rotationActive == true && action == GLFW_RELEASE){ glfwSetInputMode(m_window.getWindow(), GLFW_CURSOR, GLFW_CURSOR_NORMAL); - m_roationActive = false; + m_rotationActive = false; } } void CameraManager::mouseMoveCallback(double x, double y){ - float xoffset = x - m_lastX; float yoffset = m_lastY - y; m_lastX = x; m_lastY = y; - if(!m_roationActive){ + if(!m_rotationActive){ return; } diff --git a/modules/camera/src/vkcv/camera/TrackballCamera.cpp b/modules/camera/src/vkcv/camera/TrackballCamera.cpp index c808611ebe1bf7d21144c81fd8cbfd7c3c525712..96f0503a44687a4de9d4b3d9d212d6393f73259b 100644 --- a/modules/camera/src/vkcv/camera/TrackballCamera.cpp +++ b/modules/camera/src/vkcv/camera/TrackballCamera.cpp @@ -1,13 +1,15 @@ #include "vkcv/camera/TrackballCamera.hpp" +#include <iostream> namespace vkcv { TrackballCamera::TrackballCamera() { - m_pitch = 90.0f; + m_pitch = 0.0f; m_yaw = 0.0f; m_radius = 1.5f; - m_center = glm::vec3(0.0f,0.0f,0.0f); + m_cameraSpeed = 5.0f; + m_scrollSensitivity = 0.05f; } TrackballCamera::~TrackballCamera() = default; @@ -32,35 +34,45 @@ namespace vkcv { } void TrackballCamera::setPitch(float pitch) { - if (pitch > 89.0f) { - pitch = 89.0f; + if (pitch < 0.0f) { + pitch += 360.0f; } - if (pitch < -89.0f) { - pitch = -89.0f; + else if (pitch > 360.0f) { + pitch -= 360.0f; } m_pitch = pitch; } void TrackballCamera::setYaw(float yaw) { - if (m_yaw < 0.0f) { - m_yaw += 360.0f; + if (yaw < 0.0f) { + yaw += 360.0f; } - else if (m_yaw > 360.0f) { - m_yaw -= 360.0f; + else if (yaw > 360.0f) { + yaw -= 360.0f; } m_yaw = yaw; } + void TrackballCamera::changeFov(double fov) { + setRadius(m_radius - fov * m_scrollSensitivity); + } + + void TrackballCamera::panView(double xOffset, double yOffset) { + setYaw(m_yaw + xOffset * m_cameraSpeed); + setPitch(m_pitch + yOffset * m_cameraSpeed); + } + glm::mat4 TrackballCamera::updateView(double deltaTime) { updatePosition(deltaTime); return m_view = glm::lookAt(m_position, m_center, m_up); } - // TODO: deal with gimbal lock problem, e.g. using quaternions, angleaxis etc. void TrackballCamera::updatePosition(double deltaTime) { - m_position.x = m_center.x + m_radius * sin(glm::radians(m_pitch)) * sin(glm::radians(m_yaw)); - m_position.y = m_center.y + m_radius * cos(glm::radians(m_pitch)); - m_position.z = m_center.z + m_radius * sin(glm::radians(m_pitch)) * cos(glm::radians(m_yaw)); + glm::mat4 rotationY = glm::rotate(glm::mat4(1.0f), glm::radians(m_yaw), glm::vec3(0.0f, 1.0f, 0.0f)); + glm::mat4 rotationX = glm::rotate(rotationY, glm::radians(m_pitch), glm::vec3(1.0f, 0.0f, 0.0f)); + glm::vec3 translate = glm::vec3(0.0f,0.0f,m_radius); + translate = glm::vec3(rotationX * glm::vec4(translate, 0.0f)); + m_position = m_center + translate; + m_up = glm::vec3(rotationX * glm::vec4(glm::vec3(0.0f, 1.0f, 0.0f), 0.0f)); } - } \ No newline at end of file diff --git a/projects/first_triangle/src/main.cpp b/projects/first_triangle/src/main.cpp index 83df215a729d18ac5dcc40653fc4816bc570a283..192e3449063c59cda865c87980a9f0740bed75fa 100644 --- a/projects/first_triangle/src/main.cpp +++ b/projects/first_triangle/src/main.cpp @@ -17,7 +17,7 @@ int main(int argc, const char** argv) { ); vkcv::CameraManager cameraManager(window, windowWidth, windowHeight); - cameraManager.getTrackballCamera().setPosition(glm::vec3(0.0f,0.0f,-0.5f)); + cameraManager.getTrackballCamera().setPosition(glm::vec3(0.0f,0.5f,0.0f)); cameraManager.getTrackballCamera().setCenter(glm::vec3(0.0f,0.0f,-1.0f)); window.initEvents(); @@ -139,8 +139,10 @@ int main(int argc, const char** argv) { auto end = std::chrono::system_clock::now(); auto deltatime = end - start; start = end; +// cameraManager.getCamera().updateView(std::chrono::duration<double>(deltatime).count()); +// const glm::mat4 mvp = cameraManager.getCamera().getProjection() * cameraManager.getCamera().getView(); cameraManager.getTrackballCamera().updateView(std::chrono::duration<double>(deltatime).count()); - const glm::mat4 mvp = cameraManager.getTrackballCamera().getProjection() * cameraManager.getTrackballCamera().getView(); + const glm::mat4 mvp = cameraManager.getTrackballCamera().getProjection() * cameraManager.getTrackballCamera().getView(); core.renderTriangle(trianglePass, trianglePipeline, windowWidth, windowHeight, sizeof(mvp), &mvp); core.endFrame();