obj.h------obj模型格式解析

    技术2026-04-06  1

     

     

    #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

    最新回复(0)