Точки пространства камеры
This commit is contained in:
parent
c7b14515e4
commit
ce3b28c054
|
@ -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,7 +62,9 @@ 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; // Чувствительность мыши
|
||||||
|
|
||||||
virtual void recalcMatrices(); // Метод пересчета матрицы вида и произведения Вида*Проекции по необходимости, должен сбрасывать флаг changed
|
virtual void recalcMatrices(); // Метод пересчета матрицы вида и произведения Вида*Проекции по необходимости, должен сбрасывать флаг changed
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue