www.pudn.com > DialogOpenGL.rar > 3ds.h


#ifndef _3DS_H 
#define _3DS_H 
 
#include  
#include  
#include  
#include  
using namespace std; 
 
#define  BYTE unsigned char 
#define  WORD unsigned short  
#define  UINT unsigned int 
 
// 定义3ds的一些有使用到的ChunkID 
// 根Chunk,在每个文件的开始位置 
const WORD PRIMARY=0x4D4D; 
	const WORD PRIM_EDIT = 0x3D3D;					// ChunkID:3ds模型 
		const WORD EDIT_MAT = 0xAFFF;				// ChunkID:材质 
			const WORD MAT_NAME = 0xA000;			// ChunkID:材质名称 
			const WORD MAT_AMB  = 0xA010;			// ChunkID:材质环境光属性(没使用到) 
			const WORD MAT_DIF  = 0xA020;			// ChunkID:材质漫反射属性 
			const WORD MAT_SPE  = 0xA030;			// ChunkID:材质镜面反射属性(没使用到) 
			const WORD MAT_MAP =  0xA200;			// ChunkID:材质的纹理 
				const WORD MAP_NAME = 0xA300;		// ChunkID:纹理的名称 
 
		const WORD EDIT_OBJECT = 0x4000;			// ChunkID:3ds对象的面、点等信息 
			const WORD OBJECT_INFO = 0x4100;		// ChunkID:对象的主要信息 
				const WORD OBJECT_VERTEX = 0x4110;	// ChunkID:物体的顶点信息 
				const WORD OBJECT_FACET = 0x4120;	// ChunkID:物体的面信息 
					const WORD FACET_MAT = 0x4130;	// ChunkID:物体具有的材质 
					const WORD FACET_SMOOTH =0x4150;// ChunkID:面光滑信息(没使用到) 
				const WORD OBJECT_UV = 0x4140;		// ChunkID:纹理坐标信息 
				const WORD OBJECT_LOCAL = 0x4160; 
	const WORD PRIM_KEY=0xB000;						// ChunkID:所有的关键帧信息(没使用到) 
 
const WORD COLOR_BYTE=0x0011;						// ChunkID:颜色 
 
// 保存字符串 
typedef struct 
{ 
	char string[128]; 
} STRING; 
 
// 2维向量 
struct Vector2 
{ 
	float x, y; 
}; 
 
// 3维向量 
struct Vector3 
{ 
public: 
	// 向量初始化 
	Vector3() {} 
	Vector3(float X, float Y, float Z)	{ x = X; y = Y; z = Z; } 
	// 向量相加 
	Vector3 operator+(Vector3 vVector)	{ return Vector3(vVector.x + x, vVector.y + y, vVector.z + z); } 
	// 向量相加 
	Vector3 operator-(Vector3 vVector)	{ return Vector3(x - vVector.x, y - vVector.y, z - vVector.z); } 
	// 向量点乘 
	Vector3 operator*(float num)		{ return Vector3(x * num, y * num, z * num); } 
	Vector3 operator/(float num)		{ return Vector3(x / num, y / num, z / num); } 
 
	float x, y, z; 
}; 
 
// 保存Chunk信息 
typedef struct  
{ 
	WORD ID;										// Chunk的ID 
	UINT length;									// Chunk的长度 
} tChunk; 
 
// 保存面信息:顶点与纹理坐标的索引值。 
typedef struct 
{ 
	int vertIndex[3];								// 3个顶点的索引值 
	int	matID;										// 该面对应的材质ID 
} tFace; 
 
// 保存材质信息。 
typedef struct 
{ 
	STRING  matName;								// 材质的名称 
	STRING  mapName;								// 纹理的名称(bmp,jpg等的文件名) 
	BYTE	color[3];								// 材质颜色 
	UINT	texureId;								// 纹理的ID(指向载入的纹理) 
	bool	isTexMat;								// 该材质是不是包含有纹理 
} tMaterial; 
 
// 保存单个3ds对象 
typedef struct 
{ 
	int  numOfVerts;								// 该对象顶点的个数 
	int  numOfFaces;								// 该对象面的个数 
	int  numTexVertex;								// 该对象纹理坐标的个数 
	STRING	 objName;								// 保存对象的名称 
	Vector3  *pVerts;								// 保存顶点坐标 
	Vector3  *pNormals;								// 保存点的法线量 
	Vector2  *pTexVerts;							// 保存纹理坐标 
	tFace	 *pFaces;								// 保存面信息(顶点索引及面对应的材质) 
} t3DObject; 
 
// 保存整个3ds模型 
typedef struct 
{ 
	int numOfObjects;								// 3ds对象的个数 
	int numOfMaterials;								// 3ds材质的个数 
	vector pMaterials;					// 保存3ds材质 
	vector pObject;						// 保存3ds对象 
} t3DModel; 
 
// C3DSModel类 
class C3DSModel 
{ 
public: 
	C3DSModel(); 
	~C3DSModel(); 
	BOOL Load(char *);								// 载入3ds文件 
	void Render(void);								// 绘制3ds模型 
	void Release(void);								// 释放3ds模型资源 
private: 
	void ReadChunk(tChunk *);						// 读取3ds的一个Chunk信息(Chunk的ID及长度) 
 
	UINT ReadPrimary(UINT n);						// 读取3ds文件主要Chunk 
		UINT ReadEdit(UINT n);						// 读取3ds物体主编辑Chunk 
			UINT ReadObject(UINT n);						// 读取3ds对象 
				UINT ReadObjectInfo(t3DObject *,UINT n);	// 读取3ds对象信息 
					UINT ReadFacetInfo(t3DObject *,UINT n);	// 读取面信息 
		UINT ReadMaterial(UINT n);					// 读取材质 
			UINT ReadMatDif(tMaterial *, UINT n);	// 读取材质的漫反射属性 
			UINT ReadMatMap(tMaterial *, UINT n);	// 读取材质的纹理 
		UINT ReadKeyframe(UINT n);					// 读取帧信息(未使用) 
 
	BYTE ReadByte(void);							// 从文件中读取1个字节 
	WORD ReadWord(void);							// 从文件中读取2个字节 
	UINT ReadUint(void);							// 从文件中读取4个字节 
	float ReadFloat(void);							// 从文件中读取浮点数 
	UINT ReadString(STRING *);						// 从文件中读取字符串(返回字符串长度) 
 
	Vector3 Cross(Vector3, Vector3);				// 计算两向量的叉积 
	Vector3 Normalize(Vector3);						// 向量单位化 
	void ComputeNormals(void);						// 计算顶点法线量 
 
private: 
	FILE *m_FilePtr;								// 3ds文件指针 
	t3DModel m_3DModel;								// 保存3ds模型 
}; 
 
#endif