从obj文件中绘制模型

时间:2012-04-11 12:55:07

标签: c++ opengl

我正在尝试用openGl编写一个obj查看器。这个程序只需绘制模型面的线,所以我需要加载:

  • 顶点:有时是3D,有时是4D;
  • faces:索引列表,随机长度;

现在我只加载obj文件,每面有3个元素,所以我可以在GL_TRIANGLE模式下绘制元素,但是我遇到了一些模型的麻烦:

http://people.sc.fsu.edu/~jburkardt/data/obj/icosahedron.obj

加载阶段似乎运行良好,我认为问题出在render()函数中:

static void render(void)
{
    glClearColor( 0.0f, 0.0f, 0.0, 0.0f);
    glClear(GL_COLOR_BUFFER_BIT);

    glBindBuffer(GL_ARRAY_BUFFER, g_resources.vertex_buffer);
    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(
        3,                                /* size */
        GL_FLOAT,                         /* type */
        3*sizeof(GLfloat),                /* stride */
        (void*)0                          /* array buffer offset */
    );

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, g_resources.element_buffer);

    glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
    glEnable(GL_CULL_FACE);
    glCullFace(GL_BACK);

    glDrawElements(
        GL_TRIANGLES,           /* mode */
        theModel->face.size(),  /* count */
        GL_UNSIGNED_INT,        /* type */
        (void*)0                /* element array buffer offset */
    );

    glDisableClientState(GL_VERTEX_ARRAY);

    glutSwapBuffers();
}

我还有一些问题:

  • indeces从1或0开始?
  • 关于indeces枚举的内容是什么?它是顺时针式吗?
  • 这是一个很好的解决方案,对三个以上的零件进行三角测量吗?

2 个答案:

答案 0 :(得分:5)

  • 指数基于1
  • 逆时针

答案 1 :(得分:1)

如果您只是使用某些模型遇到问题,请尝试禁用GL_CULL_FACE以查看它可能是顶点顺序的区别。

OBJ中的指数基于1,GL基于0,因此在制作缓冲区时需要-1。