Camera.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  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. // Si l'axe vertical est l'axe X
  37. if(m_axeVertical.x == 1.0)
  38. {
  39. // Calcul des coordonnées sphériques
  40. m_orientation.x = sin(phiRadian);
  41. m_orientation.y = cos(phiRadian) * cos(thetaRadian);
  42. m_orientation.z = cos(phiRadian) * sin(thetaRadian);
  43. }
  44. // Si c'est l'axe Y
  45. else if(m_axeVertical.y == 1.0)
  46. {
  47. // Calcul des coordonnées sphériques
  48. m_orientation.x = cos(phiRadian) * sin(thetaRadian);
  49. m_orientation.y = sin(phiRadian);
  50. m_orientation.z = cos(phiRadian) * cos(thetaRadian);
  51. }
  52. // Sinon c'est l'axe Z
  53. else
  54. {
  55. // Calcul des coordonnées sphériques
  56. m_orientation.x = cos(phiRadian) * cos(thetaRadian);
  57. m_orientation.y = cos(phiRadian) * sin(thetaRadian);
  58. m_orientation.z = sin(phiRadian);
  59. }
  60. // Calcul de la normale
  61. m_deplacementLateral = normalize(cross(m_axeVertical, m_orientation));
  62. // Calcul vecteur pour avancer
  63. m_deplacementLineaire = normalize(cross(m_deplacementLateral, m_axeVertical));
  64. // Calcul du point ciblé pour OpenGL
  65. m_pointCible = m_position + m_orientation;
  66. }
  67. void Camera::deplacer(Input const &input)
  68. {
  69. // Gestion de l'orientation
  70. if (input.getMainXRel()!=0 || input.getMainYRel()!=0)
  71. orienter(input.getMainXRel(), input.getMainYRel());
  72. // Avancée de la caméra
  73. if (m_vol)
  74. m_position = m_position - m_orientation * (m_vitesse * input.getMainXMove());
  75. else
  76. m_position = m_position - m_deplacementLineaire * (m_vitesse * input.getMainXMove());
  77. // Déplacement lateral
  78. m_position = m_position - m_deplacementLateral * (m_vitesse * input.getMainYMove());
  79. // Calcul du point ciblé pour OpenGL
  80. m_pointCible = m_position + m_orientation;
  81. }
  82. void Camera::lookAt(glm::mat4 &modelview)
  83. {
  84. // Actualisation de la vue dans la matrice
  85. modelview = glm::lookAt(m_position, m_pointCible, m_axeVertical);
  86. }
  87. // Getters et Setters
  88. void Camera::setPointcible(glm::vec3 pointCible)
  89. {
  90. // Calcul du vecteur orientation
  91. m_orientation = m_pointCible - m_position;
  92. m_orientation = normalize(m_orientation);
  93. // Si l'axe vertical est l'axe X
  94. if(m_axeVertical.x == 1.0)
  95. {
  96. // Calcul des angles
  97. m_phi = asin(m_orientation.x);
  98. m_theta = acos(m_orientation.y / cos(m_phi));
  99. if(m_orientation.y < 0)
  100. m_theta *= -1;
  101. }
  102. // Si c'est l'axe Y
  103. else if(m_axeVertical.y == 1.0)
  104. {
  105. // Calcul des angles
  106. m_phi = asin(m_orientation.y);
  107. m_theta = acos(m_orientation.z / cos(m_phi));
  108. if(m_orientation.z < 0)
  109. m_theta *= -1;
  110. }
  111. // Sinon c'est l'axe Z
  112. else
  113. {
  114. // Calcul des angles
  115. m_phi = asin(m_orientation.x);
  116. m_theta = acos(m_orientation.z / cos(m_phi));
  117. if(m_orientation.z < 0)
  118. m_theta *= -1;
  119. }
  120. // Conversion en degrés
  121. m_phi = m_phi * 180 / M_PI;
  122. m_theta = m_theta * 180 / M_PI;
  123. }
  124. void Camera::setPosition(glm::vec3 position)
  125. {
  126. // Mise à jour de la position
  127. m_position = position;
  128. // Actualisation du point ciblé
  129. m_pointCible = m_position + m_orientation;
  130. }
  131. float Camera::getSensibilite() const
  132. {
  133. return m_sensibilite;
  134. }
  135. float Camera::getVitesse() const
  136. {
  137. return m_vitesse;
  138. }
  139. void Camera::setSensibilite(float sensibilite)
  140. {
  141. m_sensibilite = sensibilite;
  142. }
  143. void Camera::setVitesse(float vitesse)
  144. {
  145. m_vitesse = vitesse;
  146. }
  147. void Camera::setVol(bool activation)
  148. {
  149. m_vol = activation;
  150. }