From 2aaf2b51b237e97d9abafe2e1821316f5de2e8af Mon Sep 17 00:00:00 2001 From: "re.kovalev" Date: Thu, 2 Feb 2023 18:57:31 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B0=D1=81=D1=87=D0=B5=D1=82=20=D0=BA?= =?UTF-8?q?=D0=B0=D1=81=D0=B0=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D0=BE=D0=B3?= =?UTF-8?q?=D0=BE=20=D0=B8=20=D0=B1=D0=B8=D0=BA=D0=B0=D1=81=D0=B0=D1=82?= =?UTF-8?q?=D0=B5=D0=BB=D1=8C=D0=BD=D0=BE=D0=B3=D0=BE=20=D0=B2=D0=B5=D0=BA?= =?UTF-8?q?=D1=82=D0=BE=D1=80=D0=BE=D0=B2=20=D0=BF=D1=80=D0=B8=20=D0=B7?= =?UTF-8?q?=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=BA=D0=B5=20=D0=BC=D0=BE=D0=B4?= =?UTF-8?q?=D0=B5=D0=BB=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/Model.h | 2 ++ src/Model.cpp | 41 +++++++++++++++++++++++++++++++++++++++++ src/Scene.cpp | 9 ++++++++- 3 files changed, 51 insertions(+), 1 deletion(-) diff --git a/include/Model.h b/include/Model.h index 7984296..901f2c0 100644 --- a/include/Model.h +++ b/include/Model.h @@ -13,6 +13,8 @@ class Model genShpere(float radius, int sectorsCount, class Node* parent = NULL); // Генерирует сферу заданного радиуса с определенным количеством сегментов +void calc_tb(const GLuint* indices, const int indices_count, const glm::vec3* verteces, const glm::vec2* texCords, glm::vec3* tangent, glm::vec3* bitangent); // Расчет касательных и бикасательных векторов + // Класс узла сцены class Node { diff --git a/src/Model.cpp b/src/Model.cpp index 12fc3d7..86a4954 100644 --- a/src/Model.cpp +++ b/src/Model.cpp @@ -537,3 +537,44 @@ Model genShpere(float radius, int sectorsCount, Node* parent) return result; } + +// Расчет касательных и бикасательных векторов +void calc_tb(const GLuint* indices, const int indices_count, const glm::vec3* verteces, const glm::vec2* texCords, glm::vec3* tangent, glm::vec3* bitangent) +{ + glm::vec2 dTex1, dTex2; // Разница по текстурным координатам + glm::vec3 dPos1, dPos2; // Разница по координатам вершин + float f; // Разность произведений + glm::vec3 tmp; // Для вычислений вектора + + for (int i = 0; i < indices_count; i+=3) + { + // Разности векторов + dTex1 = texCords[indices[i+1]] - texCords[indices[i]]; + dTex2 = texCords[indices[i+2]] - texCords[indices[i]]; + dPos1 = verteces[indices[i+1]] - verteces[indices[i]]; + dPos2 = verteces[indices[i+2]] - verteces[indices[i]]; + f = dTex1.x * dTex2.y - dTex2.x * dTex1.y; + + // Покомпонентное вычисление касательного вектора + tmp.x = (dTex2.y * dPos1.x - dTex1.y * dPos2.x) / f; + tmp.y = (dTex2.y * dPos1.y - dTex1.y * dPos2.y) / f; + tmp.z = (dTex2.y * dPos1.z - dTex1.y * dPos2.z) / f; + // Нормируем значение + tmp = glm::normalize(tmp); + // Добавим вектор в контейнер + tangent[indices[i ]] = tmp; // Для каждого индекса полигона + tangent[indices[i+1]] = tmp; // значение вектора + tangent[indices[i+2]] = tmp; // одинаковое + + // Покомпонентное вычисление бикасательного вектора + tmp.x = (-dTex2.x * dPos1.x + dTex1.x * dPos2.x) / f; + tmp.y = (-dTex2.x * dPos1.y + dTex1.x * dPos2.y) / f; + tmp.z = (-dTex2.x * dPos1.z + dTex1.x * dPos2.z) / f; + // Нормируем значение + tmp = glm::normalize(tmp); + // Добавим вектор в контейнер + bitangent[indices[i ]] = tmp; // Для каждого индекса полигона + bitangent[indices[i+1]] = tmp; // значение вектора + bitangent[indices[i+2]] = tmp; // одинаковое + } +} diff --git a/src/Scene.cpp b/src/Scene.cpp index 5e56492..7693945 100644 --- a/src/Scene.cpp +++ b/src/Scene.cpp @@ -126,6 +126,7 @@ Scene loadOBJtoScene(const char* filename, const char* mtl_directory, const char std::vector verteces; // вершины std::vector normals; // нормали std::vector texCords; // текстурные координаты + std::vector tangent, bitangent; // касательный и бикасательный веткоры size_t hash; // Для уникальных вершин std::map uniqueVerteces; // словарь для уникальных вершин: ключ - хеш, значение - индекс вершины @@ -190,12 +191,18 @@ Scene loadOBJtoScene(const char* filename, const char* mtl_directory, const char } } // for (const auto& shape : shapes) - + // Изменим размер массивов + tangent.resize(verteces.size()); + bitangent.resize(verteces.size()); + // Расчет касательных и бикасательных векторов + calc_tb(indices.data(), indices.size(), verteces.data(), texCords.data(), tangent.data(), bitangent.data()); // Загрузка в буферы model.load_verteces (&verteces[0], verteces.size()); model.load_normals (&normals[0], normals.size()); model.load_texCoords(&texCords[0], texCords.size()); + model.load_tangent(&tangent[0], tangent.size()); + model.load_bitangent(&bitangent[0], bitangent.size()); // Загрузка индексного буфера model.load_indices (&indices[0], indices.size());