123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197 |
- #include "Camera.h"
- // Permet d'éviter la ré-écriture du namespace glm::
- using namespace glm;
- // Constructeurs
- Camera::Camera()
- : m_phi(0.0), m_theta(0.0), m_orientation(), m_axeVertical(0, 0, 1), m_deplacementLateral(), m_deplacementLineaire(),
- m_position(), m_pointCible(), m_sensibilite(0.0), m_vitesse(0.0), m_vol(false)
- {
- }
- 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_deplacementLineaire(),
- m_position(position), m_pointCible(pointCible),
- m_sensibilite(sensibilite), m_vitesse(vitesse), m_vol(false)
- {
- // Actualisation du point ciblé
- setPointcible(pointCible);
- }
- // Destructeur
- Camera::~Camera()
- {}
- // Méthodes
- void Camera::orienter(float xRel, float 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;
- // 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);
- // Calcul de la normale
- m_deplacementLateral = normalize(cross(m_axeVertical, m_orientation));
- // Calcul vecteur pour avancer
- m_deplacementLineaire = normalize(cross(m_deplacementLateral, m_axeVertical));
- // Calcul du point ciblé pour OpenGL
- m_pointCible = m_position + m_orientation;
- }
- void Camera::deplacer(Input const &input)
- {
- // Gestion de l'orientation
- if (input.getMainXRel()!=0 || input.getMainYRel()!=0)
- orienter(input.getMainXRel(), input.getMainYRel());
- // Avancée de la caméra
- if (m_vol)
- m_position = m_position - m_orientation * (m_vitesse * input.getMainXMove());
- else
- m_position = m_position - m_deplacementLineaire * (m_vitesse * input.getMainXMove());
- // Déplacement lateral
- m_position = m_position - m_deplacementLateral * (m_vitesse * input.getMainYMove());
- // Calcul du point ciblé pour OpenGL
- 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;
- }
- void Camera::setSensibilite(float sensibilite)
- {
- m_sensibilite = sensibilite;
- }
- void Camera::setVitesse(float vitesse)
- {
- m_vitesse = vitesse;
- }
- void Camera::setVol(bool activation)
- {
- m_vol = activation;
- }
- float Camera::getSensibilite() const
- {
- return m_sensibilite;
- }
- float Camera::getVitesse() const
- {
- return m_vitesse;
- }
- glm::vec3 Camera::getPos() const
- {
- return m_position;
- }
- glm::vec3 Camera::getDirect() const
- {
- return m_pointCible - m_position;
- }
- float Camera::getTheta() const
- {
- return m_theta;
- }
- float Camera::getPhi() const
- {
- return m_phi;
- }
- glm::vec3 Camera::getNormale() const
- {
- return m_deplacementLateral;
- }
|