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

来源:互联网 发布:js onchange事件失效 编辑:程序博客网 时间:2024/05/10 18:26

 

 


#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

原创粉丝点击