Posted on 2009-05-30 17:14
剑孤寒 阅读(1753)
评论(1) 编辑 收藏 引用 所属分类:
游戏编程
一直很喜欢英雄传说6的模型,正好这两天有空,就琢磨着怎么把游戏模型给提取出来。
为了不重复造轮子,先到google上搜了一下是否已有提取工具,结果发现除GameViewer能查看3D模型外,其它的工具只能提取2D图片。遗憾的是GameViewer仅能导出它自己专有格式的模型文件,所以对我来说没啥用(呃,真是应了GameViewer这个名字,只能看而已T_T),那么就自己动手吧!
先把游戏所有x模型文件解出来,按照先易后难的原则先把模型文件按大小排序,选中最小的文件"BLACK00.X"并用16进制编辑工具打开。
前面是场景节点定义和模型定义,往下看到的一个文件名"black.bmp",估计是前面的模型用到的纹理文件了,那么顶点数据应该就在这附近了,接着往下看,看到有很多有规律的FFFFFFFF,嗯,应该是顶点颜色吧,算了一下FFFFFFFF之间的间隔是40字节,猜测应该是下面这样的结构:
struct VertexFVF
{
float x, y, z; //坐标
float nx, ny, nz; //法向量
DWORD color; //顶点颜色
DWORD specular; //反射光颜色
float u, v; //纹理坐标
};
数了一下,这里一共有四个顶点,应该是矩形的四个角,肯定什么地方有顶点索引的记录,往前翻了翻,果然发现顶点索引记录。
至此,顶点和纹理数据都知道了,先写了个小程序验证了一下,结果是画了个一个黑矩形出来,和在GameViewer里看到的一样,看了看表也差不多到吃饭的时间了,吃过饭再进行后面的分析吧^_^
<待续>
ps.
顺便分析了一下GameViewer的模型文件,
文件头四个字节为文件标识,后面是世界矩阵啥的。
从0x58开始是顶点信息,以0结尾,
再后面是顶点索引记录,同样以0结尾,
接着有一个数值标识用到的纹理文件名长度,
中间不知道为啥要空三个0,
然后是纹理文件名