Точки пространства камеры
This commit is contained in:
		
							parent
							
								
									3e159bccf7
								
							
						
					
					
						commit
						b463e0808c
					
				| @ -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,6 +62,8 @@ class Camera : public Node | ||||
|         glm::mat4 projection; // Матрица проекции
 | ||||
|         glm::mat4 vp; // Матрица произведения вида и проекции
 | ||||
|         bool requiredRecalcVP; // Необходимость пересчета матрицы вида и проекции камеры
 | ||||
|         bool requiredRecalcCoords; // Необходимость пересчета точек, описывающих пространство камеры
 | ||||
|         glm::vec4 coords[8]; // Координаты, описывающие пространство камеры
 | ||||
| 
 | ||||
|         float sensitivity; // Чувствительность мыши
 | ||||
|          | ||||
|  | ||||
| @ -141,6 +141,7 @@ void Camera::recalcMatrices() | ||||
|     if (requiredRecalcVP) | ||||
|     { | ||||
|         vp = projection * view; | ||||
|         requiredRecalcCoords = true; // Требуется пересчитать точки пространства камеры
 | ||||
|         requiredRecalcVP = false; // Изменения применены
 | ||||
|     } | ||||
| } | ||||
| @ -187,3 +188,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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user