added trackball camera

This commit is contained in:
Anselme FRANÇOIS 2016-06-19 21:37:19 +02:00
parent 91271ea8e4
commit f2f60a8c20
2 changed files with 117 additions and 0 deletions

74
src/trackballcamera.cpp Normal file
View File

@ -0,0 +1,74 @@
#include "trackballcamera.h"
#include <glm/ext.hpp>
#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<float>(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);
}

43
src/trackballcamera.h Normal file
View File

@ -0,0 +1,43 @@
#ifndef TRACKBALLCAMERA_H
#define TRACKBALLCAMERA_H
#include <camera.h>
#include <glm/vec2.hpp>
#include <glm/vec3.hpp>
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