【分析】魔兽争霸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 这个模型的属性数据,如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文件及模型格式分析相关推荐
- EML文件(MIME邮件)格式分析
电子邮件普遍遵循的邮件技术规范. MIME邮件由邮件头和邮件体两部分组成. 邮件头包括:标题,送信人,收信人,创建日期,邮件体内容类型和邮件体编码方式等内容. 邮件体包括:正文,超文本,内嵌数据和附件 ...
- AAC ADTS格式分析
AAC ADTS格式分析: 没有详细的参数说明,只有格式分析.可以查询文档查看详细参数说明. ADTS的全称是Audio Data Transport Stream.是AAC音频的传输流格 式.AAC ...
- PE文件和COFF文件格式分析——导出表的应用——一种插件模型
可能在很多人想想中,只有DLL才有导出表,而Exe不应该有导出表.而在<PE文件和COFF文件格式分析--导出表>中,我却避开了这个话题.我就是想在本文中讨论下载Exe中存在导出表的场景. ...
- AMOS分析技术:模型修正单文件多模型操作
基础准备 草堂君前面介绍了AMOS软件的路径分析应用,路径分析其实就是多个测量变量组成的线性回归方程的拟合研究,判断分析者对多个测量变量建立的线性回归模型是否成立,可以点击下方文章链接回顾: AMOS ...
- 电机振动噪声分析电机多转速工况下的NVH分析,有模型文件,教学视频
电机振动噪声分析电机多转速工况下的NVH分析,有模型文件,教学视频 ID:69200636485462609
- Linux五种IO模型性能分析
转载:http://blog.csdn.net/jay900323/article/details/18141217 Linux五种IO模型性能分析 目录(?)[-] 概念理解 Linux下的 ...
- Windows五种IO模型性能分析和Linux五种IO模型性能分析
Windows五种IO模型性能分析和Linux五种IO模型性能分析 http://blog.csdn.net/jay900323/article/details/18141217 http://blo ...
- 软件工程生命周期模型对比分析
软件工程生命周期模型对比分析 2018年3月29日2018年3月28日 由 xyjisaw 本文共1515个字,预计阅读时间需要5分钟. 文章目录 迭代-递增生命周期模型 增量模型 进化树模型 编码- ...
- 网络流量分析详解(包含OSI七层模型、TCP协议及Wireshark工具用法)
网络流量分析 Network Traffic Analysis(NTA) 这个系列讲的是整个网络流量分析流程,其中包含TCP协议.HTTP协议详解和Wireshark.Tcpdump的详细用法,现在只 ...
- SPSS分析技术:时间序列分析的ARIMA模型;考虑各种促销因素的服装销售额预测
基础准备 学习积累的过程,是量变到质变的过程.草堂君在前面介绍了时间序列分析的多篇文章,这些文章的安排都是按照循序渐进学习时间序列分析的过程来安排的,大家可以点击下方的链接回顾: 数据分析技术:时间序 ...
最新文章
- ueditor1.4.3jsp版成功上传图片后却回显不出来与在线管理显示不出图片的解决方案...
- LNK2001连接错误
- python编程界面怎么打开-为Python程序添加图形化界面的教程
- 关于爬虫异步请求心得
- 七牛云——对象存储私有空间下载凭证认证失败401[“error“:“download token auth failed“]解决方案
- LAMP(7限定某个目录禁止解析php、 限制user_agent、 PHP相关配置、PHP扩展模块
- 用dataGridView实现增删改查
- 设计可扩展的应用程序
- FZU 2195 检查站点
- [QT][待解决问题]对话框ui载入卡顿问题
- 10000个虎年限定版红包封面!给!
- 根据IP获取国家地区
- hb100 微波雷达arduino_【Arduino】108种传感器系列实验(03)-微波雷达感应开关...-Arduino中文社区 - Powered by Discuz!...
- 计算机xp怎么做备份,怎么备份电脑系统?XP环境使用Ghost备份操作系统的步骤
- 注册表右键添加打开选项
- ABAP调用外部webservice 问题
- 上海合宙Luat 模块 Air724开发板 入门指南(1)
- 文档扫描OCR识别-2
- 2019-04-07我破解了中国商标网
- CH340驱动安装失败
热门文章
- 《Adobe Photoshop CS6中文版经典教程》目录—导读
- 魔兽地图编辑器自定义地图预览图片的方法
- 微信小程序仿今日头条小程序端界面和代码演示
- python如何爬有道翻译_python爬取有道翻译
- mysql的备份与还原步骤_MySQL备份与还原
- “都是为了生活”小组 选题 Scrum立会报告+燃尽图 01
- 迷你世界怎么显示服务器未连接,打开迷你世界提示网络异常或者连接不上
- 打印机共享无法访问该计算机,共享打印机拒绝访问怎么办详细解决方案
- 解决Ubuntu Pycharm图标问号的方法
- NC - 网络编码的Java实现(1)-GF28基本运算