c++ - Assimp 对现有 aiVector3D 的访问冲突

标签 c++ access-violation assimp

我使用以下代码通过 Assimp 加载到 .obj 文件中。 TextureCoordinates 出现问题。我尝试访问的 aiVector3D 存在,但一旦我将值存储在临时变量中,它就会使我的应用程序崩溃。

这是我使用的代码:

    Assimp::Importer importer;

    const aiScene* scene = importer.ReadFile(filename,
        aiProcess_CalcTangentSpace |
        aiProcess_Triangulate |
        aiProcess_JoinIdenticalVertices |
        aiProcess_SortByPType);

    if (!scene)
    {
        printf("[ASSIMP] ");
        printf(importer.GetErrorString());
        printf("\n");
        return nullptr;
    }

    Mesh* newMesh = new Mesh();
    unsigned int vertexCount            = scene->mMeshes[0]->mNumVertices;
    unsigned int triangleCount          = scene->mMeshes[0]->mNumFaces;
    bool hasUv                          = scene->mMeshes[0]->HasTextureCoords(0);
    newMesh->vertexCount                = vertexCount;
    newMesh->triangleCount              = triangleCount;
    newMesh->m_Vertices                 = new Vertex[vertexCount];
    newMesh->m_Triangles                = new Triangle[triangleCount];

    for (unsigned int i = 0; i < vertexCount; i++) {
        aiVector3D vertexPosition       = scene->mMeshes[0]->mVertices[i];
        aiVector3D vertexNormal         = scene->mMeshes[0]->mNormals[i];
        newMesh->m_Vertices[i].pos      = glm::vec3(vertexPosition.x, vertexPosition.y, vertexPosition.z);
        newMesh->m_Vertices[i].normal   = glm::vec3(vertexNormal.x, vertexNormal.y, vertexNormal.z);
        if (hasUv) {
            aiVector3D uvCoordinates    = scene->mMeshes[0]->mTextureCoords[i][0];
            printf("uvCoordinates: %f %f %f\n", uvCoordinates.x, uvCoordinates.y, uvCoordinates.z);
            newMesh->m_Vertices[i].u    = uvCoordinates.x;
            newMesh->m_Vertices[i].v    = uvCoordinates.y;
        }
    }

    for (unsigned int i = 0; i < triangleCount; i++) {
        aiFace face                     = scene->mMeshes[0]->mFaces[i];
        for (int j = 0; j < 3; j++) {
            Triangle* tri               = &newMesh->m_Triangles[i];
            tri->vertex[j]              = &newMesh->m_Vertices[face.mIndices[j]];
            if (tri->vertex[0]->normal.y == 1.0f || tri->vertex[0]->normal.y == -1.0f) {
                tri->color              = glm::vec3(0.2f, 0.2f, 0.2f);
            }
            else
            {
                tri->color              = glm::vec3(1.0f, 0.0f, 0.0f);
            }
        }
    }

它在行 printf("uvCoordinates: %f %f %f\n", uvCoordinates.x, uvCoordinates.y, uvCoordinates.z); 处崩溃,但是如果我删除这一行,它在 newMesh->m_Vertices[i].u = uvCoordinates.x; 处崩溃。如果我注释掉 printf(),将顶点的 uv 都设置为 0.0f 并且根本不使用 uvCoordinates,它仍然在 newMesh->m_Vertices[i].u = uvCoordinates.x; 行上崩溃。如果我不对 printf() 进行注释,它会打印 uvCoordinates 的值,但之后会引发访问冲突。

老实说,我在这里没有想法。这是 a screenshot显示我解释的内容。

最佳答案

scene->mMeshes[0]->mTextureCoords[i][0]; 是集合 i 的第一个纹理坐标。你想要的是获得第一组纹理坐标 - 所以它应该是 scene->mMeshes[0]->mTextureCoords[0][i];

关于c++ - Assimp 对现有 aiVector3D 的访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27975883/

相关文章:

c++ - 如何在C++中重载<<<用于 vector <int>的运算符

c++ - 在 C++ 中,当元素索引在运行时已知时,是否可以获取元组中一个元素的类型?

c++ - 我的代码有什么问题? (pdcurses/getmaxyx)

c++ - 在Visual Studio 2015中链接Assimp 3.1.1

c++ - 对 OpenGL 对象应用了错误的 UV 映射

c++ - 如何将 vtkDoubleArray 转换为 Eigen::matrix

c++ - 从 volatile uint8_t* 到 uint8_t* 的无效转换

c - 在多线程生产者和消费者应用程序中读取时发生访问冲突

delphi - 使用 Windows 文件对话框时在奇怪的地方访问冲突

c++ - 使用 MinGW 构建 ASSIMP 会导致文件太大错误