简体   繁体   English

尝试从OpenGL中的.obj绘制网格时,某些三角形未显示

[英]Some Triangles not displaying when trying to draw a mesh from a .obj in OpenGL

I'm attempting to display an object loaded from a .obj file. 我正在尝试显示从.obj文件加载的对象。 I use this function to read in the .obj: 我使用此函数来读取.obj:

bool loadOBJ(
    const char * path, 
    std::vector<glm::vec3> & vertices,
    std::vector<glm::vec3> & vertexIndices
){
    printf("Loading OBJ file %s...\n", path);

    FILE * file = fopen(path, "r");
    if( file == NULL ){
            printf("Impossible to open the file ! Are you in the right path ? \n");
            getchar();
            return false;
    }

    while( 1 ){

            char lineHeader[128];
            // read the first word of the line
            int res = fscanf(file, "%s", lineHeader);
            if (res == EOF)
                    break; // EOF = End Of File. Quit the loop.

            // else : parse lineHeader

            if ( strcmp( lineHeader, "v" ) == 0 ){
                    glm::vec3 vertex;
                    fscanf(file, "%f %f %f\n", &vertex.x, &vertex.y, &vertex.z );
                    vertices.push_back(vertex);
            }else if ( strcmp( lineHeader, "f" ) == 0 ){

                    glm::vec3 vertexIndex;
                    fscanf(file, "%f %f %f\n", &vertexIndex.x, &vertexIndex.y, &vertexIndex.z );
                    vertexIndices.push_back(vertexIndex);
            }else{
                    // Probably a comment, eat up the rest of the line
                    char stupidBuffer[1000];
                    fgets(stupidBuffer, 1000, file);
            }

    }

    return true;
}

I then call this function in my init function. 然后,我在init函数中调用此函数。 Once the mesh is loaded I display it by looping through the vertices here: 加载网格后,我将在此处遍历顶点显示它:

for (unsigned int i = 0; i < meshVertices.size(); i++)
    {
        glBegin(GL_TRIANGLES); 
            glVertex3f(meshVertices[faceIndices[i].x-1].x, meshVertices[faceIndices[i].x-1].y, meshVertices[faceIndices[i].x-1].z); 
            glVertex3f(meshVertices[faceIndices[i].y-1].x, meshVertices[faceIndices[i].y-1].y, meshVertices[faceIndices[i].y-1].z); 
            glVertex3f(meshVertices[faceIndices[i].z-1].x, meshVertices[faceIndices[i].z-1].y, meshVertices[faceIndices[i].z-1].z); 
        glEnd();

    }

However, when the program runs, the far side of the object doesn't load at all and random triangles are missing. 但是,当程序运行时,对象的另一端根本无法加载,并且随机三角形也丢失了。 Like this: 像这样:

屏幕截图

You don't want to loop the size of the vertices, but the size of the faces. 您不希望循环顶点的大小,而是循环面的大小。

Your loop should read for (unsigned int i = 0; i < faceIndices.size(); i++) 您的循环应读取for (unsigned int i = 0; i < faceIndices.size(); i++)

You are looping through the variable faceIndices[i] and I suppose that you want to draw all the triangles, not all the point (vertices)! 您正在遍历变量faceIndices[i] ,我想您想绘制所有三角形,而不是所有点(顶点)!


On a side note: Am I teaching you this course? 附带说明:我正在教你这门课程吗? :D That code looks familiar... :D该代码看起来很熟悉...

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM