我使用ASSIMP sample code中提供的纹理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();
我们如何正确访问模型的顶点位置和法线?
答案 0 :(得分:2)
会发生什么,具有相同位置的顶点是“共享的”。这是有问题的,因为(在OpenGL术语中),顶点是[位置,法线,纹理坐标,其他属性...]的整个组合。
导出器或加载器中的某处此信息丢失。
您可以在3D建模器中修复此问题,方法是将网格划分为较硬的边缘,即选择平滑光亮表面的连续色块并将其转换为单独的子网格(例如,通过“分割网格”功能在Blender中,热键'Y' )。