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  这个模型的属性数据,如boundingbox

MODL size  --  DWORD  在模型数据段中的长度,一般就是372的固定长度

MODL name1  --  80个字节

MODL name2  --  260个字节

MODL unknow float  --  4个字节,float类型  功能未知

MODL boundingbox min vector  --  3个float,12个字节  boundingbox min vector

MODL 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[80];
 int  mUnk1;

int  mUnk2;
 float mUnk3;
 int  mUnk4;
 float mUnk5;
 int  mUnk6;
 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[MAX_LAYER];

......
};

struct Layer1
{
 int  mLayerSize; // in Bytes
 int  mBlendMode;
 int  mUnk3;
 int  mTexture;
 int  mUnk5;
 int  mUnk6;
 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[MAX_PATH]; // 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 type

PTYP size  --  4个字节

PTYP data  --  PTYP size * 4个字节

PCNT  --  4个字节  primitives count

PCNT 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[3];
};

PVTX data里含PVTX size*2/sizeof(Triangle)个Triangle

)

GNDX  --  4个字节  vertex group indices

GNDX size  --  4个字节

GNDX data  --  GNDX size个字节

MTGC  --  4个字节  group matrix counts

MTGC size  --  4个字节

MTGC data  --  MTGC size*4个字节

MATS  --  4个字节  matrices

MATS size  --  4个字节

MATS data  --  MATS size*4个字节

unknow DWORD*4  --  4*4个unknow DWORD

chunk 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遍

【分析】魔兽争霸3的MPQ文件及模型格式分析相关推荐

  1. EML文件(MIME邮件)格式分析

    电子邮件普遍遵循的邮件技术规范. MIME邮件由邮件头和邮件体两部分组成. 邮件头包括:标题,送信人,收信人,创建日期,邮件体内容类型和邮件体编码方式等内容. 邮件体包括:正文,超文本,内嵌数据和附件 ...

  2. AAC ADTS格式分析

    AAC ADTS格式分析: 没有详细的参数说明,只有格式分析.可以查询文档查看详细参数说明. ADTS的全称是Audio Data Transport Stream.是AAC音频的传输流格 式.AAC ...

  3. PE文件和COFF文件格式分析——导出表的应用——一种插件模型

    可能在很多人想想中,只有DLL才有导出表,而Exe不应该有导出表.而在<PE文件和COFF文件格式分析--导出表>中,我却避开了这个话题.我就是想在本文中讨论下载Exe中存在导出表的场景. ...

  4. AMOS分析技术:模型修正单文件多模型操作

    基础准备 草堂君前面介绍了AMOS软件的路径分析应用,路径分析其实就是多个测量变量组成的线性回归方程的拟合研究,判断分析者对多个测量变量建立的线性回归模型是否成立,可以点击下方文章链接回顾: AMOS ...

  5. 电机振动噪声分析电机多转速工况下的NVH分析,有模型文件,教学视频

    电机振动噪声分析电机多转速工况下的NVH分析,有模型文件,教学视频 ID:69200636485462609

  6. Linux五种IO模型性能分析

    转载:http://blog.csdn.net/jay900323/article/details/18141217     Linux五种IO模型性能分析 目录(?)[-] 概念理解 Linux下的 ...

  7. Windows五种IO模型性能分析和Linux五种IO模型性能分析

    Windows五种IO模型性能分析和Linux五种IO模型性能分析 http://blog.csdn.net/jay900323/article/details/18141217 http://blo ...

  8. 软件工程生命周期模型对比分析

    软件工程生命周期模型对比分析 2018年3月29日2018年3月28日 由 xyjisaw 本文共1515个字,预计阅读时间需要5分钟. 文章目录 迭代-递增生命周期模型 增量模型 进化树模型 编码- ...

  9. 网络流量分析详解(包含OSI七层模型、TCP协议及Wireshark工具用法)

    网络流量分析 Network Traffic Analysis(NTA) 这个系列讲的是整个网络流量分析流程,其中包含TCP协议.HTTP协议详解和Wireshark.Tcpdump的详细用法,现在只 ...

  10. SPSS分析技术:时间序列分析的ARIMA模型;考虑各种促销因素的服装销售额预测

    基础准备 学习积累的过程,是量变到质变的过程.草堂君在前面介绍了时间序列分析的多篇文章,这些文章的安排都是按照循序渐进学习时间序列分析的过程来安排的,大家可以点击下方的链接回顾: 数据分析技术:时间序 ...

最新文章

  1. ueditor1.4.3jsp版成功上传图片后却回显不出来与在线管理显示不出图片的解决方案...
  2. LNK2001连接错误
  3. python编程界面怎么打开-为Python程序添加图形化界面的教程
  4. 关于爬虫异步请求心得
  5. 七牛云——对象存储私有空间下载凭证认证失败401[“error“:“download token auth failed“]解决方案
  6. LAMP(7限定某个目录禁止解析php、 限制user_agent、 PHP相关配置、PHP扩展模块
  7. 用dataGridView实现增删改查
  8. 设计可扩展的应用程序
  9. FZU 2195 检查站点
  10. [QT][待解决问题]对话框ui载入卡顿问题
  11. 10000个虎年限定版红包封面!给!
  12. 根据IP获取国家地区
  13. hb100 微波雷达arduino_【Arduino】108种传感器系列实验(03)-微波雷达感应开关...-Arduino中文社区 - Powered by Discuz!...
  14. 计算机xp怎么做备份,怎么备份电脑系统?XP环境使用Ghost备份操作系统的步骤
  15. 注册表右键添加打开选项
  16. ABAP调用外部webservice 问题
  17. 上海合宙Luat 模块 Air724开发板 入门指南(1)
  18. 文档扫描OCR识别-2
  19. 2019-04-07我破解了中国商标网
  20. CH340驱动安装失败

热门文章

  1. 《Adobe Photoshop CS6中文版经典教程》目录—导读
  2. 魔兽地图编辑器自定义地图预览图片的方法
  3. 微信小程序仿今日头条小程序端界面和代码演示
  4. python如何爬有道翻译_python爬取有道翻译
  5. mysql的备份与还原步骤_MySQL备份与还原
  6. “都是为了生活”小组 选题 Scrum立会报告+燃尽图 01
  7. 迷你世界怎么显示服务器未连接,打开迷你世界提示网络异常或者连接不上
  8. 打印机共享无法访问该计算机,共享打印机拒绝访问怎么办详细解决方案
  9. 解决Ubuntu Pycharm图标问号的方法
  10. NC - 网络编码的Java实现(1)-GF28基本运算