#ifndef _OBJ_H #define _OBJ_H #include <windows.h> #include <stdio.h> #include <stdlib.h> #include <math.h> #include <fstream> #include <vector>
using namespace std;
#define MAX_TEXTURES 100 // 最大的纹理数目
// 定义3D点的类,用于保存模型中的顶点 class CVector3 { public: float x, y, z; };
// 定义2D点类,用于保存模型的UV纹理坐标 class CVector2 { public: float x, y; };
// 面的结构定义 struct tFace { int vertIndex[4]; // 顶点索引 int coordIndex[4]; // 纹理坐标索引 };
// 材质信息结构体 struct tMaterialInfo { char strName[255]; // 材质名称 char strFile[255]; // 如果存在纹理映射,则表示纹理文件名称 BYTE color[3]; // 对象的RGB颜色 int texureId; // 纹理ID float uTile; // u 重复 float vTile; // v 重复 float uOffset; // u 纹理偏移 float vOffset; // v 纹理偏移 } ;
// 对象信息结构体 struct t3DObject { int numOfVerts; // 模型中顶点的数目 int numOfFaces; // 模型中面的数目 int numTexVertex; // 模型中纹理坐标的数目 int materialID; // 纹理ID bool bHasTexture; // 是否具有纹理映射 char strName[255]; // 对象的名称 CVector3 *pVerts; // 对象的顶点 CVector3 *pNormals; // 对象的法向量 CVector2 *pTexVerts; // 纹理UV坐标 tFace *pFaces; // 对象的面信息 };
// 模型信息结构体 struct t3DModel { int numOfObjects; // 模型中对象的数目 int numOfMaterials; // 模型中材质的数目 vector<tMaterialInfo> pMaterials; // 材质链表信息 vector<t3DObject> pObject; // 模型中对象链表信息 }; // 下面是读入obj文件的类 class CLoadObj { public:CLoadObj();~CLoadObj() {};public: // 将obj文件中的信息读入到模型中 bool ImportObj(t3DModel *pModel, char *strFileName); // 由于在obj文件中没有纹理/材质名称,只能手动设置 // materialID是在模型材质列表中的索引号 void SetObjectMaterial(t3DModel *pModel, int whichObject, int materialID); // 添加材质 void AddMaterial(t3DModel *pModel, char *strName, char *strFile, int r = 255, int g = 255, int b = 255);
protected:// 读入对象,在ImportObj()中将调用该函数 void ReadObjFile(t3DModel *pModel);
// 读入顶点信息,在ReadObjFile()中调用该函数 void ReadVertexInfo();
// 读入面信息,在ReadObjFile()中调用该函数 void ReadFaceInfo();
//获取每一行开头的关键字void GetKeyWord(char* keyword);
// 完成面信息的读入之后调用该函数 void FillInObjectInfo(t3DModel *pModel);
// 计算顶点的法向量 void ComputeNormals(t3DModel *pModel); private: // 需要读入的文件指针 FILE *m_FilePointer; // 顶点链表 vector<CVector3> m_pVertices; // 面链表 vector<tFace> m_pFaces; // UV坐标链表 vector<CVector2> m_pTextureCoords; // 当前对象是否具有纹理坐标 bool m_bObjectHasUV; // 当前读入的对象是否是面 bool m_bJustReadAFace; }; #endif
http://hi.baidu.com/lvsekafen/blog/item/f8799223f03beaa84623e894.html
