1

解決済み: 方法はよくわかりません... 助けてくれてありがとう。

試してみglDisable(GL_CULL_FACE);ましたが、メッシュはまだ表示されていません。

基本的に、表示リストを使用して、OpenGL でメッシュ (頂点、法線、およびテクスチャ座標から作成) を描画しようとしています。メッシュは .obj 形式です (3ds max 2013 からエクスポート)

問題は、メッシュが表示されないことです。

今使用している表示リストを描画するにはglCallLists (list, 1);

画面の中央に点を描くことで画面に物を描くことができ、それがうまく機能することを確認しました。

カメラがメッシュの内側に配置されている可能性はありますか? もしそうなら、一連の頂点の内部を見ることができるようにするために有効にできる OpenGL 状態はありますか?

私が持っているデータはすべて有効であり、表示リストに追加する前に各頂点、法線、およびテクスチャ座標をファイルに出力することによって検証されていることを知っています。有効に見えます。

私はglTranslatef何も持っていません。私の射影行列は次のように設定されています。

glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
gluPerspective (45.0, (float)1024/(float)768, -9999, 9999);
glMatrixMode (GL_MODELVIEW);
glLoadIdentity ();

.obj ファイルを見たい場合は、ここにあります: http://pastebin.com/PpG3vG5e

これは、表示リストを作成する方法です。

list = glGenLists (1);
glNewList (list, GL_COMPILE);
glBegin (GL_TRIANGLES);

for (i = 0; i < data.face_count; i++)
{
    // first vert
    normal[0][0] = (float)data.vertex_normal_list[data.face_list[i]->normal_index[0]]->e[0];
    normal[0][1] = (float)data.vertex_normal_list[data.face_list[i]->normal_index[0]]->e[1];
    normal[0][2] = (float)data.vertex_normal_list[data.face_list[i]->normal_index[0]]->e[2];
    tex[0][0] = (float)data.vertex_texture_list[data.face_list[i]->texture_index[0]]->e[0];
    tex[0][1] = (float)data.vertex_texture_list[data.face_list[i]->texture_index[0]]->e[1];
    tex[0][2] = (float)data.vertex_texture_list[data.face_list[i]->texture_index[0]]->e[2];
    vert[0][0] = (float)data.vertex_list[data.face_list[i]->vertex_index[0]]->e[0];
    vert[0][1] = (float)data.vertex_list[data.face_list[i]->vertex_index[0]]->e[1];
    vert[0][2] = (float)data.vertex_list[data.face_list[i]->vertex_index[0]]->e[2];

    // second vert
    normal[1][0] = (float)data.vertex_normal_list[data.face_list[i]->normal_index[1]]->e[0];
    normal[1][1] = (float)data.vertex_normal_list[data.face_list[i]->normal_index[1]]->e[1];
    normal[1][2] = (float)data.vertex_normal_list[data.face_list[i]->normal_index[1]]->e[2];
    tex[1][0] = (float)data.vertex_texture_list[data.face_list[i]->texture_index[1]]->e[0];
    tex[1][1] = (float)data.vertex_texture_list[data.face_list[i]->texture_index[1]]->e[1];
    tex[1][2] = (float)data.vertex_texture_list[data.face_list[i]->texture_index[1]]->e[2];
    vert[1][0] = (float)data.vertex_list[data.face_list[i]->vertex_index[1]]->e[0];
    vert[1][1] = (float)data.vertex_list[data.face_list[i]->vertex_index[1]]->e[1];
    vert[1][2] = (float)data.vertex_list[data.face_list[i]->vertex_index[1]]->e[2];

    // third vert
    normal[2][0] = (float)data.vertex_normal_list[data.face_list[i]->normal_index[2]]->e[0];
    normal[2][1] = (float)data.vertex_normal_list[data.face_list[i]->normal_index[2]]->e[1];
    normal[2][2] = (float)data.vertex_normal_list[data.face_list[i]->normal_index[2]]->e[2];
    tex[2][0] = (float)data.vertex_texture_list[data.face_list[i]->texture_index[2]]->e[0];
    tex[2][1] = (float)data.vertex_texture_list[data.face_list[i]->texture_index[2]]->e[1];
    tex[2][2] = (float)data.vertex_texture_list[data.face_list[i]->texture_index[2]]->e[2];
    vert[2][0] = (float)data.vertex_list[data.face_list[i]->vertex_index[2]]->e[0];
    vert[2][1] = (float)data.vertex_list[data.face_list[i]->vertex_index[2]]->e[1];
    vert[2][2] = (float)data.vertex_list[data.face_list[i]->vertex_index[2]]->e[2];

    for (j = 0; j < 3; j++)
    {
        glNormal3f (normal[j][0], normal[j][1], normal[j][2]);
        glTexCoord3f (tex[j][0], tex[j][1], tex[j][2]);
        glVertex3f (vert[j][0], vert[j][1], vert[j][2]);
    }
}

glEnd ();
glEndList ();

編集:私は次のようなことを試しました:

glTranslatef (0, 0, 5);
glCallList (mesh);
glTranslatef (0, 0, 0);

しかし、どちらも機能しません:(

編集:

@datenwolf これを描画するために使用するコードは次のとおりです。

Draw_Begin ();
Mdl_Draw (list, 0.0f, 0.0f, 0.0f);
Draw_End ();
4

1 に答える 1

3

これ

gluPerspective (45.0, (float)1024/(float)768, -9999, 9999);

間違っている。透視投影では、近平面距離と遠平面距離の両方が同じ符号である必要があります。つまり、両方が正または両方が負である必要があります。また、ニアプレーンの絶対値はファープレーンの絶対値よりも小さくする必要があります。また、平面に近い距離はゼロ以外でなければなりません。数学表記では:

sgn(near)= sgn(far)^ 0 <| near | <|遠い|

通常、近距離と遠距離の両方がポジティブに選択されます。また、経験則として、近くのクリッピング平面は可能な限り遠ざけるように選択する必要があります。遠方平面は無限遠に配置できますが(同種の行列のプロパティの一部を利用)、通常、深度バッファーの解像度を最大にするために可能な限り近くに配置されます。

于 2012-08-17T13:13:27.330 に答える