загрузка модели Assimp не загружает все сетки - PullRequest
0 голосов
/ 15 сентября 2018

Я пытаюсь загрузить модель через assimp с несколькими сетками, вот код для загрузки модели:

bool loadAssImp(
    const char * path,
    std::vector<unsigned short> & indices,
    std::vector<glm::vec3> & vertices,
    std::vector<glm::vec2> & uvs,
    std::vector<glm::vec3> & normals
) {

    Assimp::Importer importer;

    const aiScene* scene = importer.ReadFile(path, aiProcess_Triangulate);
    if (!scene) {
        cout << importer.GetErrorString() << endl;
        return false;
    }

    aiMesh* mesh;
    for (unsigned int l = 0; l < scene->mNumMeshes; l++)
    {
        mesh = scene->mMeshes[l];
        cout << l << endl;
        // Fill vertices positions
        vertices.reserve(mesh->mNumVertices);
        for (unsigned int i = 0; i < mesh->mNumVertices; i++) {

            aiVector3D pos = mesh->mVertices[i];
            vertices.push_back(glm::vec3(pos.x, pos.y, pos.z));
        }

        // Fill vertices texture coordinates
        uvs.reserve(mesh->mNumVertices);
        for (unsigned int i = 0; i < mesh->mNumVertices; i++) {
            aiVector3D UVW = mesh->mTextureCoords[0][i]; // Assume only 1 set of UV coords; AssImp supports 8 UV sets.
            uvs.push_back(glm::vec2(UVW.x, UVW.y));
        }

        // Fill vertices normals
        normals.reserve(mesh->mNumVertices);
        for (unsigned int i = 0; i < mesh->mNumVertices; i++) {
            aiVector3D n = mesh->mNormals[i];
            normals.push_back(glm::vec3(n.x, n.y, n.z));
        }


        // Fill face indices
        indices.reserve(3 * mesh->mNumFaces);
        for (unsigned int i = 0; i < mesh->mNumFaces; i++) {
            // Assume the model has only triangles.
            indices.push_back(mesh->mFaces[i].mIndices[0]);
            indices.push_back(mesh->mFaces[i].mIndices[1]);
            indices.push_back(mesh->mFaces[i].mIndices[2]);
        }
    }

    // The "scene" pointer will be deleted automatically by "importer"
    return true;
}

модель, которую я пытаюсь загрузить, имеет две сетки: голова и торс

если я запускаю цикл следующим образом: for (int l = scene->mNumMeshes - 1; l >= 0 ; l--), тогда модель загружается почти правильно, некоторые вершины модели прорисовываются неправильно, но рисуется голова и почти весь торс.

если я начну цикл следующим образом: for (unsigned int l = 0; l < scene->mNumMeshes; l++) рисуется только торс (но рисуется полностью без каких-либо недостающих частей)

странно, что в обоих случаях число вершин и число индексов совпадают.

1 Ответ

0 голосов
/ 16 сентября 2018

Вам также необходимо установить преобразования, описанные экземплярами aiNode.Поэтому при загрузке цикла сцены над узлами установите преобразование локального узла, отрисовайте назначенные сетки для текущего узла.Без применения этой информации преобразования рендеринг модели будет нарушен.

...