#ifndef CAMERA_H #define CAMERA_H #include // Ближняя граница области отсечения #define CAMERA_NEAR 0.1f // Дальняя граница области отсечения #define CAMERA_FAR 100.0f // Вектор, задающий верх для камеры #define CAMERA_UP_VECTOR glm::vec3(0.0f, 1.0f, 0.0f) // Стандартный угол обзора #define CAMERA_FOVy 60.0f class Camera { public: Camera(float aspect, const glm::vec3 &position = glm::vec3(0.0f, 0.0f, 0.0f), const glm::vec2 &xyOffset = glm::vec2(90.0f, 0.0f), float fovy = CAMERA_FOVy); // Конструктор камеры с проекцией перспективы Camera(float width, float height, const glm::vec3 &position = glm::vec3(0.0f, 0.0f, 0.0f), const glm::vec2 &xyOffset = glm::vec2(90.0f, 0.0f)); // Конструктор ортографической камеры virtual ~Camera(); // Деструктор const glm::mat4& getVP(); // Возвращает ссылку на константную матрицу произведения матриц вида и проекции const glm::mat4& getProjection(); // Возвращает ссылку на константную матрицу проекции const glm::mat4& getView(); // Возвращает ссылку на константную матрицу вида void rotate(const glm::vec2 &xyOffset); // Поворачивает камеру на dx и dy пикселей void move(const glm::vec3 &posOffset); // Сдвигает камеру на указанный вектор (dx,dy,dz) void setPosition(const glm::vec3 &position); // Устанавливает местоположение void setRotation(const glm::vec2 &xyOffset); // Устанавливает угол поворота камеры void setPerspective(float fov, float aspect); // Устанавливает заданную матрицу перспективы void setOrtho(float width, float height); // Устанавливает заданную ортографическую матрицу void setSensitivity(float sensitivity); // Изменяет чувствительность мыши protected: Camera(const glm::vec3 &position, const glm::vec2 &xyOffset); // Защищенный (protected) констуктор камеры без перспективы void recalcTarget(); // Пересчет цели, на которую смотрит камера void recalcView(); // Пересчет матрицы вида void recalcVP(); // Пересчет произведения матриц glm::vec3 position; // Местоположение камеры glm::vec3 target; // Цель, на которую смотрит камера glm::vec2 currentRotation; // Текущий поворот камеры glm::mat4 projection; // Матрица проекции glm::mat4 view; // Матрица вида glm::mat4 vp; // Матрица произведения вида и проекции bool requiredRecalcVP; // Необходимость пересчета матрицы вида и проекции камеры bool requiredRecalcView; // Необходимость пересчета матрицы вида камеры float sensitivity; // Чувствительность мыши }; #endif // CAMERA_H