Assimp не считывает информацию о координатах текстуры из файла слоев

#textures #game-engine #mesh #assimp

#Текстуры #игровой движок #сетка #assimp

Вопрос:

Я пытаюсь загрузить некоторые файлы ply с помощью assimp. Я получаю местоположения вершин, и нормали также загружаются должным образом (я вижу, что они отображаются на экране, так что все хорошо), однако кажется, что координаты текстуры никогда не загружаются. Это приводит к тому, что текстуры не отображаются на моделях, а вместо текстуры на них отображаются мои рассеянные цвета.

Я просмотрел свой код и обнаружил, что проблема заключается в классе загрузчика assimp, который я создал. mTextureCoords[0][индекс] полностью равен нулю.

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

Вот фрагмент метода loader, который содержит код для получения координат текстуры

     if (scene->HasMeshes()) {   //Check to see if the filename was valid

        aiMesh* aiMesh = *scene->mMeshes;

        theMesh.numberOfVertices = aiMesh->mNumVertices;

        //Create the number of vertices that this mesh has.
        theMesh.pVertices = new sVertex_xyz_rgba_n_uv2_bt[theMesh.numberOfVertices];

        theMesh.minXYZ.x = aiMesh->mVertices[0].x;
        theMesh.minXYZ.y = aiMesh->mVertices[0].y;
        theMesh.minXYZ.z = aiMesh->mVertices[0].z;

        theMesh.maxXYZ = theMesh.minXYZ;

        for (unsigned int index = 0; index != theMesh.numberOfVertices; index  ) {
            theMesh.pVertices[index].x = aiMesh->mVertices[index].x;
            theMesh.pVertices[index].y = aiMesh->mVertices[index].y;
            theMesh.pVertices[index].z = aiMesh->mVertices[index].z;

            if (theMesh.pVertices[index].x < theMesh.minXYZ.x) { theMesh.minXYZ.x = theMesh.pVertices[index].x; }
            if (theMesh.pVertices[index].y < theMesh.minXYZ.y) { theMesh.minXYZ.y = theMesh.pVertices[index].y; }
            if (theMesh.pVertices[index].z < theMesh.minXYZ.z) { theMesh.minXYZ.z = theMesh.pVertices[index].z; }

            if (theMesh.pVertices[index].x > theMesh.maxXYZ.x) { theMesh.maxXYZ.x = theMesh.pVertices[index].x; }
            if (theMesh.pVertices[index].y > theMesh.maxXYZ.y) { theMesh.maxXYZ.y = theMesh.pVertices[index].y; }
            if (theMesh.pVertices[index].z > theMesh.maxXYZ.z) { theMesh.maxXYZ.z = theMesh.pVertices[index].z; }


            theMesh.pVertices[index].nx = aiMesh->mNormals[index].x;
            theMesh.pVertices[index].ny = aiMesh->mNormals[index].y;
            theMesh.pVertices[index].nz = aiMesh->mNormals[index].z;


            int numUVComponents = aiMesh->mNumUVComponents[0];

            if (numUVComponents == 2) {
                theMesh.pVertices[index].u1 = aiMesh->mTextureCoords[0][index].x;
                theMesh.pVertices[index].v1 = aiMesh->mTextureCoords[0][index].y;
            }
        }

        theMesh.numberOfTriangles = scene->mMeshes[0]->mNumFaces;
        theMesh.pTriangles = new cTriangle[theMesh.numberOfTriangles];

        //Copy the triangle vertex information (indices)
        for (int triIndex = 0; triIndex != theMesh.numberOfTriangles; triIndex  ) {
            theMesh.pTriangles[triIndex].vertex_ID_0 = aiMesh->mFaces[triIndex].mIndices[0];
            theMesh.pTriangles[triIndex].vertex_ID_1 = aiMesh->mFaces[triIndex].mIndices[1];
            theMesh.pTriangles[triIndex].vertex_ID_2 = aiMesh->mFaces[triIndex].mIndices[2];
        }
    }
  

и вот фрагмент файла модели, который я пытаюсь загрузить с помощью assimp, с заголовком и несколькими строками вершин, нормалей и uvs.

 ply
format ascii 1.0
comment VCGLIB generated
element vertex 289
property float x
property float y
property float z
property float nx
property float ny
property float nz
property float texture_u
property float texture_v
element face 512
property list uchar int vertex_indices
end_header
-400 1.748456e-05 400 0 0.25 -1.092785e-08 1.000000 0.000000
-350 1.748456e-05 400 0 0.25 -1.092785e-08 1.000000 0.062500
-300 1.748456e-05 400 0 0.25 -1.092785e-08 1.000000 0.125000
-250 1.748456e-05 400 0 0.25 -1.092785e-08 1.000000 0.187500
-200 1.748456e-05 400 0 0.25 -1.092785e-08 1.000000 0.250000
-150 1.748456e-05 400 0 0.25 -1.092785e-08 1.000000 0.312500
-100 1.748456e-05 400 0 0.25 -1.092785e-08 1.000000 0.375000
-50 1.748456e-05 400 0 0.25 -1.092785e-08 1.000000 0.437500
  

Надеюсь, кто-нибудь знает, где я напортачил =)
Заранее спасибо!

Ответ №1:

Все еще немного не уверен, почему assimp не может загрузить ply. Но я подтвердил, что мой код работает для файлов FBX. возможно, assimp несовместим с этим стилем?