Точки пространства камеры
This commit is contained in:
parent
c7b14515e4
commit
ce3b28c054
|
@ -54,6 +54,7 @@ class Camera : public Node
|
|||
static Camera& current(); // Ссылка на текущую используемую камеру
|
||||
|
||||
CameraData& getData(); // Данные о камере для шейдера
|
||||
std::pair<bool, const glm::vec4*> 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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue