#include "trackballcamera.h" #include #define DEFAULT_SCROLL_SPEED 0.998f #define DEFAULT_ROTATION_SPEED 0.01f #define DEFAULT_MOVE_SPEED 0.002f TrackBallCamera::TrackBallCamera(float myFov, float myNear, float myFar) : BasicCamera(myFov, myNear, myFar) { reset(); } void TrackBallCamera::rotateCamera(float dx, float dy) { m_rotation.x += dx*DEFAULT_ROTATION_SPEED; m_rotation.y += dy*DEFAULT_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::moveCamera(float dx, float dy) { glm::mat4 inverseMVP = glm::inverse(m_projection * m_view); glm::vec4 diff = inverseMVP * glm::vec4(dx*m_dist*DEFAULT_MOVE_SPEED, dy*m_dist*DEFAULT_MOVE_SPEED, 0, 1); m_center += glm::vec3(diff); computeView(); } void TrackBallCamera::reset() { m_center = glm::vec3(0, 4, 0); 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::zoom(int nbUnits) { while(nbUnits != 0) { if(nbUnits > 0) { m_dist *= DEFAULT_SCROLL_SPEED; --nbUnits; } else { m_dist /= DEFAULT_SCROLL_SPEED; ++nbUnits; } } computeView(); }