Direct Graphical Models  v.1.7.0
TrackballCamera.h
1 // Trackball Camera class
2 // Written by Sergey Kosov in 2016 for Project X
3 #pragma once
4 
5 #include "glm/glm.hpp"
6 #include "glm/gtc/matrix_transform.hpp"
7 
8 namespace DirectGraphicalModels { namespace vis
9 {
10  // ================================ Trackball Camera Class ===============================
17  {
18  public:
27  CTrackballCamera(float theta, float phi, float radius)
28  : m_initTheta(theta)
29  , m_initPhi(phi)
30  , m_initRadius(radius)
31  , m_theta(theta)
32  , m_phi(phi)
33  , m_radius(radius)
34  , m_up(phi >= 0 ? 1.0f : -1.0f)
35  , m_target(0)
36  , m_view(glm::mat4(1))
37  , m_viewNeedsUpdate(true)
38  { }
39  virtual ~CTrackballCamera(void) {}
40 
44  void reset(void);
49  glm::mat4 getViewMatrix(void);
50 
51 
52  protected:
53  void rotate(float dTheta, float dPhi);
54  void zoom(float dRadius);
55  void pan(float dx, float dy);
56 
57  glm::vec3 getCameraOrintation(void) const { return glm::vec3(sinf(m_phi) * sinf(m_theta), cosf(m_phi), sinf(m_phi) * cosf(m_theta)); }
58  glm::vec3 getCameraPosition(void) const { return m_target + getCameraOrintation() * m_radius; }
59  void updateViewMatrix(void) { m_view = glm::lookAt(getCameraPosition(), m_target, glm::vec3(0, m_up, 0)); }
60 
61 
62  private:
63  float m_initTheta;
64  float m_initPhi;
65  float m_initRadius;
66  float m_theta;
67  float m_phi;
68  float m_radius;
69  float m_up;
70 
71  glm::vec3 m_target;
72  glm::mat4 m_view;
73 
75  };
76 
77 } }
glm::mat4 getViewMatrix(void)
Returns the view matrix within the camera coordinate.
CTrackballCamera(float theta, float phi, float radius)
Constructor.
void reset(void)
Resets the camera position.