3ds объект не виден (новичок)

В рамках моего проекта мне нужно нарисовать несколько 3D-моделей.

у меня нет времени изучать файлы 3ds и то, как их загружать, что кажется мне довольно сложным, поэтому я нашел функции в Интернете, но объект не отображается (или, возможно, отображается, но не виден).

вот соответствующий исходный код:

    void initGL(int *argc, char **argv)
{
    glutInit(argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE);

    glutInitWindowSize(width, height);
    glutCreateWindow("CUDA Particle System");

    GLenum err = glewInit();
    if (GLEW_OK != err)
    {
        printf ("Error: openGL is not supported");
        exit (0);
    }
    glEnable(GL_DEPTH_TEST);

    glEnable (GL_CULL_FACE);
    glCullFace(GL_FRONT);

    glClearColor(    0.7,  0.7 , 0.9 , 0  );
    glutReportErrors();

    glFrustum(-1,1,-1,1,0.3,100);


    Chesspawn.load( &chesspawn ,"chesspawn.3DS");

    /*glClear (GL_COLOR_BUFFER_BIT);
    glColor3f ( 0.7,  0.7 , 0.9 );
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    glOrtho(-1,1,-1,1,-1,1);
    gluLookAt(0,0,0,0,0,-100,0,1,0);
    glViewport (250, 250, width, height);*/
}

void display()
{
    sdkStartTimer(&timer.timer);

    p_system->update(time_Step);

    //set Positions vbo
    renderer->setVertexBuffer(p_system->getPosVbo(),p_system->getNumParticles());

    //render
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

    // view transform
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glGetFloatv(GL_MODELVIEW_MATRIX, modelView);

    gluLookAt (Params_Camera[CAMERA_X], Params_Camera[CAMERA_Y], Params_Camera[CAMERA_Z],       // camera
                     Params_Camera[CAMERA_X] + Params_Camera[DIR_X], Params_Camera[CAMERA_Y] , Params_Camera[CAMERA_Z] + Params_Camera[DIR_Z],      // center
                     0, 1, 0        //  up
                     );
    renderer->display();
    drawFloor();

    glScaled (0.001,0.001,1);
    Chesspawn.render(&chesspawn);

    //glutSolidSphere (0.5,50,50);


    /*glTranslated (0,0,-10);
    glutSolidSphere(0.1,20,20);*/

    sdkStopTimer(&timer.timer);
    glutSwapBuffers();
    glutReportErrors();

    char sFps[256];
    fps = timer.computeFps();
    sprintf(sFps, " %s: %d particles %3.1f fps",proc, numParticles, fps);
    if (fps <24.0)
        printf ("Slow fps : %f \n", fps);
    glutSetWindowTitle(sFps);
}

а это функции загрузки и рендеринга:

static char C_3dsObject::load (obj_type_ptr p_object, char *p_filename)
{
    int i; //Index variable
    int File_Length = 0;

    FILE *l_file; //File pointer

    unsigned short l_chunk_id; //Chunk identifier
    unsigned int l_chunk_lenght; //Chunk lenght

    unsigned char l_char; //Char variable
    unsigned short l_qty; //Number of elements in each chunk

    unsigned short l_face_flags; //Flag that stores some face information

    if ((l_file=fopen (p_filename, "rb"))== NULL) 
        return 0; //Open the file

    fseek (l_file, 0, SEEK_END);        // get file length
    File_Length = ftell (l_file);
    fseek(l_file, 0L, SEEK_SET);


    while (ftell (l_file) < File_Length ) //Loop to scan the whole file 
    {
        //getche(); //Insert this command for debug (to wait for keypress for each chuck reading)

        fread (&l_chunk_id, 2, 1, l_file); //Read the chunk header
        //printf("ChunkID: %x\n",l_chunk_id); 
        fread (&l_chunk_lenght, 4, 1, l_file); //Read the lenght of the chunk
        //printf("ChunkLenght: %x\n",l_chunk_lenght);

        switch (l_chunk_id)
        {
            //----------------- MAIN3DS -----------------
            // Description: Main chunk, contains all the other chunks
            // Chunk ID: 4d4d 
            // Chunk Lenght: 0 + sub chunks
            //-------------------------------------------
            case 0x4d4d: 
            break;    

            //----------------- EDIT3DS -----------------
            // Description: 3D Editor chunk, objects layout info 
            // Chunk ID: 3d3d (hex)
            // Chunk Lenght: 0 + sub chunks
            //-------------------------------------------
            case 0x3d3d:
            break;

            //--------------- EDIT_OBJECT ---------------
            // Description: Object block, info for each object
            // Chunk ID: 4000 (hex)
            // Chunk Lenght: len(object name) + sub chunks
            //-------------------------------------------
            case 0x4000: 
                i=0;
                do
                {
                    fread (&l_char, 1, 1, l_file);
                    p_object->name[i]=l_char;
                    i++;
                }while(l_char != '\0' && i<20);
            break;

            //--------------- OBJ_TRIMESH ---------------
            // Description: Triangular mesh, contains chunks for 3d mesh info
            // Chunk ID: 4100 (hex)
            // Chunk Lenght: 0 + sub chunks
            //-------------------------------------------
            case 0x4100:
            break;

            //--------------- TRI_VERTEXL ---------------
            // Description: Vertices list
            // Chunk ID: 4110 (hex)
            // Chunk Lenght: 1 x unsigned short (number of vertices) 
            //             + 3 x float (vertex coordinates) x (number of vertices)
            //             + sub chunks
            //-------------------------------------------
            case 0x4110: 
                fread (&l_qty, sizeof (unsigned short), 1, l_file);
                p_object->vertices_qty = l_qty;
                //printf("Number of vertices: %d\n",l_qty);
                for (i=0; i<l_qty; i++)
                {

                    fread (&p_object->vertex[i].x, sizeof(float), 1, l_file);
                    //printf("Vertices list x: %f\n",p_object->vertex[i].x);

                    fread (&p_object->vertex[i].y, sizeof(float), 1, l_file);
                    //printf("Vertices list y: %f\n",p_object->vertex[i].y);

                    fread (&p_object->vertex[i].z, sizeof(float), 1, l_file);
                    //printf("Vertices list z: %f\n",p_object->vertex[i].z);

                    //Insert into the database

                }
                break;

            //--------------- TRI_FACEL1 ----------------
            // Description: Polygons (faces) list
            // Chunk ID: 4120 (hex)
            // Chunk Lenght: 1 x unsigned short (number of polygons) 
            //             + 3 x unsigned short (polygon points) x (number of polygons)
            //             + sub chunks
            //-------------------------------------------
            case 0x4120:
                fread (&l_qty, sizeof (unsigned short), 1, l_file);
                p_object->polygons_qty = l_qty;
                //printf("Number of polygons: %d\n",l_qty); 
                for (i=0; i<l_qty; i++)
                {
                    fread (&p_object->polygon[i].a, sizeof (unsigned short), 1, l_file);
                    //printf("Polygon point a: %d\n",p_object->polygon[i].a);
                    fread (&p_object->polygon[i].b, sizeof (unsigned short), 1, l_file);
                    //printf("Polygon point b: %d\n",p_object->polygon[i].b);
                    fread (&p_object->polygon[i].c, sizeof (unsigned short), 1, l_file);
                    //printf("Polygon point c: %d\n",p_object->polygon[i].c);
                    fread (&l_face_flags, sizeof (unsigned short), 1, l_file);
                    //printf("Face flags: %x\n",l_face_flags);
                }
                break;

            //------------- TRI_MAPPINGCOORS ------------
            // Description: Vertices list
            // Chunk ID: 4140 (hex)
            // Chunk Lenght: 1 x unsigned short (number of mapping points) 
            //             + 2 x float (mapping coordinates) x (number of mapping points)
            //             + sub chunks
            //-------------------------------------------
            //----------- Skip unknow chunks ------------
            //We need to skip all the chunks that currently we don't use
            //We use the chunk lenght information to set the file pointer
            //to the same level next chunk
            //-------------------------------------------
            default:
                 fseek(l_file, l_chunk_lenght-6, SEEK_CUR);
        } 
    }

    fclose (l_file); // Closes the file stream

    return (1); // Returns ok
}



void render (obj_type_ptr object)
{
int l_index;
//glClear(GL_COLOR_BUFFER_BIT |  GL_DEPTH_BUFFER_BIT);
//glMatrixMode(GL_MODELVIEW); // Modeling transformation
glLoadIdentity();
//glTranslatef(0.0,0.0,-500.0);
glColor3d(1,1,0);
// Rotations of the object (the model matrix is multiplied by the rotation matrices)
glRotatef(rotation_x,1.0,0.0,0.0); 
glRotatef(rotation_y,0.0,1.0,0.0);
glRotatef(rotation_z,0.0,0.0,1.0);
// TODO: Add your message handler code here

//rotation_x = rotation_x + rotation_x_increment;               /////  
//rotation_y = rotation_y + rotation_y_increment;
//rotation_z = rotation_z + rotation_z_increment;


if (rotation_x > 359) rotation_x = 0;
if (rotation_y > 359) rotation_y = 0;
if (rotation_z > 359) rotation_z = 0;
// glBegin and glEnd delimit the vertices that define a primitive (in our case triangles)
glBegin(GL_TRIANGLES); 
for (l_index=0;l_index < object->polygons_qty;l_index++)
{
//----------------- FIRST VERTEX -----------------
// Coordinates of the first vertex
glVertex3f( object->vertex[ object->polygon[l_index].a ].x,
object->vertex[ object->polygon[l_index].a ].y,
object->vertex[ object->polygon[l_index].a ].z); 
//Vertex definition
//----------------- SECOND VERTEX -----------------
// Coordinates of the second vertex
//float x= object.vertex[ object.polygon[l_index].b ].x;
glVertex3f( object->vertex[ object->polygon[l_index].b ].x,
object->vertex[ object->polygon[l_index].b ].y,
object->vertex[ object->polygon[l_index].b ].z);
//----------------- THIRD VERTEX -----------------
// Coordinates of the Third vertex
glVertex3f( object->vertex[ object->polygon[l_index].c ].x,
object->vertex[ object->polygon[l_index].c ].y,
object->vertex[ object->polygon[l_index].c ].z);
}
glEnd();

glutSwapBuffers();
} 

что я пробовал до сих пор:

  1. отладка и проверка, имеют ли вершины допустимые значения:

для файла 3ds, который был прикреплен к коду, кажется, что да, для других файлов 3ds, которые я нашел, - нет.

  1. пытаюсь масштабировать объект вверх-вниз - безрезультатно

  2. замена всего кода внутри render() на glutSolidSphere(0.5,50,50) - сфера видна

  3. как вы видите в render(), я отключил glClear() и glMatrixMode(), потому что я думаю, что они не нужны, если они включены, они заставляют все остальные объекты исчезать, не видя объекта 3ds.

мои вопросы:

  1. load() выглядит правильно?

  2. Существуют ли другие версии файла 3ds, которые не являются "ногими" для этой загрузки ()?

  3. Есть ли какие-либо настройки для openGL, которые я могу попытаться изменить, чтобы увидеть объект?

  4. Знаете ли вы другой формат 3D-моделей, который проще загрузить, но при этом он хорошо распространяется и его легко найти, как 3ds?


person user2420074    schedule 01.09.2013    source источник
comment
Итак, в основном вы говорите, что я не хочу понимать функцию load(), поэтому может ли кто-нибудь здесь выполнить работу и понять ее, а затем объяснить.   -  person vallentin    schedule 02.09.2013
comment
направьте меня к хорошему пояснительному учебнику, который может помочь. также, если кто-то уже знаком с этой темой и может сказать, что не так, это может помочь. я думаю, что понимаю load(), я не думаю, что это проблема, но я не уверен.   -  person user2420074    schedule 02.09.2013
comment
Что ж, я думаю, вам (и всем) будет лучше использовать файлы Wavefront .obj, поскольку их так легко понять и использовать. Это мой совет!   -  person vallentin    schedule 02.09.2013


Ответы (2)


Знаете ли вы другой формат 3D-моделей, который проще загрузить, но при этом он хорошо распространяется и его легко найти, как 3ds?

Чтобы загрузить объекты из 3d studio max, вы можете попробовать использовать формат волнового фронта obj (в 3ds max есть возможность импортировать в формате obj). Это удобочитаемый формат с тройками вершин, нормалей вершин и текстур вершин, который может быть легко проанализированы и переданы в Glut для рендеринга.

Я написал код для загрузки 3D-моделей, исходный код доступен здесь

Он анализирует файлы obj и сохраняет вершины, координаты текстур и нормали в массивах, которые передаются функции переполнения для рендеринга.

Подробнее о формате obj здесь

person Anubha    schedule 02.09.2013

Если вы новичок в рендеринге 3D-моделей, не пытайтесь использовать в 3d-моделях формат obj. Obj прост и удобочитаем, прост для понимания и написания собственного синтаксического анализатора. Вы можете ознакомиться с простыми учебными пособиями здесь и начните писать собственный парсер.

person Dinesh Subedi    schedule 04.09.2013