Привет всем!
Решил переделать экспортер что-бы экспортировались индексы. Текстурные координаты на экране выглядят не правильными.
Раньше экспортер собирал готовые полигоны без индексов. Все работало и экспортировалось правильно.
Экспорт делаю так.
Сначала поиск максимальной текстурной координаты tv( Y ) (их надо переворачивать) для текущего материала.
везде учитывается порядок обхода греней.
Проход по всем материалам { Проход по всем полигонам { если индекс материала совпадает с индексом материала полигона, ищу максимальную текстурную координату tv( Y ). } }
стандартный экспорт индексов для полигонов.
далее идет экспорт вершин тут лучше приведу кусок кода:
// ранее записанный массив максимальных значений tv для каждого материала std::vector<float> MaxTV; // Описание вершины struct Vertex { // вершина Point3 v; // нормаль Point3 normal; //текстурная координата Point2 tvert; Vertex(); }; ... // массив учитывающий порядок обхода грани int orderPass[3]; ... // массив вершин std::vector<Vertex> writeVertices(nVertex); // цикл по граням for(j = 0; j < nTriangles; ++j) { // индекс материала int MatId = mesh.getFaceMtlIndex(j); // по 3 вершинам грани for(k = 0; k < 3; ++k) { // индекс вершины int vertexId = mesh.faces[j].v[orderPass[k]]; // индекс текстурной координаты int tvertexId = mesh.tvFace[j].t[orderPass[k]]; // получить вершину Point3 vec = mesh.verts[vertexId]; // обнулить 4 столбец чтобы не учитывалось смещение tm.SetRow(3, Point3(0.0f, 0.0f, 0.0f)); // записать без смещения writeVertices[vertexId].v = tm * vec; // обмен значениями std::swap(writeVertices[vertexId].v.z, writeVertices[vertexId].v.y); // Получение RVertex RVertex &rVert = mesh.getRVert(vertexId); // получить нормаль GetVertexNormal(mesh, j, rVert, writeVertices[vertexId].normal); // скопировать x по умолчанию writeVertices[vertexId].tvert.x = mesh.tVerts[tvertexId].x; // перевернуть y writeVertices[vertexId].tvert.y = MaxTV[MatId] - mesh.tVerts[tvertexId].y; } }
Вот что получилось в результате
что я делаю не так? Если нужен еще кусок окда то я могу запостить. Прошу помочь я в тупике :(
Спасибо всем заранее!
С уважением Андрей.
>>writeVertices[vertexId].tvert.y = MaxTV[MatId] - mesh.tVerts[tvertexId].y;
Переворачивается не так, а 1.0 - mesh.tVerts[tvertexId].y. Ето и есть различие, которое вносить MAX и там нет ничего, что бъ имело отношение к каким либо текстурнъм координатам модели - всего лиш перевернутъй битмап.
Zemedelec
ну к примеру я в лог выводил чему же равно MaxTV, у меня и получается что 1.0f == MaxTV. Я конечно все это потом проверю и если действительно всегда 1.0f == MaxTV, то я уберу поиcк MaxTV.
Тема в архиве.