梦幻西游唯美版.gim(3D模型)文件格式结构记录
版本 v0.2
by 小宝
梦幻在唯美版中加入了真正的3D资源,这会不会促使小宝去学习3D图形呢?
吾尝终日而思矣,不如须夷之所学也。
我们提取资源并不是为了资源,而是让他成为学习的兴趣和动力。
.gim维护的文件版本很多,我没有精力完全分析,而且有很多新知识等待学习,故将此初期版本共享出来,希望能为感兴趣的朋友做个参考。
-------------------------------------------------------------------------------
文件中经常出现一个28字节的结构,可能是7个float,做什么用的不太确定。
以下文本如果以#开头,表示基本已经确定,未能确定的以空格开头。
count? 表示未确定是哪个 count 变量。
# 4字节 RGIM标志
# 4字节 版本号 00030010 (梦幻目前支持 2.0.0 - 3.0.10 多个版本)
# 2字节 总是0001 (也有不是0001的情况,但是未调试分析)
# 2字节 zero1 总是0000
#28字节 floats
1字节 var1
1字节 var2
1字节 var3
1字节 var4
# 4字节 count1
# 4字节 zero2
-------------------------------------------------------------------------------
接下来是count1个如下结构(96字节)
#32字节 name1 可能是模型的名字
#28字节 floats
# 4字节 zero3
#32字节 name2 可能是材质的名字
-------------------------------------------------------------------------------
一串标志(5字节)00 00 00 00 01
# 2字节 count2
# count2字节 table1(每一项是1个Byte)
# count2*32字节 table2(每一项是Bip的名字)
1字节 01 应该是一个标志
# count2*28字节 table3(每一项是一个floats)
# count2*64字节 table4(每一项是64字节16个float,是Matrix4x4吧)
-------------------------------------------------------------------------------
# 2字节 01 00 gis_file_count
-------------------------------------------------------------------------------
接下来是 gis_file_count 个如下结构(长度按需计算)
# 2字节 name_length
# name_length字节 .gis文件的名字
-------------------------------------------------------------------------------
1字节 01
4字节 AB 40 EF 37
-------------------------------------------------------------------------------
接下来是 gis_file_count 个如下结构(长度按需计算)
# 2字节 count3
===============================================================================
接下来是count3个如下结构(长度需按公式计算)
# 2字节 count4
# count4*28字节 table5(每一项是一个floats)
===============================================================================
-------------------------------------------------------------------------------
*******************************************************************************
至此,common data 读取完毕!开始读取Vertex信息。
Vertex的数目也不止一段,有个count控制,可能是gis的个数。
*******************************************************************************
-------------------------------------------------------------------------------
接下来是 count1 个如下结构(长度是8+2)
4字节 int1 // 一个模型的顶点数
4字节 int2 // 一个模型的面数
===============================================================================
// 版本 >= 3.00.08 的时候读取这2个字节,否则继续循环
1字节 01
1字节 01
===============================================================================
-------------------------------------------------------------------------------
2字节 01 00
# 4字节 count5 (总的顶点数)
# 4字节 count6 (总的面数)
-------------------------------------------------------------------------------
# count5*12字节 table6(每一项是12字节3个float,顶点?)
# count5*12字节 table6_2(每一项是12字节3个float,顶点法向量?)
# count6*6字节 table7(每一项是6字节3个word,面顶点索引表)
# count5*8字节 table8(每一项是8字节2个float,纹理的uv坐标?)
# count5*4字节 table9(每一项是4字节,不是float,颜色也不是RGBA呀)
# count5*4字节 table9_2(每一项是4字节,不是float,)
# count5*16字节 table10(每一项是16字节4个float,应该不是颜色,颜色不能大于1.0f)
-------------------------------------------------------------------------------
*******************************************************************************
接下来是读取内嵌的材质信息
1字节 00
1字节 00
# 4字节 length1
# length1字节的 内置.mtg文件