Direct Graphical Models  v.1.7.0
TrackballCamera.cpp
1 # include"TrackballCamera.h"
2 
3 namespace DirectGraphicalModels { namespace vis
4 {
6  {
10  m_up = m_phi >= 0 ? 1.0f : -1.0f;
11  m_target = glm::vec3(0);
12  m_viewNeedsUpdate = true;
13  }
14 
16  {
17  if (m_viewNeedsUpdate) {
19  m_viewNeedsUpdate = false;
20  }
21  return m_view;
22  }
23 
24  // ====================================== Potected ======================================
25  void CTrackballCamera::rotate(float dTheta, float dPhi)
26  {
27  m_viewNeedsUpdate = true;
28 
29  // Update theta and phi
30  if (m_up > 0.0f) m_theta += dTheta;
31  else m_theta -= dTheta;
32  m_phi += dPhi;
33 
34  // Keep phi within -2Pi to +2Pi for easy 'up' comparison
35  if (m_phi > 2 * glm::pi<float>()) m_phi -= 2 * glm::pi<float>();
36  else if (m_phi < -2 * glm::pi<float>()) m_phi += 2 * glm::pi<float>();
37 
38  // If phi is between 0 to Pi or -Pi to -2Pi, make 'up' be positive Y, other wise make it negative Y
39  if ((m_phi > 0 && m_phi < glm::pi<float>()) || (m_phi < -glm::pi<float>() && m_phi > -2 * glm::pi<float>())) m_up = 1.0f;
40  else m_up = -1.0f;
41  }
42 
43  void CTrackballCamera::zoom(float dRadius)
44  {
45  m_viewNeedsUpdate = true;
46  m_radius -= dRadius;
47  if (m_radius <= 0.1f) m_radius = 0.1f;
48  }
49 
50  void CTrackballCamera::pan(float dx, float dy)
51  {
52  m_viewNeedsUpdate = true;
53 
54  glm::vec3 look = glm::normalize(getCameraOrintation());
55  glm::vec3 worldUp = glm::vec3(0.0f, m_up, 0.0f);
56  glm::vec3 right = glm::cross(look, worldUp);
57  glm::vec3 up = glm::cross(look, right);
58 
59  m_target += (right * dx) + (up * dy);
60  }
61 
62 } }
glm::mat4 getViewMatrix(void)
Returns the view matrix within the camera coordinate.
void reset(void)
Resets the camera position.