C++ 不正确的顶点&;使用ASIMP&;在三维模型加载中正常访问;OpenGL

C++ 不正确的顶点&;使用ASIMP&;在三维模型加载中正常访问;OpenGL,c++,opengl,C++,Opengl,我使用ASSIMP中提供的纹理3d模型加载示例。但是,对于某些模型,它似乎无法正确访问模型的顶点和法线。以下是加载错误的模型的屏幕截图: 而模型应类似于以下屏幕截图: 在第一个图像中,建筑物的屋顶放置在前视图的中心顶部。地板不见了。我假设这个问题是由于不正确地访问顶点位置和法线(CMIIW)造成的。以下是用于访问顶点位置和法线的代码段: glBegin(face_mode); for(i = 0; i < face->mNumIndices; i+

我使用ASSIMP中提供的纹理3d模型加载示例。但是,对于某些模型,它似乎无法正确访问模型的顶点和法线。以下是加载错误的模型的屏幕截图:

而模型应类似于以下屏幕截图:

在第一个图像中,建筑物的屋顶放置在前视图的中心顶部。地板不见了。我假设这个问题是由于不正确地访问顶点位置和法线(CMIIW)造成的。以下是用于访问顶点位置和法线的代码段:

        glBegin(face_mode);
        for(i = 0; i < face->mNumIndices; i++){
            int vertexIndex = face->mIndices[i];    // get group index for current index
            if(mesh->mColors[0] != NULL)
                Color4f(&mesh->mColors[0][vertexIndex]); 
            if(mesh->mNormals != NULL)
                if(mesh->HasTextureCoords(0)){  
                    glTexCoord2f(mesh->mTextureCoords[0][vertexIndex].x,  mesh->mTextureCoords[0][vertexIndex].y);                  
                }
                glNormal3fv(&mesh->mNormals[vertexIndex].x);
                glVertex3fv(&mesh->mVertices[vertexIndex].x);
        }
        glEnd();
glBegin(面部模式);
对于(i=0;imnumindice;i++){
int vertexIndex=face->mIndices[i];//获取当前索引的组索引
如果(网格->颜色[0]!=NULL)
Color4f(&mesh->mColors[0][vertexIndex]);
如果(网格->mNormals!=NULL)
如果(网格->快速排序(0)){
glTexCoord2f(网格->mTextureCoords[0][vertexIndex].x,网格->mTextureCoords[0][vertexIndex].y);
}
glNormal3fv(&mesh->mNormals[vertexIndex].x);
glVertex3fv(&mesh->mVertices[vertexIndex].x);
}
格伦德();

我们如何才能正确访问模型的顶点位置和法线?

结果是,具有相同位置的顶点是“共享的”。这是有问题的,因为(在OpenGL术语中),顶点是[位置、法线、纹理坐标、其他属性…]的整个组合

在导出器或装入器中的某个位置,此信息丢失

您可以在3D modeler中通过在硬边分割网格来解决此问题,即选择平滑照明曲面的连续面片并将其转换为单独的子图(例如,在Blender中通过“分割网格”功能,热键“Y”)