Advertisement
gtmax32

Camera class

May 22nd, 2018
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.37 KB | None | 0 0
  1. /*
  2. Classe Camera
  3. - crea sistema di riferimento della camera
  4. - gestisce i movimenti di camera (FPS-style) alla pressione dei tasti WASD e al movimento del mouse
  5.  
  6. */
  7. #ifndef CAMERA_H
  8. #define CAMERA_H
  9.  
  10. #include <vector>
  11.  
  12. #include <glad/glad.h>
  13.  
  14. // GLM viene utilizzata per creare la matrice di vista e per gestire le trasformazioni di camera
  15. #include <glm/glm.hpp>
  16. #include <glm/gtc/matrix_transform.hpp>
  17. #include <glm/gtx/string_cast.hpp>
  18. #include <glm/gtx/rotate_vector.hpp>
  19.  
  20. using namespace glm;
  21.  
  22. // Possibili movimenti della camera
  23. enum Camera_Movement {
  24.     FORWARD,
  25.     BACKWARD,
  26.     LEFT,
  27.     RIGHT
  28. };
  29.  
  30. // Impostazioni di default di camera
  31. const float YAW         = -90.0f;
  32. const float PITCH       = -90.0f;
  33. // Parametri per gestione interazione con il mouse
  34. const float SPEED       =  5.0f;
  35. const float SENSITIVITY =  0.1f;
  36. const float ZOOM        =  45.0f;
  37.  
  38. const vec3 OFFSET(-3.0f, 0.0f, 0.0f);
  39. /********** classe CAMERA **********/
  40. class Camera {
  41. public:
  42.     // Attributi della Camera
  43.     vec3 Position;
  44.     vec3 Front;
  45.     // Vettore UP locale della Camera
  46.     vec3 Up;
  47.     vec3 Right;
  48.     // Vettore UP del mondo, serve per il calcolo iniziale del vettore Right
  49.     vec3 WorldUp;
  50.     // Angoli di Eulero
  51.     float Yaw;
  52.     float Pitch;
  53.     // Parametri della Camera
  54.     float MovementSpeed;
  55.     float MouseSensitivity;
  56.     float Zoom;
  57.  
  58.     vec3 selectedBallPos;
  59.  
  60.     // Costruttore completo
  61.     Camera(vec3 position = vec3(0.0f, 0.0f, 0.0f), vec3 up = vec3(0.0f, 1.0f, 0.0f), float yaw = YAW, float pitch = PITCH) : Front(vec3(0.0f, 0.0f, -1.0f)), MovementSpeed(SPEED), MouseSensitivity(SENSITIVITY), Zoom(ZOOM) {
  62.        
  63.         this->Position = position;
  64.         this->WorldUp = up;
  65.         this->Yaw = yaw;
  66.         this->Pitch = pitch;
  67.         // Inizializza il sistema di riferimento della camera sulla base dei vettori passati al costruttore
  68.         this->updateCameraVectors();
  69.     }
  70.    
  71.     // Costruttore semplificato
  72.     Camera(float posX, float posY, float posZ, float upX, float upY, float upZ, float yaw, float pitch) : Front(vec3(0.0f, 0.0f, -1.0f)), MovementSpeed(SPEED), MouseSensitivity(SENSITIVITY), Zoom(ZOOM) {
  73.        
  74.         this->Position = vec3(posX, posY, posZ);
  75.         this->WorldUp = vec3(upX, upY, upZ);
  76.         this->Yaw = yaw;
  77.         this->Pitch = pitch;
  78.         // Inizializza il sistema di riferimento della camera sulla base dei vettori passati al costruttore
  79.         this->updateCameraVectors();
  80.     }
  81.  
  82.     // Restituisce la view matrix calcolata usando gli angeli di Eulero e la LookAt Matrix
  83.     mat4 GetViewMatrix() {
  84.         return lookAt(this->Position, this->Position + this->Front, this->Up);
  85.     }
  86.  
  87.     mat4 lookAtObject(){
  88.         return lookAt(this->selectedBallPos + OFFSET, this->selectedBallPos + this->Front, this->Up);
  89.     }
  90.  
  91.     // Aggiorna la posizione della camera in base alla pressione dei tasti W,A,S e D
  92.     void ProcessKeyboard(Camera_Movement direction, float deltaTime) {
  93.         GLfloat velocity = this->MovementSpeed * deltaTime;
  94.        
  95.         if (direction == FORWARD)
  96.             this->Position += this->Front * velocity;
  97.        
  98.         if (direction == BACKWARD)
  99.             this->Position -= this->Front * velocity;
  100.        
  101.         if (direction == LEFT)
  102.             this->Position -= this->Right * velocity;
  103.        
  104.         if (direction == RIGHT)
  105.             this->Position += this->Right * velocity;
  106.        
  107.         //this->Position.y = 20.0f; // <-- this one-liner keeps the user at the ground level (xz plane)
  108.     }
  109.  
  110.     // Aggiorna la posizione della camera in base al movimento del mouse
  111.     void ProcessMouseMovement(float xoffset, float yoffset, GLboolean constrainPitch = true) {
  112.         // Applica il parametro di sensitivita' per pesare lo spostamento
  113.         xoffset *= this->MouseSensitivity;
  114.         yoffset *= this->MouseSensitivity;
  115.        
  116.         // Aggiorna gli angoli di rotazione su Y e X
  117.         this->Yaw   += xoffset;
  118.         this->Pitch += yoffset;
  119.  
  120.         // Applica un vincolo sulla rotazione su X, per evitare di ribaltare la vista
  121.         if (constrainPitch) {
  122.            
  123.             if (this->Pitch > 89.0f)
  124.                 this->Pitch = 89.0f;
  125.            
  126.             if (this->Pitch < -89.0f)
  127.                 this->Pitch = -89.0f;
  128.         }
  129.  
  130.         // Aggiorna i vettori Front, Right e Up utilizzando gli angoli di Eulero appena aggiornati
  131.         this->updateCameraVectors();
  132.     }
  133.  
  134.     // Processa l'interazione della rotellina del mouse con la scena. Permette di effettuare uno zoom.
  135.     void ProcessMouseScroll(float yoffset) {
  136.         if (Zoom >= 1.0f && Zoom <= 45.0f)
  137.             Zoom -= yoffset;
  138.        
  139.         if (Zoom <= 1.0f)
  140.             Zoom = 1.0f;
  141.        
  142.         if (Zoom >= 45.0f)
  143.             Zoom = 45.0f;
  144.     }
  145.    
  146.     // Ruota la camera attorno al vettore Up
  147.     void RotateCamera(float deltaTime){
  148.         GLfloat velocity = this->MovementSpeed * deltaTime;
  149.  
  150.         this->Yaw += velocity;
  151.  
  152.         this->updateCameraVectors();
  153.     }
  154.  
  155.     // Ruota la camera attorno ad un punto nello spazio
  156.     mat4 RotateAroundPoint(vec3 objectPoint, GLfloat angle, vec3 axis){
  157.         GLfloat velocity = this->MovementSpeed * angle;
  158.  
  159.         vec3 oldPosition = this->Position;
  160.  
  161.         vec3 direction = normalize(this->Position - objectPoint);
  162.  
  163.         mat4 matrix = translate(mat4(1.0f), -direction);
  164.         matrix = rotate(matrix, velocity, axis);
  165.         matrix = translate(matrix, direction);
  166.  
  167.         this->Position = matrix * vec4(oldPosition, 1.0f);
  168.  
  169.         return lookAt(objectPoint, objectPoint + this->Front, this->Up);
  170.     }
  171.  
  172.     void setObjectPos(vec3 objPos) {
  173.         this->selectedBallPos = objPos;
  174.     }
  175.  
  176.     vec3 getObjectPos() {
  177.         return this->selectedBallPos;
  178.     }
  179.  
  180. private:
  181.     // Aggiorna il sistema di riferimento della camera
  182.     void updateCameraVectors() {
  183.         // Calcola il nuovo vettore Front, tramite calcoli trigonometrici legati agli angoli di Yaw e Pitch
  184.         vec3 front;
  185.         front.x = cos(radians(this->Yaw)) * cos(radians(this->Pitch));
  186.         front.y = sin(radians(this->Pitch));
  187.         front.z = sin(radians(this->Yaw)) * cos(radians(this->Pitch));
  188.         this->Front = normalize(front);
  189.         // Una volta calcolata la nuova direzione di vista, ricalcolo il vettore Right come prodotto vettoriale tra Front e la UP del mondo
  190.         this->Right = normalize(cross(this->Front, this->WorldUp));
  191.         // Calcolo il vettore UP locale della camera, come prodotto vettoriale tra Front e Right
  192.         this->Up = normalize(cross(this->Right, this->Front));
  193.     }
  194. };
  195. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement