2016-05-20 4 views
1

Сначала я конвертирую файл шахматных фигур в chesspawn.gl и chesspawn.h с View3DS второй. Я пишу программу opengl для просмотра этой модели. Это кодopengl read .3ds file?

#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: С тех пор я слишком активно использовал списки отображения, и я никогда не смешивал их с VA. Но после прочтения этой части спецификации снова (первый раз, начиная примерно с 12 лет или около того): Да, вы совершенно правы (как обычно). – datenwolf

ответ

0

Я не знаю, что такое GL3DS, но что-то не так в init.

Похоже, что GL3DS_INDEX_chesspawn и GL3DS_MATERIAL_chesspawn не инициализированы, в файле отображается только GL3DS_VERTEX_chesspawn. Поэтому он не может работать до тех пор, пока эти данные не будут инициализированы, GL3DS_INDEX_chesspawn превыше всего!

Если вы хотите прочитать 3D (или 2D) модели, попробуйте преобразовать его в OBJ-файл (очень легко прочитать) и прочитать его самостоятельно с помощью функции.

Если вы не хотите делать функцию чтения моделей, но имеете что-то мощное, вы можете быть заинтересованы в Assimp. Это библиотека, которая может читать много форматов модели, 3DS, OBJ и даже BLEND.

+0

Я решаю этот вопрос. Просто установите большее число для glTranslate func.3KU – markliang

0

Я решаю этот вопрос. Просто установите большее число для glTranslatef.

glTranslatef(0.0, 0.0, -200.0);