66 lines
1.5 KiB
C++
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();
|
|
}
|