Точки пространства камеры

This commit is contained in:
parent c7b14515e4
commit ce3b28c054
2 changed files with 38 additions and 1 deletions

View File

@ -54,6 +54,7 @@ class Camera : public Node
static Camera& current(); // Ссылка на текущую используемую камеру static Camera& current(); // Ссылка на текущую используемую камеру
CameraData& getData(); // Данные о камере для шейдера CameraData& getData(); // Данные о камере для шейдера
std::pair<bool, const glm::vec4*> getProjCoords(); // Доступ к координатам с флагом изменения, описывающим пространство вида с пересчетом, если это требуется
protected: protected:
Camera(const glm::vec3 &position, const glm::vec3 &initialRotation); // Защищенный (protected) конструктор камеры без перспективы Camera(const glm::vec3 &position, const glm::vec3 &initialRotation); // Защищенный (protected) конструктор камеры без перспективы
@ -61,6 +62,8 @@ class Camera : public Node
glm::mat4 projection; // Матрица проекции glm::mat4 projection; // Матрица проекции
glm::mat4 vp; // Матрица произведения вида и проекции glm::mat4 vp; // Матрица произведения вида и проекции
bool requiredRecalcVP; // Необходимость пересчета матрицы вида и проекции камеры bool requiredRecalcVP; // Необходимость пересчета матрицы вида и проекции камеры
bool requiredRecalcCoords; // Необходимость пересчета точек, описывающих пространство камеры
glm::vec4 coords[8]; // Координаты, описывающие пространство камеры
float sensitivity; // Чувствительность мыши float sensitivity; // Чувствительность мыши

View File

@ -143,6 +143,7 @@ void Camera::recalcMatrices()
if (requiredRecalcVP) if (requiredRecalcVP)
{ {
vp = projection * view; vp = projection * view;
requiredRecalcCoords = true; // Требуется пересчитать точки пространства камеры
requiredRecalcVP = false; // Изменения применены requiredRecalcVP = false; // Изменения применены
} }
} }
@ -189,3 +190,36 @@ CameraData& Camera::getData()
data = {getProjection(), getView(), position}; data = {getProjection(), getView(), position};
return data; return data;
} }
// Доступ к координатам с флагом изменения, описывающим пространство вида с пересчетом, если это требуется
std::pair<bool, const glm::vec4*> 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);
}