Расчет касательного и бикасательного векторов при загрузке модели
This commit is contained in:
parent
04ab88eb0e
commit
2aaf2b51b2
|
@ -13,6 +13,8 @@
|
||||||
|
|
||||||
class Model genShpere(float radius, int sectorsCount, class Node* parent = NULL); // Генерирует сферу заданного радиуса с определенным количеством сегментов
|
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
|
class Node
|
||||||
{
|
{
|
||||||
|
|
|
@ -537,3 +537,44 @@ Model genShpere(float radius, int sectorsCount, Node* parent)
|
||||||
|
|
||||||
return result;
|
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; // одинаковое
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -126,6 +126,7 @@ Scene loadOBJtoScene(const char* filename, const char* mtl_directory, const char
|
||||||
std::vector<glm::vec3> verteces; // вершины
|
std::vector<glm::vec3> verteces; // вершины
|
||||||
std::vector<glm::vec3> normals; // нормали
|
std::vector<glm::vec3> normals; // нормали
|
||||||
std::vector<glm::vec2> texCords; // текстурные координаты
|
std::vector<glm::vec2> texCords; // текстурные координаты
|
||||||
|
std::vector<glm::vec3> tangent, bitangent; // касательный и бикасательный веткоры
|
||||||
size_t hash; // Для уникальных вершин
|
size_t hash; // Для уникальных вершин
|
||||||
std::map <int, int> uniqueVerteces; // словарь для уникальных вершин: ключ - хеш, значение - индекс вершины
|
std::map <int, int> uniqueVerteces; // словарь для уникальных вершин: ключ - хеш, значение - индекс вершины
|
||||||
|
|
||||||
|
@ -190,12 +191,18 @@ Scene loadOBJtoScene(const char* filename, const char* mtl_directory, const char
|
||||||
}
|
}
|
||||||
} // for (const auto& shape : shapes)
|
} // 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_verteces (&verteces[0], verteces.size());
|
||||||
model.load_normals (&normals[0], normals.size());
|
model.load_normals (&normals[0], normals.size());
|
||||||
model.load_texCoords(&texCords[0], texCords.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());
|
model.load_indices (&indices[0], indices.size());
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue