2016-05-20 31 views
1

首先我將chesspawn.3ds文件轉換爲chesspawn.gl和chesspawn.h與View3DS 秒我編寫了一個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:我積極使用展示列表已經太久了,我從來沒有將它們與VAs混合。但是在再次閱讀了這部分規範(大約12年後的第一次)之後:是的,你是完全正確的(像往常一樣)。 – datenwolf

回答

0

我不知道什麼是GL3DS,但init中有什麼問題。

它看起來像GL3DS_INDEX_chesspawn和GL3DS_MATERIAL_chesspawn沒有初始化,只有GL3DS_VERTEX_chesspawn在文件中。所以在這些數據初始化之前它不能工作,首先GL3DS_INDEX_chesspawn!

如果您想要讀取3D(或2D)模型,請嘗試將其轉換爲OBJ文件(非常易於閱讀),並通過函數自行讀取它。

如果你不想做一個閱讀模型功能,但有一些功能強大,你可能會感興趣Assimp。這是一個可以讀取很多模型格式的庫,它們的3DS,OBJ甚至混合。

+0

我已經解決了這個問題。只需爲glTranslate func.3KU設置一個更大的數字 – markliang

0

我解決了這個問題。只需爲glTranslatef設置一個更大的數字。

glTranslatef(0.0, 0.0, -200.0);