From f2f60a8c203c668c30e7eef12723a1111f9f97d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anselme=20FRAN=C3=87OIS?= Date: Sun, 19 Jun 2016 21:37:19 +0200 Subject: [PATCH] added trackball camera --- src/trackballcamera.cpp | 74 +++++++++++++++++++++++++++++++++++++++++ src/trackballcamera.h | 43 ++++++++++++++++++++++++ 2 files changed, 117 insertions(+) create mode 100644 src/trackballcamera.cpp create mode 100644 src/trackballcamera.h diff --git a/src/trackballcamera.cpp b/src/trackballcamera.cpp new file mode 100644 index 0000000..35558d4 --- /dev/null +++ b/src/trackballcamera.cpp @@ -0,0 +1,74 @@ +#include "trackballcamera.h" +#include + +#define SCROLL_SPEED 0.998f +#define ROTATION_SPEED 0.01f +#define MOVE_SPEED 0.002f + +TrackBallCamera::TrackBallCamera(float myFov, float myNear, float myFar) : + m_fov(myFov), m_near(myNear), m_far(myFar) +{ + reset(); + resize(800, 600); +} + +void TrackBallCamera::resize(int width, int height) +{ + if(width > 0 && height > 0) + m_projection = glm::perspectiveFov(m_fov, float(width), float(height), m_near, m_far); +} + +void TrackBallCamera::rotateCamera(float dx, float dy) +{ + m_rotation.x += dx*ROTATION_SPEED; + m_rotation.y += dy*ROTATION_SPEED; + if(m_rotation.y > 1.57f) + m_rotation.y = 1.57f; + if(m_rotation.y < -1.57f) + m_rotation.y = -1.57f; + computeView(); +} + +void TrackBallCamera::reset() +{ + m_center = glm::vec3(0, 4, 0); + m_target = m_center; + m_rotation = glm::vec2(0, 1); + m_dist = 20; + computeView(); +} + +void TrackBallCamera::computeView() +{ + + m_view = glm::translate(glm::mat4(), glm::vec3(0, 0, -m_dist)); + m_view = glm::rotate(m_view, m_rotation.y, glm::vec3(1, 0, 0)); + m_view = glm::rotate(m_view, m_rotation.x, glm::vec3(0, 1, 0)); + m_view = glm::translate(m_view, -m_center); +} + +void TrackBallCamera::mouseScroll(int nbScrolls) +{ + while(nbScrolls != 0) + { + if(nbScrolls > 0) + { + m_dist *= SCROLL_SPEED; + --nbScrolls; + } + else + { + m_dist /= SCROLL_SPEED; + ++nbScrolls; + } + } + + computeView(); +} + +glm::vec3 TrackBallCamera::getDefaultPxInfo() +{ + glm::vec4 viewPos(m_center, 1); + viewPos = (m_projection * m_view) * viewPos; + return glm::vec3(m_dist/m_far, 1/viewPos.w, 0); +} diff --git a/src/trackballcamera.h b/src/trackballcamera.h new file mode 100644 index 0000000..7bc0ffa --- /dev/null +++ b/src/trackballcamera.h @@ -0,0 +1,43 @@ +#ifndef TRACKBALLCAMERA_H +#define TRACKBALLCAMERA_H + +#include +#include +#include + +class TrackBallCamera : public Camera +{ + glm::mat4 m_view; + glm::mat4 m_projection; + + float m_fov; + float m_near; + float m_far; + + // camera position + glm::vec3 m_center; + glm::vec2 m_rotation; + float m_dist; + + // camera movement + glm::vec3 m_origin; + glm::vec3 m_target; + +public: + TrackBallCamera(float myFov = 70.f, float myNear = 0.1f, float myFar = 1000.f); + + glm::mat4 getProjectionMatrix() {return m_projection;} + glm::mat4 getViewMatrix() {return m_view;} + + void resize(int width, int height); + + void rotateCamera(float dx, float dy); + void moveCamera(float dx, float dy); + void mouseScroll(int nbScrolls); + void reset(); + void computeView(); + void setCenter(glm::vec3 pos) { m_center = pos; computeView(); } + glm::vec3 getDefaultPxInfo(); +}; + +#endif // TRACKBALLCAMERA_H