Camera.cpp 5.1 KB

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