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

This commit is contained in:
2023-10-31 10:40:26 +03:00
parent c7b14515e4
commit ce3b28c054
2 changed files with 38 additions and 1 deletions

View File

@@ -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<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);
}