0

openGlでobjビューアを作成しようとしています。このプログラムはモデルの顔の線だけを描く必要があるので、ロードする必要があります:

  • 頂点:3Dの場合もあれば、4Dの場合もあります。
  • 面:ランダムな長さのインデックスリスト。

ここで、面ごとに3つの要素を持つobjファイルのみをロードするので、要素を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つ以上のインデックで顔を三角測量するのは良い解決策ですか?
4

2 に答える 2

5
  • インデックスは1ベースです
  • 反時計回り
  • はい
于 2012-04-11T12:58:17.647 に答える
1

一部のモデルでのみ問題が発生する場合は、GL_CULL_FACEを無効にして、頂点の順序の違いを確認してください。

OBJのインデックスは1ベース、GLのインデックスは0ベースであるため、バッファーを作成するときに-1が必要です。

于 2012-04-11T13:23:54.863 に答える