lib3ds 2.0 example 2

lib3ds 2.0 example 2

cheungmine

2009-2-14

 

  在上一个例子中,展示了基本的lib3ds2.0的使用方法。在本例中,对上面的代码稍作修改。这样,无论3ds文件是否有相机或灯光,都可以显示了。

     思路就是,如果3ds文件没有相机,我们就增加4个相机。如果没有灯光,就增加3个OmniLight。

上面的代码参考了文章:

 

  《利用lib3ds和OpenGL实现3ds文件的读取和显示---白改朝》---电脑编程技巧与维护2008.7

 

    例子player.c代码使用了glut32。(下篇文章,我会转到Windows上实现这个代码。不使用glut库。)

    本例仍然没有使用贴图。希望我的下个例子能把贴图做出来。

    好了,代码全部贴在下面了。需要的库仍然可以在网上找到,就不废话了。

[cpp:nogutter]  view plain copy print ?
  1. ///  
  2. // player2.c  
  3. //  
  4. // 2009-2-14  
  5. //  
  6. // 作者:cheungmine  
  7. //  
  8. // 参考:  
  9. //  
  10. //        http://www.lib3ds.org/lib3ds-1.2.0/examples/player.c  
  11. //  
  12. // 目录结构:  
  13. //  
  14. // lib/lib3ds_2.0/src/  
  15. //          debug/lib3ds20d.lib  lib3ds20d.dll  
  16. //          release/lib3ds20.lib  lib3ds20.dll  
  17. //  
  18. // lib/lib3ds_2.0/  
  19. //          glut_test/player.c  
  20. //  
  21. // lib/win_opengl32/  
  22. //          inc/gl.h  glu.h   glut.h  
  23. //          lib/opengl32.lib  glu32.lib   glut32.lib  
  24. //          bin/opengl32.dll  glu32.dll   glut32.dll  
  25. //  
  26. ///  
  27. // 内存泄漏检测  
  28. // 在需要检测的地方放置语句:  
  29. //        _CrtDumpMemoryLeaks();  
  30. // 以下3句的次序不能改变  
  31. #define _CRTDBG_MAP_ALLOC     
  32. #include<stdlib.h>  
  33. #include<crtdbg.h>  
  34.   
  35. #include<stdio.h>  
  36. #include<string.h>  
  37. #include<math.h>  
  38. #include<assert.h>  
  39.   
  40. #include <windows.h>  
  41.   
  42. // 使用 USE_SGI_OPENGL 可能在某些机器上运行 wglMakeCurrent 系列函数返回失败的结果  
  43. #define GLUT_NO_LIB_PRAGMA  
  44.   
  45. // #define USE_SGI_OPENGL  
  46. #ifdef USE_SGI_OPENGL  
  47.     #include "../../sgi-opengl2-sdk/include/gl/gl.h"  
  48.     #include "../../sgi-opengl2-sdk/include/gl/glu.h"  
  49.     #include "../../sgi-opengl2-sdk/include/gl/glut.h"  
  50.   
  51.     #pragma comment(lib, "../../sgi-opengl2-sdk/lib/opengl.lib")  
  52.     #pragma comment(lib, "../../sgi-opengl2-sdk/lib/glu.lib")  
  53.     #pragma comment(lib, "../../sgi-opengl2-sdk/lib/glut.lib")  
  54. #else  
  55.     #include "../../win-opengl32/inc/GL.h"  
  56.     #include "../../win-opengl32/inc/GLU.h"  
  57.   
  58.     #pragma comment(lib, "../../win-opengl32/lib/OPENGL32.lib")  
  59.     #pragma comment(lib, "../../win-opengl32/lib/GLU32.lib")  
  60.   
  61.     #include "../../win-opengl32/inc/GLUT.h"  
  62.     #pragma comment(lib, "../../win-opengl32/lib/glut32.lib")  
  63. #endif  
  64.   
  65. //  
  66. // lib3ds  
  67. //  
  68. #include "../src/lib3ds.h"  
  69.   
  70. #ifdef _DEBUG  
  71. #  pragma comment(lib, "../src/debug/lib3ds20d.lib")  
  72. #else  
  73. #  pragma comment(lib, "../src/release/lib3ds20.lib")  
  74. #endif  
  75.   
  76. static const char* filename="E://GU2005//LIB//lib3ds_2.0//data//Bf109G6//Bf109G6.3ds";  
  77. //E://3DS//Spacecraft//Spacecraft.3ds";  
  78.   
  79. //"E://GU2005//LIB//lib3ds_2.0//data//abom.3ds";  
  80. //"E:/3DS/House/house.3ds";  
  81. static Lib3dsFile *model=0;  
  82.   
  83. static const char* camera=0;  
  84. static float current_frame=0.0;  
  85.   
  86. static int gl_width;  
  87. static int gl_height;  
  88.   
  89. static int camera_menu_id=0;  
  90. static int halt=0;  
  91.   
  92. #ifndef MAX  
  93. #  define MAX(x,y)  ((x)>(y)?(x):(y))  
  94. #endif  
  95.   
  96. static void camera_menu(int value)   
  97. {  
  98.     Lib3dsCamera *c=0;  
  99.     int i;  
  100.   
  101.     for( i=0; i<value; i++ ){  
  102.         if (i==model->ncameras)  
  103.             return;  
  104.         c = model->cameras[i];  
  105.     }  
  106.     if (c)  
  107.         camera=c->name;  
  108. }  
  109.   
  110. static void render_node(Lib3dsNode *node)  
  111. {  
  112.     Lib3dsNode      *p;  
  113.     Lib3dsMesh      *mesh;  
  114.     Lib3dsFace      *face;  
  115.     Lib3dsMaterial  *mat;  
  116.     Lib3dsMeshInstanceNode *meshData;  
  117.   
  118.     Lib3dsVector    *norm_verts;  
  119.     Lib3dsVector    *norm_faces;  
  120.       
  121.     int         i;  
  122.     unsigned    fi;  
  123.     float       M[4][4];  
  124.   
  125.     assert(model);  
  126.   
  127.     // 递归  
  128.     for (p=node->childs; p!=0; p=p->next){  
  129.         render_node(p);  
  130.     }  
  131.   
  132.     if (node->type==LIB3DS_NODE_MESH_INSTANCE)  
  133.     {  
  134.         if (strcmp(node->name,"$$$DUMMY")==0) {  
  135.             return;  
  136.         }  
  137.   
  138.         if (!node->user_id)   
  139.         {  
  140.             mesh = lib3ds_file_mesh_for_node(model, node);  
  141.             assert(mesh);  
  142.             if (!mesh) {  
  143.                 return;  
  144.             }  
  145.   
  146.             node->user_id = glGenLists(1);  
  147.             glNewList(node->user_id, GL_COMPILE);  
  148.               
  149.             norm_verts = (Lib3dsVector*) malloc(3*sizeof(Lib3dsVector)*mesh->nfaces);  
  150.             norm_faces = (Lib3dsVector*) malloc(sizeof(Lib3dsVector)*mesh->nfaces);                
  151.   
  152.             lib3ds_matrix_copy(M, mesh->matrix);  
  153.             lib3ds_matrix_inv(M);  
  154.             glMultMatrixf(&M[0][0]);  
  155.               
  156.             lib3ds_mesh_calculate_face_normals(mesh, (float (*)[3])norm_faces);  
  157.             lib3ds_mesh_calculate_vertex_normals(mesh, (float (*)[3])norm_verts);  
  158.               
  159.             for (fi=0; fi<mesh->nfaces; ++fi) {  
  160.                 face = &(mesh->faces[fi]);  
  161.                 mat = 0;  
  162.                   
  163.                 if (face->material>=0 && face->material<model->nmaterials)  
  164.                     mat=model->materials[face->material];  
  165.                   
  166.                 if (mat)   
  167.                 {  
  168.                     // 使用材质  
  169.                     float s = pow(2, 10.0*mat->shininess);  
  170.                     if (s>128.0) s = 128.0f;  
  171.   
  172.                     glMaterialfv(GL_FRONT, GL_AMBIENT, mat->ambient);  
  173.                     glMaterialfv(GL_FRONT, GL_DIFFUSE, mat->diffuse);  
  174.                     glMaterialfv(GL_FRONT, GL_SPECULAR, mat->specular);  
  175.                     glMaterialf(GL_FRONT, GL_SHININESS, s);  
  176.                 }  
  177.                 else {  
  178.                     // 使用贴图  
  179.                     float a[]={0.2, 0.2, 0.2, 1.0};  
  180.                     float d[]={0.8, 0.8, 0.8, 1.0};  
  181.                     float s[]={0.0, 0.0, 0.0, 1.0};  
  182.                     glMaterialfv(GL_FRONT, GL_AMBIENT, a);  
  183.                     glMaterialfv(GL_FRONT, GL_DIFFUSE, d);  
  184.                     glMaterialfv(GL_FRONT, GL_SPECULAR, s);  
  185.                 }  
  186.                   
  187.                 // Draw tri-face  
  188.                 glBegin(GL_TRIANGLES);  
  189.                   
  190.                 glNormal3fv(norm_faces[fi].v);  // face normal  
  191.   
  192.                 for (i=0; i<3; ++i) {  
  193.                     glNormal3fv(norm_verts[3*fi+i].v);  // vertex normal  
  194.                     glVertex3fv(mesh->vertices[face->index[i]]);  
  195.                 }  
  196.   
  197.                 glEnd();  
  198.             }  
  199.   
  200.             free(norm_faces);  
  201.             free(norm_verts);  
  202.               
  203.             glEndList();  
  204.         }  
  205.   
  206.         if (node->user_id) {  
  207.             glPushMatrix();  
  208.             meshData = (Lib3dsMeshInstanceNode*) node;  
  209.               
  210.             glMultMatrixf(&node->matrix[0][0]);  
  211.             glTranslatef(-meshData->pivot[0], -meshData->pivot[1], -meshData->pivot[2]);  
  212.             glCallList(node->user_id);  
  213.   
  214.             // glutSolidSphere(50.0, 20,20);  
  215.             glPopMatrix();  
  216.         }  
  217.     }  
  218. }  
  219.   
  220. static void display(void)  
  221. {  
  222.     int  i, li;  
  223.   
  224.     Lib3dsNode *nodC, *nodT, *nod;  
  225.     Lib3dsCameraNode *camNode;  
  226.     Lib3dsTargetNode *tgtNode;  
  227.     float             M[4][4];  
  228.       
  229.     GLfloat a[] = {0.0f, 0.0f, 0.0f, 1.0f};  
  230.     GLfloat c[] = {1.0f, 1.0f, 1.0f, 1.0f};  
  231.     GLfloat p[] = {0.0f, 0.0f, 0.0f, 1.0f};  
  232.       
  233.     Lib3dsLight *l;  
  234.   
  235.   
  236.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  
  237.   
  238.     if (!model) {  
  239.         exit(1);  
  240.     }  
  241.   
  242.     nodC=lib3ds_file_node_by_name(model, camera, LIB3DS_NODE_CAMERA);  
  243.     nodT=lib3ds_file_node_by_name(model, camera, LIB3DS_NODE_CAMERA_TARGET);  
  244.       
  245.     if (!nodC || !nodT) {  
  246.         assert(0 && "Camera or Target not found!");  
  247.         exit(1);  
  248.     }  
  249.   
  250.     camNode = (Lib3dsCameraNode*) nodC;  
  251.     tgtNode = (Lib3dsTargetNode*) nodT;  
  252.   
  253.     glMatrixMode(GL_PROJECTION);  
  254.     glLoadIdentity();  
  255.     gluPerspective( camNode->fov, gl_width/gl_height, 0.1f, 6000.0);  
  256.     glMatrixMode(GL_MODELVIEW);  
  257.     glLoadIdentity();  
  258.     glRotatef(-90, 1.0, 0,0);  
  259.   
  260.     li=GL_LIGHT0;  
  261.           
  262.     for (i=0; i<model->nlights; i++)  
  263.     {  
  264.         l = model->lights[i];  
  265.         glEnable(li);  
  266.   
  267.         glLightfv(li, GL_AMBIENT, a);  
  268.         glLightfv(li, GL_DIFFUSE, c);  
  269.         glLightfv(li, GL_SPECULAR, c);  // p?  
  270.   
  271.         p[0] = l->position[0];  
  272.         p[1] = l->position[1];  
  273.         p[2] = l->position[2];  
  274.         glLightfv(li, GL_POSITION, p);  
  275.   
  276.         if (!l->spot_light) {  
  277.             continue;  
  278.         }  
  279.   
  280.         p[0] = l->target[0] - l->position[0];  
  281.         p[1] = l->target[1] - l->position[1];  
  282.         p[2] = l->target[2] - l->position[2];        
  283.           
  284.         glLightfv(li, GL_SPOT_DIRECTION, p);  
  285.           
  286.         ++li;  
  287.     }  
  288.   
  289.     lib3ds_matrix_camera(M, camNode->pos, tgtNode->pos, camNode->roll);  
  290.           
  291.     glMultMatrixf(&M[0][0]);  
  292.   
  293.     for (nod=model->nodes; nod!=0; nod=nod->next) {  
  294.         render_node(nod);  
  295.     }  
  296.       
  297.     if (!halt) {  
  298.         current_frame+=1.0;  
  299.           
  300.         if (current_frame>model->frames) {  
  301.             current_frame=0;  
  302.         }  
  303.   
  304.         lib3ds_file_eval(model, current_frame);  
  305.   
  306.         glutSwapBuffers();  
  307.         glutPostRedisplay();  
  308.     }  
  309. }  
  310.   
  311. // 增加默认的相机和目标  
  312. static add_default_cameras (Lib3dsFile *model, Lib3dsBBox *bbox, float sizes[], float center[])  
  313. {  
  314.     int  index=0;  
  315.     Lib3dsCamera     *cam;  
  316.     Lib3dsCameraNode *nodCam;  
  317.   
  318.     Lib3dsTargetNode *nodTgt;  
  319.       
  320.     // Camera_X  
  321.     cam = lib3ds_camera_new ("Camera_X");  
  322.     assert(cam);  
  323.     memcpy(cam->target, center, sizeof(Lib3dsVector));  
  324.     memcpy(cam->position, center, sizeof(Lib3dsVector));  
  325.     cam->position[0] = bbox->bmax[0] + 1.5*MAX(sizes[1],sizes[2]);  
  326.     cam->near_range = (cam->position[0] - bbox->bmax[0])/2;  
  327.     cam->far_range = (cam->position[0] - bbox->bmin[0])*2;  
  328.     lib3ds_file_insert_camera(model, cam, index++);  
  329.     nodCam = lib3ds_node_new_camera(cam);  
  330.     assert(nodCam);  
  331.     lib3ds_file_append_node(model, (Lib3dsNode*)nodCam, 0);  
  332.   
  333.     nodTgt = lib3ds_node_new_camera_target(cam);  
  334.     assert(nodTgt);  
  335.     lib3ds_file_append_node(model, (Lib3dsNode*)nodTgt, 0);  
  336.   
  337.     // Camera_Y  
  338.     cam = lib3ds_camera_new ("Camera_Y");  
  339.     assert(cam);  
  340.     memcpy(cam->target, center, sizeof(Lib3dsVector));  
  341.     memcpy(cam->position, center, sizeof(Lib3dsVector));  
  342.     cam->position[1] = bbox->bmin[1] - 1.5*MAX(sizes[0],sizes[2]);  
  343.     cam->near_range = (bbox->bmin[1]-cam->position[1])/2;  
  344.     cam->far_range = (bbox->bmax[1]-cam->position[1])*2;  
  345.     lib3ds_file_insert_camera(model, cam, index++);  
  346.     nodCam = lib3ds_node_new_camera(cam);  
  347.     assert(nodCam);  
  348.     lib3ds_file_append_node(model, (Lib3dsNode*)nodCam, 0);  
  349.       
  350.     nodTgt = lib3ds_node_new_camera_target(cam);  
  351.     assert(nodTgt);  
  352.     lib3ds_file_append_node(model, (Lib3dsNode*)nodTgt, 0);  
  353.   
  354.     // Camera_Z  
  355.     cam = lib3ds_camera_new ("Camera_Z");  
  356.     assert(cam);  
  357.     memcpy(cam->target, center, sizeof(Lib3dsVector));  
  358.     memcpy(cam->position, center, sizeof(Lib3dsVector));  
  359.     cam->position[2] = bbox->bmax[2] + 1.5*MAX(sizes[0],sizes[1]);  
  360.     cam->near_range = (cam->position[2]-bbox->bmax[2])/2;  
  361.     cam->far_range = (cam->position[2]-bbox->bmin[2])*2;  
  362.     lib3ds_file_insert_camera(model, cam, index++);  
  363.     nodCam = lib3ds_node_new_camera(cam);  
  364.     assert(nodCam);  
  365.     lib3ds_file_append_node(model, (Lib3dsNode*)nodCam, 0);  
  366.   
  367.     nodTgt = lib3ds_node_new_camera_target(cam);  
  368.     assert(nodTgt);  
  369.     lib3ds_file_append_node(model, (Lib3dsNode*)nodTgt, 0);  
  370.   
  371.     // Camera_ISO  
  372.     cam = lib3ds_camera_new ("Camera_ISO");  
  373.     assert(cam);  
  374.     memcpy(cam->target, center, sizeof(Lib3dsVector));  
  375.     cam->position[0] = bbox->bmax[0] + 0.75f*sizes[3];  
  376.     cam->position[1] = bbox->bmin[1] - 0.75f*sizes[3];  
  377.     cam->position[2] = bbox->bmax[2] + 0.75f*sizes[3];  
  378.     cam->near_range = (cam->position[0]-bbox->bmax[0])/2;  
  379.     cam->far_range = (cam->position[0]-bbox->bmin[0])*3;  
  380.     lib3ds_file_insert_camera(model, cam, index++);  
  381.     nodCam = lib3ds_node_new_camera(cam);  
  382.     assert(nodCam);  
  383.     lib3ds_file_append_node(model, (Lib3dsNode*)nodCam, 0);  
  384.       
  385.     nodTgt = lib3ds_node_new_camera_target(cam);  
  386.     assert(nodTgt);  
  387.     lib3ds_file_append_node(model, (Lib3dsNode*)nodTgt, 0);  
  388. }  
  389.   
  390. // 增加默认的灯光  
  391. static void add_default_lights (Lib3dsFile *model, Lib3dsBBox *bbox, float sizes[], float center[])  
  392. {  
  393.     int  index=0;  
  394.     Lib3dsOmnilightNode     *omniNode;  
  395.     Lib3dsLight             *light;  
  396.   
  397.     // light0  
  398.     light = lib3ds_light_new("light0");  
  399.     assert(light);  
  400.   
  401.     light->spot_light = 0;  
  402.     light->see_cone = 0;  
  403.     light->color[0]=light->color[1]=light->color[2]=0.6f;  
  404.     light->position[0]=center[0]+sizes[3]*0.75;  
  405.     light->position[1]=center[1]-sizes[3]*1;  
  406.     light->position[2]=center[2]+sizes[3]*1.5;  
  407.     light->outer_range = 100;  
  408.     light->inner_range = 10;  
  409.     light->multiplier=1;  
  410.   
  411.     lib3ds_file_insert_light(model, light, index++);  
  412.     omniNode = lib3ds_node_new_omnilight(light);  
  413.     assert(omniNode);  
  414.     lib3ds_file_append_node(model, (Lib3dsNode*)omniNode, 0);  
  415.   
  416.     // light1  
  417.     light = lib3ds_light_new("light1");  
  418.     assert(light);  
  419.   
  420.     light->spot_light = 0;  
  421.     light->see_cone = 0;  
  422.     light->color[0]=light->color[1]=light->color[2]=0.3f;  
  423.     light->position[0]=center[0]-sizes[3];  
  424.     light->position[1]=center[1]-sizes[3];  
  425.     light->position[2]=center[2]+sizes[3]*0.75;  
  426.     light->outer_range = 100;  
  427.     light->inner_range = 10;  
  428.     light->multiplier=1;  
  429.   
  430.     lib3ds_file_insert_light(model, light, index++);  
  431.     omniNode = lib3ds_node_new_omnilight(light);  
  432.     assert(omniNode);  
  433.     lib3ds_file_append_node(model, (Lib3dsNode*)omniNode, 0);  
  434.   
  435.     // light2  
  436.     light = lib3ds_light_new("light2");  
  437.     assert(light);  
  438.   
  439.     light->spot_light = 0;  
  440.     light->see_cone = 0;  
  441.     light->color[0]=light->color[1]=light->color[2]=0.3f;  
  442.     light->position[0]=center[0];  
  443.     light->position[1]=center[1]+sizes[3];  
  444.     light->position[2]=center[2]+sizes[3];  
  445.     light->outer_range = 100;  
  446.     light->inner_range = 10;  
  447.     light->multiplier=1;  
  448.   
  449.     lib3ds_file_insert_light(model, light, index++);  
  450.     omniNode = lib3ds_node_new_omnilight(light);  
  451.     assert(omniNode);  
  452.     lib3ds_file_append_node(model, (Lib3dsNode*)omniNode, 0);  
  453. }  
  454.   
  455. static void init(void)   
  456. {  
  457.     int     i;  
  458.     float      sizes[4];        // 模型尺寸坐标  
  459.     float      center[3];       // 模型目标中心坐标  
  460.     Lib3dsBBox bbox;            // 模型范围  
  461.       
  462.     glClearColor(0, 0, 0, 1.0); // 背景色  
  463.     glShadeModel(GL_SMOOTH);  
  464.     glEnable(GL_LIGHTING);  
  465.     glEnable(GL_LIGHT0);  
  466.     glDisable(GL_LIGHT1);  
  467.     glDepthFunc(GL_LEQUAL);  
  468.     glEnable(GL_DEPTH_TEST);  
  469.     glEnable(GL_CULL_FACE);  
  470.     glCullFace(GL_BACK);  
  471.     //glDisable(GL_NORMALIZE);  
  472.     //glPolygonOffset(1.0, 2);  
  473.   
  474.     // 打开模型文件,读入模型数据并关闭文件句柄  
  475.     model=lib3ds_file_open(filename);  
  476.     if (!model) {  
  477.         printf("***ERROR*** Loading 3DS file failed.");  
  478.         exit(1);  
  479.     }  
  480.       
  481.     // 读取模型的包围盒  
  482.     lib3ds_file_bounding_box_of_nodes (model, 1, 0, 0, bbox.bmin, bbox.bmax, 0);  
  483.     for (i=0; i<3; i++) {  
  484.         sizes[i] = bbox.bmax[i]-bbox.bmin[i];  
  485.         center[i]= (bbox.bmax[i]+bbox.bmin[i])/2;  
  486.     }  
  487.     sizes[3] = MAX(sizes[0],sizes[1]); sizes[3] = MAX(sizes[3],sizes[2]);  
  488.   
  489.     if (!model->cameras) {  
  490.         // 如果3ds Max制作的场景中没有灯光、相机,就人为地在模型空间的四个角各加入一个  
  491.         add_default_cameras (model, &bbox, sizes, center);  
  492.         add_default_lights (model, &bbox, sizes, center);  
  493.     }  
  494.       
  495.     if (!camera) {  
  496.         camera = model->cameras[0]->name;  
  497.     }  
  498.   
  499.     camera_menu_id = glutCreateMenu(camera_menu);  
  500.   
  501.     for (i=0; i<model->ncameras; i++){  
  502.         glutAddMenuEntry(model->cameras[i]->name, i);  
  503.     }  
  504.   
  505.     glutAttachMenu(0);  
  506.   
  507.     lib3ds_file_eval(model, 0);  
  508. }  
  509.   
  510. static void reshape (int nWidth, int nHeight)  
  511. {  
  512.     gl_width = nWidth;  
  513.     gl_height = (nHeight==0?1:nHeight);  
  514.     glViewport(0, 0, gl_width, gl_height);  
  515. }  
  516.   
  517. static void keyboard(unsigned char key, int x, int y)  
  518. {  
  519.     switch (key) {  
  520.     case 27:  
  521.         exit(0);  
  522.         break;  
  523.     case 'h':  
  524.         halt=!halt;  
  525.         glutPostRedisplay();  
  526.         break;  
  527.     }  
  528. }  
  529.   
  530. int main(int argc, char** argv)  
  531. {  
  532.     glutInit(&argc, argv);  
  533.   
  534.     glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);  
  535.     glutInitWindowSize(640, 480);   
  536.     glutInitWindowPosition(100, 100);  
  537.     glutCreateWindow(argv[0]);  
  538.   
  539.     init();  
  540.   
  541.     glutDisplayFunc(display);   
  542.     glutReshapeFunc(reshape);  
  543.     glutKeyboardFunc(keyboard);  
  544.     glutMainLoop();  
  545.   
  546.     /* Memory leaks detecting */  
  547.     _CrtDumpMemoryLeaks();  
  548.   
  549.     return(0);  
  550. }  

 

我选了几个3ds文件测试,结果如下:

 

 


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值