这个代码不算成熟,但是可以读取一般的3DS文件了,还有重现时物体材质没有精心设计,这里请阅读的朋友自行设计吧。这个例子的目的是给刚学的朋友提供一个例子,代码如下: 3dsId.h #ifndef _3DS_ID_H_ #define _3DS_ID_H_ const GLsizei PRIMARY = 0x4D4D; const GLsizei MAINOBJECT = 0x3D3D; // 网格对象的版本号 const GLsizei EDITKEYFRAME = 0xB000; // 所有关键帧信息的头部 const GLsizei MATERIAL = 0xAFFF; // 保存纹理信息 const GLsizei OBJECT = 0x4000; // 保存对象的面、顶点等信息 const GLsizei MATNAME = 0xA000; // 保存材质名称 const GLsizei OBJECT_MESH = 0x4100; // 新的网格对象 const GLsizei OBJECT_VERTICES = 0x4110; // 对象顶点 const GLsizei OBJECT_FACES = 0x4120; // 对象的面 const GLsizei OBJECT_MATERIAL = 0x4130; // 对象的材质 const GLsizei MAT_AMBIENT = 0xa010; const GLsizei MAT_DIFFUSE = 0xa020; const GLsizei MAT_SPECULAR = 0xa030; const GLsizei MAT_SHININESS = 0xa040; const GLsizei MAT_TRANSPARENCY = 0xa050; const GLsizei INT_PERCENTAGE = 0x0030; const GLsizei FLOAT_PERCENTAGE = 0x0031; const GLsizei COLOR_F = 0x0010; const GLsizei COLOR_24 = 0x0011; #endif MyModel.h #ifndef __MY_MODEL_H__ #define __MY_MODEL_H__ #include <gl\glut.h> #include <vector> #include <string> struct Vertex { GLfloat x; GLfloat y; GLfloat z; }; struct Face { GLushort Index[3]; GLushort MaterialPos; Vertex Normal; }; struct Chunk { GLushort ID; GLuint Len; }; struct Material { std::string name; GLfloat ambientColor[3]; GLfloat diffuseColor[3]; GLfloat specularColor[3]; GLfloat emissiveColor[3]; GLfloat shininess; GLfloat transparency; }; struct Object { std::string Name; std::vector< Vertex > Vertexs; std::vector< Face > Faces; }; struct Model { std::vector< Object > MyObject; std::vector< Material > MyMaterial; }; #endif MyLoader.h #ifndef __3DS_LOADER_H__ #define __3DS_LOADER_H__ #include <fstream> #include "MyModel.h" class MyLoader { public: MyLoader(); void OpenFile( const std::string& ); void LoadFile(); void CloseFile(); const Model& GetModel(); private: void LoadModel( const Chunk& ); void LoadMaterial( const Chunk& ); void LoadColor( float* ); void LoadPercent( float* ); void LoadObject( const Chunk& ); void LoadVertex( Object* const& ); void LoadFaces( Object* ); void LoadObjectMaterial( Object* ); void LoadMesh( const Chunk& MyChunk ); private: Vertex Vectors( const Vertex&, const Vertex& ); Vertex Cross( const Vertex&, const Vertex& ); void Normalize( Vertex* Point ); void ComputeNormals(); private: void ReadChunk( Chunk* MyChunk ); void ReadGLfloat( GLfloat* ); void ReadGLushort( GLushort* ); void ReadGLuint( GLuint* ); void ReadGLubyte( GLubyte* ); void SkipNByte( const size_t& ); std::string ReadString(); private: size_t NowPos; size_t FileLength; size_t |