Skip to content
Snippets Groups Projects
Commit 79eebd1e authored by Vanessa Karolek's avatar Vanessa Karolek
Browse files

[#42] add 360 degree pitch rotation

parent a8ef6654
Branches
Tags
1 merge request!35Resolve "Kamera - Trackballkamera"
Pipeline #25300 passed
...@@ -20,7 +20,7 @@ namespace vkcv{ ...@@ -20,7 +20,7 @@ namespace vkcv{
float m_width; float m_width;
float m_height; float m_height;
bool m_roationActive = false; bool m_rotationActive = false;
double m_lastX ; double m_lastX ;
double m_lastY ; double m_lastY ;
......
...@@ -8,6 +8,7 @@ namespace vkcv { ...@@ -8,6 +8,7 @@ namespace vkcv {
protected: protected:
glm::vec3 m_center; glm::vec3 m_center;
float m_radius; float m_radius;
float m_scrollSensitivity;
public: public:
...@@ -19,7 +20,7 @@ namespace vkcv { ...@@ -19,7 +20,7 @@ namespace vkcv {
void setRadius(float radius); void setRadius(float radius);
glm::vec3& getCenter(); glm::vec3 &getCenter();
void setCenter(const glm::vec3 &center); void setCenter(const glm::vec3 &center);
...@@ -27,6 +28,10 @@ namespace vkcv { ...@@ -27,6 +28,10 @@ namespace vkcv {
void setYaw(float yaw); void setYaw(float yaw);
void changeFov(double fov);
void panView(double xOffset, double yOffset);
glm::mat4 updateView(double deltaTime); glm::mat4 updateView(double deltaTime);
void updatePosition(double deltaTime); void updatePosition(double deltaTime);
......
...@@ -7,7 +7,7 @@ namespace vkcv { ...@@ -7,7 +7,7 @@ namespace vkcv {
m_up = glm::vec3(0.0f, -1.0f, 0.0f); m_up = glm::vec3(0.0f, -1.0f, 0.0f);
m_position = glm::vec3(0.0f, 0.0f, 0.0f); m_position = glm::vec3(0.0f, 0.0f, 0.0f);
m_cameraSpeed = 2.f; m_cameraSpeed = 2.f;
// front
m_pitch = 0.0; m_pitch = 0.0;
m_yaw = 180.0; m_yaw = 180.0;
...@@ -148,8 +148,8 @@ namespace vkcv { ...@@ -148,8 +148,8 @@ namespace vkcv {
} }
void Camera::panView(double xOffset, double yOffset) { void Camera::panView(double xOffset, double yOffset) {
m_yaw += xOffset; setYaw(m_yaw + xOffset);
m_pitch += yOffset; setPitch(m_pitch + yOffset);
} }
void Camera::updatePosition(double deltatime ){ void Camera::updatePosition(double deltatime ){
......
...@@ -25,23 +25,22 @@ namespace vkcv{ ...@@ -25,23 +25,22 @@ namespace vkcv{
} }
void CameraManager::mouseButtonCallback(int button, int action, int mods){ 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); glfwSetInputMode(m_window.getWindow(), GLFW_CURSOR, GLFW_CURSOR_DISABLED);
m_roationActive = true; m_rotationActive = true;
}else if(button == GLFW_MOUSE_BUTTON_2 && m_roationActive == true && action == GLFW_RELEASE){ }else if(button == GLFW_MOUSE_BUTTON_2 && m_rotationActive == true && action == GLFW_RELEASE){
glfwSetInputMode(m_window.getWindow(), GLFW_CURSOR, GLFW_CURSOR_NORMAL); glfwSetInputMode(m_window.getWindow(), GLFW_CURSOR, GLFW_CURSOR_NORMAL);
m_roationActive = false; m_rotationActive = false;
} }
} }
void CameraManager::mouseMoveCallback(double x, double y){ void CameraManager::mouseMoveCallback(double x, double y){
float xoffset = x - m_lastX; float xoffset = x - m_lastX;
float yoffset = m_lastY - y; float yoffset = m_lastY - y;
m_lastX = x; m_lastX = x;
m_lastY = y; m_lastY = y;
if(!m_roationActive){ if(!m_rotationActive){
return; return;
} }
......
#include "vkcv/camera/TrackballCamera.hpp" #include "vkcv/camera/TrackballCamera.hpp"
#include <iostream>
namespace vkcv { namespace vkcv {
TrackballCamera::TrackballCamera() { TrackballCamera::TrackballCamera() {
m_pitch = 90.0f; m_pitch = 0.0f;
m_yaw = 0.0f; m_yaw = 0.0f;
m_radius = 1.5f; m_radius = 1.5f;
m_center = glm::vec3(0.0f,0.0f,0.0f); m_center = glm::vec3(0.0f,0.0f,0.0f);
m_cameraSpeed = 5.0f;
m_scrollSensitivity = 0.05f;
} }
TrackballCamera::~TrackballCamera() = default; TrackballCamera::~TrackballCamera() = default;
...@@ -32,35 +34,45 @@ namespace vkcv { ...@@ -32,35 +34,45 @@ namespace vkcv {
} }
void TrackballCamera::setPitch(float pitch) { void TrackballCamera::setPitch(float pitch) {
if (pitch > 89.0f) { if (pitch < 0.0f) {
pitch = 89.0f; pitch += 360.0f;
} }
if (pitch < -89.0f) { else if (pitch > 360.0f) {
pitch = -89.0f; pitch -= 360.0f;
} }
m_pitch = pitch; m_pitch = pitch;
} }
void TrackballCamera::setYaw(float yaw) { void TrackballCamera::setYaw(float yaw) {
if (m_yaw < 0.0f) { if (yaw < 0.0f) {
m_yaw += 360.0f; yaw += 360.0f;
} }
else if (m_yaw > 360.0f) { else if (yaw > 360.0f) {
m_yaw -= 360.0f; yaw -= 360.0f;
} }
m_yaw = yaw; 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) { glm::mat4 TrackballCamera::updateView(double deltaTime) {
updatePosition(deltaTime); updatePosition(deltaTime);
return m_view = glm::lookAt(m_position, m_center, m_up); 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) { void TrackballCamera::updatePosition(double deltaTime) {
m_position.x = m_center.x + m_radius * sin(glm::radians(m_pitch)) * sin(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));
m_position.y = m_center.y + m_radius * cos(glm::radians(m_pitch)); glm::mat4 rotationX = glm::rotate(rotationY, glm::radians(m_pitch), glm::vec3(1.0f, 0.0f, 0.0f));
m_position.z = m_center.z + m_radius * sin(glm::radians(m_pitch)) * cos(glm::radians(m_yaw)); 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
...@@ -17,7 +17,7 @@ int main(int argc, const char** argv) { ...@@ -17,7 +17,7 @@ int main(int argc, const char** argv) {
); );
vkcv::CameraManager cameraManager(window, windowWidth, windowHeight); 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)); cameraManager.getTrackballCamera().setCenter(glm::vec3(0.0f,0.0f,-1.0f));
window.initEvents(); window.initEvents();
...@@ -139,8 +139,10 @@ int main(int argc, const char** argv) { ...@@ -139,8 +139,10 @@ int main(int argc, const char** argv) {
auto end = std::chrono::system_clock::now(); auto end = std::chrono::system_clock::now();
auto deltatime = end - start; auto deltatime = end - start;
start = end; 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()); 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.renderTriangle(trianglePass, trianglePipeline, windowWidth, windowHeight, sizeof(mvp), &mvp);
core.endFrame(); core.endFrame();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment