Camera.cpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. #include "Camera.h"
  2. // Permet d'éviter la ré-écriture du namespace glm::
  3. using namespace glm;
  4. // Constructeurs
  5. Camera::Camera()
  6. : m_phi(0.0), m_theta(0.0), m_orientation(), m_axeVertical(0, 0, 1), m_deplacementLateral(), m_deplacementLineaire(),
  7. m_position(), m_pointCible(), m_sensibilite(0.0), m_vitesse(0.0), m_vol(false)
  8. {
  9. }
  10. Camera::Camera(glm::vec3 position, glm::vec3 pointCible, glm::vec3 axeVertical, float sensibilite, float vitesse)
  11. : m_phi(0.0), m_theta(0.0), m_orientation(),
  12. m_axeVertical(axeVertical), m_deplacementLateral(), m_deplacementLineaire(),
  13. m_position(position), m_pointCible(pointCible),
  14. m_sensibilite(sensibilite), m_vitesse(vitesse), m_vol(false)
  15. {
  16. // Actualisation du point ciblé
  17. setPointcible(pointCible);
  18. }
  19. // Destructeur
  20. Camera::~Camera()
  21. {}
  22. // Méthodes
  23. void Camera::orienter(float xRel, float yRel)
  24. {
  25. // Récupération des angles
  26. m_phi -= yRel * m_sensibilite;
  27. m_theta -= xRel * m_sensibilite;
  28. // Limitation de l'angle phi
  29. if(m_phi > 89.0)
  30. m_phi = 89.0;
  31. else if(m_phi < -89.0)
  32. m_phi = -89.0;
  33. // Conversion des angles en radian
  34. float phiRadian = m_phi * M_PI / 180;
  35. float thetaRadian = m_theta * M_PI / 180;
  36. // Calcul des coordonnées sphériques
  37. m_orientation.x = cos(phiRadian) * sin(thetaRadian);
  38. m_orientation.y = sin(phiRadian);
  39. m_orientation.z = cos(phiRadian) * cos(thetaRadian);
  40. // Calcul de la normale
  41. m_deplacementLateral = normalize(cross(m_axeVertical, m_orientation));
  42. // Calcul vecteur pour avancer
  43. m_deplacementLineaire = normalize(cross(m_deplacementLateral, m_axeVertical));
  44. // Calcul du point ciblé pour OpenGL
  45. m_pointCible = m_position + m_orientation;
  46. }
  47. void Camera::deplacer(Input const &input)
  48. {
  49. // Gestion de l'orientation
  50. if (input.getMainXRel()!=0 || input.getMainYRel()!=0)
  51. orienter(input.getMainXRel(), input.getMainYRel());
  52. // Avancée de la caméra
  53. if (m_vol)
  54. m_position = m_position - m_orientation * (m_vitesse * input.getMainXMove());
  55. else
  56. m_position = m_position - m_deplacementLineaire * (m_vitesse * input.getMainXMove());
  57. // Déplacement lateral
  58. m_position = m_position - m_deplacementLateral * (m_vitesse * input.getMainYMove());
  59. // Calcul du point ciblé pour OpenGL
  60. m_pointCible = m_position + m_orientation;
  61. }
  62. void Camera::lookAt(glm::mat4 &modelview)
  63. {
  64. // Actualisation de la vue dans la matrice
  65. modelview = glm::lookAt(m_position, m_pointCible, m_axeVertical);
  66. }
  67. // Getters et Setters
  68. void Camera::setPointcible(glm::vec3 pointCible)
  69. {
  70. // Calcul du vecteur orientation
  71. m_orientation = m_pointCible - m_position;
  72. m_orientation = normalize(m_orientation);
  73. // Si l'axe vertical est l'axe X
  74. if(m_axeVertical.x == 1.0)
  75. {
  76. // Calcul des angles
  77. m_phi = asin(m_orientation.x);
  78. m_theta = acos(m_orientation.y / cos(m_phi));
  79. if(m_orientation.y < 0)
  80. m_theta *= -1;
  81. }
  82. // Si c'est l'axe Y
  83. else if(m_axeVertical.y == 1.0)
  84. {
  85. // Calcul des angles
  86. m_phi = asin(m_orientation.y);
  87. m_theta = acos(m_orientation.z / cos(m_phi));
  88. if(m_orientation.z < 0)
  89. m_theta *= -1;
  90. }
  91. // Sinon c'est l'axe Z
  92. else
  93. {
  94. // Calcul des angles
  95. m_phi = asin(m_orientation.x);
  96. m_theta = acos(m_orientation.z / cos(m_phi));
  97. if(m_orientation.z < 0)
  98. m_theta *= -1;
  99. }
  100. // Conversion en degrés
  101. m_phi = m_phi * 180 / M_PI;
  102. m_theta = m_theta * 180 / M_PI;
  103. }
  104. void Camera::setPosition(glm::vec3 position)
  105. {
  106. // Mise à jour de la position
  107. m_position = position;
  108. // Actualisation du point ciblé
  109. m_pointCible = m_position + m_orientation;
  110. }
  111. void Camera::setSensibilite(float sensibilite)
  112. {
  113. m_sensibilite = sensibilite;
  114. }
  115. void Camera::setVitesse(float vitesse)
  116. {
  117. m_vitesse = vitesse;
  118. }
  119. void Camera::setVol(bool activation)
  120. {
  121. m_vol = activation;
  122. }
  123. float Camera::getSensibilite() const
  124. {
  125. return m_sensibilite;
  126. }
  127. float Camera::getVitesse() const
  128. {
  129. return m_vitesse;
  130. }
  131. glm::vec3 Camera::getPos() const
  132. {
  133. return m_position;
  134. }
  135. glm::vec3 Camera::getDirect() const
  136. {
  137. return m_pointCible - m_position;
  138. }
  139. float Camera::getTheta() const
  140. {
  141. return m_theta;
  142. }
  143. float Camera::getPhi() const
  144. {
  145. return m_phi;
  146. }
  147. glm::vec3 Camera::getNormale() const
  148. {
  149. return m_deplacementLateral;
  150. }