Posted by: billconan | October 8, 2006

仙剑奇侠传3模型文件格式分析(2)

这个上接我这个博客的第一篇日志:仙剑奇侠传3模型文件格式分析(1)。实际上我真正看这个模型的时候好像是六月份。而写上一篇文章的时候在8月份。而这一篇拖了很久。我最开始想至少写3篇,因为虽然模型的扩展名是一样的,都是pol文件,但是实际上里面的数据有差别。比如说场景模型有个光照贴图的坐标,而在物体模型里面就没有。而现在主要分析的是物体的模型。我最初想写这个东西是因为我想要记录一下我当时思考的过程,结果倒是次要的。因为把仙剑奇侠转3的模型拆出来一看其实也就那么回事。但是现在隔的时间有点太长了,很多东西只能记得结论,当时怎么想的现在已经想不起来了。
上回说到发现一个模型文件可能会包含很多组模型,并且在头部0x08的位置有个数值记录了这个数目。这样通过分析拥有多个模型的文件和只有单个模型的文件可以得到模型的头部长。计算的方法是这样的:
假设整个文件有个公共的头部长度x,而每个模型有个自己的头长度为y,文件中包含的模型数目为c,假设一个只有1个模型的文件数据开始位置是a,一个有3个模型的文件数据开始是b,那么这样列个方程,就可以求出每个模型的头部长度。

x+y=a;
x+3y=b;

经过比较几个模型文件,我发现很多模型的数据开始的位置(0x58)都是1500 0000。这个是一个比较奇怪的现象,因为按照我先前的分析,这个应该是贴图坐标,但是这么多的模型的贴图坐标怎么可能这么一致呢?再发现,如果按照先前假设的,FFFF FFFF 是顶点信息的结束标志,那么为什么最后一个顶点(box.pol文件)的FFFF FFFF 后面紧跟着一个295C 7F3F 295C 7F3F ,而这个数据和前面一个顶点的295C 7F3F 00D7 233B 数据这么相像。所以我开始意识到,FFFF FFFF 应该不是顶点的结束标志。因为一开始我先入为主地认为顶点有结束标志,所以我认为在头部没有顶点的总数信息,但是现在看来应该是有的。由于已知这个文件中有16个顶点,所以一眼就能看到在顶点数据区前面,0x5c的位置上有个1000 0000 数值,这不正是顶点的数目么。这下也就说明顶点的数据开始于0x60,且0x5c是顶点的数目,FFFF FFFF 不是顶点数据的结束标志,顶点的结构应该是这样的:

struct vertex
{
float x;
float y;
float z;
int FFFFFFFF;
float u;
float v;
}

通过和其他的文件比较可以发现,每个模型的头部有24字节长。每个顶点数据区域最开始有个头,其中最后4个字节是顶点的数目。整个文件的头有56字节长,第5个字节开始是文件包含的模型数目。
按照这个理论把程序改了一下,发现贴图坐标也正常了。
所以现在的结论是这样的:

文件头
-文件标识
-不知道的内容
-文件所包含的模型数目
-不知道的内容
每个模型的头
每个模型的数据
-顶点的数据
–顶点数据区的头
–每个顶点的数据
—顶点位置坐标
—FFFF FFFF
—顶点贴图坐标
-贴图数据(固定长度)
-面数据
–面数据头(包含了面的数目)
–面的数据

按照这个理论实现的程序:
xj3Model.c
这个程序运行以后可以把仙剑3的模型转换成obj的格式。经过测试,可以转换90%的模型,还有很多2K左右的文件处理不了,估计是索引文件,我没有仔细研究了。导入到3D Max里面基本上就是这个样子:



总结:愣看文件格式需要耐心和运气,像我看这个模型格式的运气就在于有一个box.pol的文件,这个文件名给了我暗示。另外就是文件中存在的FFFF FFFF ,虽然我最开始的假设是错误的,但是些字节还是整个文件的一个突破口。不过真把模型拆出来觉得意思也不大,感觉这些模型做的挺普通的。有时间我会把拆场景模型的文章也补上。

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Categories

%d bloggers like this: