从 obj 文件绘制模型

问题描述 投票:0回答:2

我正在尝试用 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();
}

我还有一些问题:

  • 下数是从1开始还是从0开始?
  • indeces 枚举有什么用?是顺时针方向的吗?
  • 对具有超过 3 个不等数的面进行三角剖分是一个好的解决方案吗?
c++ opengl glut wavefront
2个回答
5
投票
  • 索引基于 1
  • 逆时针
  • 是的

1
投票

如果您仅遇到某些模型的问题,请尝试禁用 GL_CULL_FACE 以查看差异,这可能是顶点顺序问题。

OBJ 中的索引是从 1 开始的,GL 中的索引是从 0 开始的,因此在创建缓冲区时需要 -1。

© www.soinside.com 2019 - 2024. All rights reserved.