From ce3b28c05490c6f7a574d81c49090637ace0fdc1 Mon Sep 17 00:00:00 2001 From: "re.kovalev" Date: Tue, 31 Oct 2023 10:40:26 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A2=D0=BE=D1=87=D0=BA=D0=B8=20=D0=BF=D1=80?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D1=80=D0=B0=D0=BD=D1=81=D1=82=D0=B2=D0=B0=20?= =?UTF-8?q?=D0=BA=D0=B0=D0=BC=D0=B5=D1=80=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/Camera.h | 5 ++++- src/Camera.cpp | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/include/Camera.h b/include/Camera.h index ce73c2f..439094f 100644 --- a/include/Camera.h +++ b/include/Camera.h @@ -54,6 +54,7 @@ class Camera : public Node static Camera& current(); // Ссылка на текущую используемую камеру CameraData& getData(); // Данные о камере для шейдера + std::pair getProjCoords(); // Доступ к координатам с флагом изменения, описывающим пространство вида с пересчетом, если это требуется protected: Camera(const glm::vec3 &position, const glm::vec3 &initialRotation); // Защищенный (protected) конструктор камеры без перспективы @@ -61,7 +62,9 @@ class Camera : public Node glm::mat4 projection; // Матрица проекции glm::mat4 vp; // Матрица произведения вида и проекции bool requiredRecalcVP; // Необходимость пересчета матрицы вида и проекции камеры - + bool requiredRecalcCoords; // Необходимость пересчета точек, описывающих пространство камеры + glm::vec4 coords[8]; // Координаты, описывающие пространство камеры + float sensitivity; // Чувствительность мыши virtual void recalcMatrices(); // Метод пересчета матрицы вида и произведения Вида*Проекции по необходимости, должен сбрасывать флаг changed diff --git a/src/Camera.cpp b/src/Camera.cpp index d2eb97f..2b77842 100644 --- a/src/Camera.cpp +++ b/src/Camera.cpp @@ -143,6 +143,7 @@ void Camera::recalcMatrices() if (requiredRecalcVP) { vp = projection * view; + requiredRecalcCoords = true; // Требуется пересчитать точки пространства камеры requiredRecalcVP = false; // Изменения применены } } @@ -189,3 +190,36 @@ CameraData& Camera::getData() data = {getProjection(), getView(), position}; return data; } + +// Доступ к координатам с флагом изменения, описывающим пространство вида с пересчетом, если это требуется +std::pair Camera::getProjCoords() +{ + const glm::mat4& cam_vp = getVP(); // Получение ссылки на матрицу вида-проекции с пересчетом, если требуется и активацией флага requiredRecalcCoords + bool changes = false; // Возвращаемое значение + + if (requiredRecalcCoords) + { + // Инверсия матрицы вида/проекции камеры + glm::mat4 inv = glm::inverse(cam_vp); + // Типовые точки, описывающие пространство + glm::vec4 typical_points[8] = { { 1, 1, 1,1} + , { 1, 1,-1,1} + , { 1,-1, 1,1} + , { 1,-1,-1,1} + , {-1, 1, 1,1} + , {-1, 1,-1,1} + , {-1,-1, 1,1} + , {-1,-1,-1,1}}; + // Цикл по типовым точкам + for (int i = 0; i < 8; i++) + { + coords[i] = inv * typical_points[i]; + coords[i] /= coords[i].w; // Переход от гомогенных координат к обычным + } + + requiredRecalcCoords = false; // Сбрасываем флаг + changes = true; + } + + return std::make_pair(changes, coords); +}