2016-05-20 2 views
1

最初にchesspawn.3dsファイルをchesspawn.glに変換し、chesspawn.hをView3DS 第2回このモデルを表示するためにopenglプログラムを作成します。 これはコードopenglは.3dsファイルを読み込みますか?

#include "stdafx.h" 
#include <gl/glut.h> 
#include <cstdlib> 
#include "chesspawn.h" 
#include <gl/GL.h> 

GLuint model = -1; 
void display() 
{ 
    glCallList(model); 
    glTranslatef(0.0, 0.0, -10.0); 
} 

int main(int argc, char *argv[]) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA | GLUT_DEPTH); 
    glutInitWindowSize(1280, 720); 
    glutInitWindowPosition(150, 150); 

    model = GL3DS_initialize_chesspawn(); 

    glutCreateWindow("TeaPot"); 
    glutDisplayFunc(display); 
    glutMainLoop(); 
    return EXIT_SUCCESS; 
} 

キー機能GL3DS_initialize_chesspawn今

int GL3DS_initialize_chesspawn() { 
    int ReturnVal; 
    FILE *in; 
    if (!(in = fopen("chesspawn.gl", "rb"))) 
     return(-1); 

    if (fread(GL3DS_VERTEX_chesspawn, 33152, 1, in) != 1) 
    return(-1); 
    fclose(in); 

    ReturnVal = glGenLists(1); 
    glInterleavedArrays(GL_T2F_N3F_V3F, 0, GL3DS_VERTEX_chesspawn); 
    glNewList(ReturnVal, GL_COMPILE); 
    glFrontFace(GL_CCW); 
    glEnable(GL_CULL_FACE); 
    glCullFace(GL_BACK); 
    glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); 
    glMaterialfv(GL_FRONT, GL_AMBIENT, (GLfloat *) &GL3DS_M ATERIAL_chesspawn[0]); 
    glMaterialfv(GL_FRONT, GL_DIFFUSE, (GLfloat *) &GL3DS_MATERIAL_chesspawn[4]); 
    glMaterialfv(GL_FRONT, GL_SPECULAR, (GLfloat *) &GL3DS_MATERIAL_chesspawn[8]); 
    glDrawElements(GL_TRIANGLES, 6204, GL_UNSIGNED_INT, &GL3DS_INDEX_chesspawn[0]); 
    glEndList(); 
    return (ReturnVal); 
} 

で、プログラムが正常に実行することができますが、私はmodel.Justに空の画面を表示することはできません。

+0

@datenwolf: "*配列の内容は実際に表示リストに格納されていないため*"実際には、クライアント側の配列の仕組みによって、 'glDrawElements'が返るまでにデータ*を頂点配列からレンダラーに引っ張らなければなりません。したがって、表示リスト形式では、データ*はその関数が返ったときに表示リストに引き込まれなければなりません。 –

+0

@ NicolBolas:私はディスプレイリストを積極的に使っていたので、長すぎました。しかし、仕様書のその部分をもう一度読んだら(最初の12年ほどかかりました)、はい、あなたは完全に正しいです(いつものように)。 – datenwolf

答えて

0

GL3DSは何か分かりませんが、initに何か問題があります。

GL3DS_INDEX_chesspawnとGL3DS_MATERIAL_chesspawnが初期化されていないように見えますが、GL3DS_VERTEX_chesspawnだけがファイルで読み込まれます。したがって、これらのデータが初期化されるまで、GL3DS_INDEX_chesspawnが動作するまで動作しません!

3D(または2D)モデルを読みたい場合は、OBJファイルに変換してください(読みやすく)して、機能で自分で読んでみてください。

モデルの読み込みを機能させたいが、強力なものを作成したくない場合は、で興味があるかもしれません。これは3DS、OBJ、そしてBLENDのような多くのモデルフォーマットを読むことができるライブラリです。

+0

私はこの質問を解決しました。ちょうどglTranslate func.3KU – markliang

0

Iこの問題を解決してください。glTranslatefの番号を大きく設定してください。

glTranslatef(0.0, 0.0, -200.0); 
関連する問題