123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253 |
- #include "Camera.h"
- // Permet d'éviter la ré-écriture du namespace glm::
- using namespace glm;
- // Constructeurs et Destructeur
- 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)
- {
- }
- 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(),
- m_axeVertical(axeVertical), m_deplacementLateral(),
- m_position(position), m_pointCible(pointCible),
- m_sensibilite(sensibilite), m_vitesse(vitesse)
- {
- // Actualisation du point ciblé
- setPointcible(pointCible);
- }
- Camera::~Camera()
- {
- }
- // Méthodes
- void Camera::orienter(int xRel, int yRel)
- {
- // Récupération des angles
- m_phi += -yRel * m_sensibilite;
- m_theta += -xRel * m_sensibilite;
- // Limitation de l'angle phi
- if(m_phi > 89.0)
- m_phi = 89.0;
- else if(m_phi < -89.0)
- m_phi = -89.0;
- // Conversion des angles en radian
- float phiRadian = m_phi * M_PI / 180;
- float thetaRadian = m_theta * M_PI / 180;
- // Si l'axe vertical est l'axe X
- if(m_axeVertical.x == 1.0)
- {
- // Calcul des coordonnées sphériques
- m_orientation.x = sin(phiRadian);
- m_orientation.y = cos(phiRadian) * cos(thetaRadian);
- m_orientation.z = cos(phiRadian) * sin(thetaRadian);
- }
- // Si c'est l'axe Y
- else if(m_axeVertical.y == 1.0)
- {
- // Calcul des coordonnées sphériques
- m_orientation.x = cos(phiRadian) * sin(thetaRadian);
- m_orientation.y = sin(phiRadian);
- m_orientation.z = cos(phiRadian) * cos(thetaRadian);
- }
- // Sinon c'est l'axe Z
- else
- {
- // Calcul des coordonnées sphériques
- m_orientation.x = cos(phiRadian) * cos(thetaRadian);
- m_orientation.y = cos(phiRadian) * sin(thetaRadian);
- m_orientation.z = sin(phiRadian);
- }
- // Calcul de la normale
- m_deplacementLateral = cross(m_axeVertical, m_orientation);
- m_deplacementLateral = normalize(m_deplacementLateral);
- // Calcul du point ciblé pour OpenGL
- m_pointCible = m_position + m_orientation;
- }
- void Camera::deplacer(Input const &input)
- {
- // Gestion de l'orientation
- if(input.mouvementSouris())
- orienter(input.getXRel(), input.getYRel());
- // Avancée de la caméra
- if(input.getTouche(SDL_SCANCODE_UP))
- {
- m_position = m_position + m_orientation * m_vitesse;
- m_pointCible = m_position + m_orientation;
- }
- // Recul de la caméra
- if(input.getTouche(SDL_SCANCODE_DOWN))
- {
- m_position = m_position - m_orientation * m_vitesse;
- m_pointCible = m_position + m_orientation;
- }
- // Déplacement vers la gauche
- if(input.getTouche(SDL_SCANCODE_LEFT))
- {
- m_position = m_position + m_deplacementLateral * m_vitesse;
- m_pointCible = m_position + m_orientation;
- }
- // Déplacement vers la droite
- if(input.getTouche(SDL_SCANCODE_RIGHT))
- {
- m_position = m_position - m_deplacementLateral * m_vitesse;
- m_pointCible = m_position + m_orientation;
- }
- }
- void Camera::lookAt(glm::mat4 &modelview)
- {
- // Actualisation de la vue dans la matrice
- modelview = glm::lookAt(m_position, m_pointCible, m_axeVertical);
- }
- // Getters et Setters
- void Camera::setPointcible(glm::vec3 pointCible)
- {
- // Calcul du vecteur orientation
- m_orientation = m_pointCible - m_position;
- m_orientation = normalize(m_orientation);
- // Si l'axe vertical est l'axe X
- if(m_axeVertical.x == 1.0)
- {
- // Calcul des angles
- m_phi = asin(m_orientation.x);
- m_theta = acos(m_orientation.y / cos(m_phi));
- if(m_orientation.y < 0)
- m_theta *= -1;
- }
- // Si c'est l'axe Y
- else if(m_axeVertical.y == 1.0)
- {
- // Calcul des angles
- m_phi = asin(m_orientation.y);
- m_theta = acos(m_orientation.z / cos(m_phi));
- if(m_orientation.z < 0)
- m_theta *= -1;
- }
- // Sinon c'est l'axe Z
- else
- {
- // Calcul des angles
- m_phi = asin(m_orientation.x);
- m_theta = acos(m_orientation.z / cos(m_phi));
- if(m_orientation.z < 0)
- m_theta *= -1;
- }
- // Conversion en degrés
- m_phi = m_phi * 180 / M_PI;
- m_theta = m_theta * 180 / M_PI;
- }
- void Camera::setPosition(glm::vec3 position)
- {
- // Mise à jour de la position
- m_position = position;
- // Actualisation du point ciblé
- m_pointCible = m_position + m_orientation;
- }
- float Camera::getSensibilite() const
- {
- return m_vitesse;
- }
- float Camera::getVitesse() const
- {
- return m_vitesse;
- }
- void Camera::setSensibilite(float sensibilite)
- {
- m_sensibilite = sensibilite;
- }
- void Camera::setVitesse(float vitesse)
- {
- m_vitesse = vitesse;
- }
|