SparrowRenderer/src/trackballcamera.cpp

66 lines
1.5 KiB
C++

#include "trackballcamera.h"
#include <glm/ext.hpp>
#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();
}