邪恶叔 发表于 2016-8-12 02:59:27

魔兽争霸3的MPQ文件及模型格式分析

1 魔兽争霸3的模型数据都被打包压缩在*.mpq里,可以通过SFmpq_static.lib提供的接口获取相应的数据段句柄(MPQHANDLE)。2 读取MPQ时,首先要知道这个MPQ里有多少个被打了包的文件数目以及每个文件的名字,可以通过SFmpq_static.lib的SFileOpenFile(LPCSTR lpFileName, MPQHANDLE *hFile)接口查找数据段标记(TAG)为(listfile)在MPQ里的位置句柄,然后继续用接口获取到数据段长度后,将这段数据Read到内存里来,这些数据全是关于文件名及相对路径的字符串,接下来可以创建一个临时文件,把数据fwrite到这个临时文件里,这样就可以用fscan逐一读出文件名并保存起来了(比如保存成一个table)。3 现在有了文件的索引了,在读取模型时,还是用SFileOpenFile获取这个模型在MPQ的句柄,然后再用接口读到内存,这样就可以专门针对这段模型数据段进行分析了。下面是魔兽3的模型文件格式:MDLX--4个char,即4个字节一个DWORD的长度,这个是魔兽3模型格式的专用头标记,如果没有则表示出错VERS--4个char,一个DWORD的长度,即4个字节version data--DWORD类型实际的version数据MODL--4个char这个模型的属性数据,如boundingboxMODL size--DWORD在模型数据段中的长度,一般就是372的固定长度MODL name1--80个字节MODL name2--260个字节MODL unknow float--4个字节,float类型功能未知MODL boundingbox min vector--3个float,12个字节boundingbox min vectorMODL boundingbox max vector-- 3个float,12个字节MODL unknow DWORD--4个字节 ( 80+260+4+12+12+4=372 )SEQS--4个字节动作数据SEQS size--4个字节SEQS data--上面读出来的SEQS size个字节(单个动作数据的struct:struct SequenceName
{
char mName;
intmUnk1; intmUnk2;
float mUnk3;
intmUnk4;
float mUnk5;
intmUnk6;
float mUnk7; Vec3 mMins;
Vec3 mMaxs;
};动作的数量:mNumSequences = SEQS size / sizeof(SequenceName);)unknow TAG--4个字节unknow TAG size--4个字节unknow TAG data--unknow TAG size个字节MTLS--4个字节MTLS size--4个字节MTLS data--MTLS size个字节(class mdxMaterial
{
#define MAX_LAYER 8
public:
int    mUnk1;
int    mUnk2;
// 'LAYS'
int    mNumLayers;
Layer1   mLayers; ......
};struct Layer1
{
intmLayerSize; // in Bytes
intmBlendMode;
intmUnk3;
intmTexture;
intmUnk5;
intmUnk6;
float mUnk7;// alpha ?
BOOL mKMTA;
};MTLS data里具体的材质数据读取是:先读一个4个字节的单个mdxMaterial的size(layer1的数量不同导致mdxMaterial的大小不同),然后按照结构顺序填充,碰到layer1时,用同样的方法,先读4字节Layer1的size,然后按照顺序填充layer1,总共填充mNumLayers次)TEXS--4个字节模型使用的贴图纹理数据TEXS size--4个字节 (struct Texture
{
DWORD mUnk1;
char mName; // 260
DWORD mUnk2;
};由若干个Texture构成,Texture Numbers = TEXS size / sizeof(Texture))TEXS data--TEXS size个字节贴图纹理数据GEOS--4个字节GEOS size--4个字节GEOS data--GEOS size个字节(GEOS数据段由若干个mdxGeoChunk构成单个mdxGeoChunk具体数据分布如下:VRTX--4个字节number of vertex--4个字节vertex data--number of vertex * 12个字节每个顶点占用3*4个字节NRMS--4个字节number of normals--4个字节normal data--number of normals * 12个字节法线数据PTYP--4个字节primitives typePTYP size--4个字节 PTYP data--PTYP size * 4个字节PCNT--4个字节primitives countPCNT size--4个字节PCNT data--PCNT size * 4个字节PVTX--4个字节primitives vertices构成IB的primitive数据PVTX size--4个字节PVTX data--PVTX size * 2个字节(struct Triangle
{
short ind;
};PVTX data里含PVTX size*2/sizeof(Triangle)个Triangle)GNDX--4个字节vertex group indicesGNDX size--4个字节GNDX data--GNDX size个字节MTGC--4个字节group matrix countsMTGC size--4个字节MTGC data--MTGC size*4个字节MATS--4个字节matricesMATS size--4个字节MATS data--MATS size*4个字节unknow DWORD*4--4*4个unknow DWORDchunk bounding box--2*3*4个字节unknown struct number--4个字节unknown struct data--unknown struct number*(4+12*2)个字节UVAS--4个字节UVAS size--4个字节UVBS--4个字节UVBS size--4个字节UVBS data--UVBS size*8个字节)unknown TAG--4个字节unknown TAG size--4个字节unknown TAG data--unknown TAG size个字节BONE--4个字节BONE size--4个字节BONE data--BONE size个字节unknown TAG--4个字节unknown TAG size--4个字节unknown TAG data--unknown TAG size个字节重复上面的unkown TAG读取过程5遍
页: [1]
查看完整版本: 魔兽争霸3的MPQ文件及模型格式分析