不正确的顶点& 3D模型加载中的正常访问使用ASSIMP& OpenGL的

时间:2011-11-02 05:18:15

标签: c++ opengl

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

enter image description here

虽然模型应该类似于以下屏幕截图:

enter image description here

在第一张图片中,建筑物的屋顶位于前视图的中央顶部。地板不见了。我假设这个问题是由对顶点位置和法线(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();

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

1 个答案:

答案 0 :(得分:2)

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

导出器或加载器中的某处此信息丢失。

您可以在3D建模器中修复此问题,方法是将网格划分为较硬的边缘,即选择平滑光亮表面的连续色块并将其转换为单独的子网格(例如,通过“分割网格”功能在Blender中,热键'Y' )。