这是2001年发行的韩国MMORPG。该游戏和该公司不再存在。我已经将文件格式作为个人项目分析了一段时间了。

我已经解码了纹理和脚本文件。我只剩下2个文件要解码:.ani.obj。通过扩展,我猜想q4​​312079q包含动画,.ani包含3d模型。正如我的问题标题所暗示的那样。我目前正在使用.obj文件。

我所知道的

.obj文件实际上是包含一个或多个模型的档案。但由于它是在另一个以扩展名.obj.t16归档的档案中找到的,因此只能使用3D模型(两足动物)。我还将其从存档中取出并保存为名为`def_022.obj的文件。

从这里开始,我将其称为第22个模型.tex。下一张图片是在def.obj上找到的Armor of Eagle的纹理:



游戏中的鹰之铠甲: >
Armor of Eagle文件具有以下相关行:

filename    LODstep polycnt
armor_eagle 0       313     // eagle = index 22


通常,def.t16的结构为:

06 00 00 00 03 00     // don't know what
3C 00                 // total number of models in this list
01 00 9E 00 00 00 9E 00 00 00 78 00 00 00 78 00 00 00 // the first model on the list with 0x9E polygons and 0x78 verticies
01 00 64 00 00 00 64 00 00 00 61 00 00 00 61 00 00 00 // the 2nd model
....... // continues until you reach the end of the headers
....... // then the bodies start, actual 3d data


标题是这样的:




青色:


39 01 00 00 = 313多边形计数
18 01 00 00 = 280顶点计数
AD 00 6B 00 =未知



关于def_022.obj

人脸索引从def_inf.txt开始
,从外观上看,它以.obj结尾顶点和uv列表的起点。




黄色:在我看来,它是块标记。 (因为所有文件都以它开头)
浅蓝色:是uint16序列号,对于0x4C [00 00 01 00...]内部的每个模型+1。并且还对应于其纹理的索引(在纹理档案上)。
深绿色:是面部索引。

问题


我该如何前进?
如何找到紫外线开始的地址? (书籍?文章?资源?)
最后,我怎么知道顶点从哪里开始?

这都是考虑到我只是分析二进制文件而不调试客户端本身以了解客户正在获取数据。

UPDATE

我注意到文件0x7A2 [...A2 00 A3 00]上有一些新东西。一个字节数组被重复很多次。虽然,我仍然不确定YET的重要性。 hex2obj 0.24c也是每个模型开始的字节,我认为这是块标记:




黄色:是重复的字节。您还将注意到,通常在其前面是字节def.objdef_022.obj,然后是00 00 80 3F0x3F,然后是3字节0x3E。这种模式被重复了185次。但是仍然不知道其重要性,我将进行更深入的探讨。

基于@RadLexus先生所提供的注释。我还能够绘制顶点并将其导入到Blender中:



添加了法线和UV:

v -13.531700 37.445000 2.338600
vn -0.687800 0.725000 -0.036200
vt 0.583800 0.086300


然后我尝试添加这些面: br />
UPDATE

所以我尝试更改我的0x0C文件,以包含有关面部值的更多信息,例如(只是将值复制为x / x / x):

f 1 2 3
f 1 3 4
f 5 6 7
f 5 7 8
f 9 10 11
...


我终于明白了:

最终更新

已经知道了。虽然,我仍然不知道unknown1和unknown2是什么,但看起来已经足够好了:
3D文件格式一无所获。除了3D对象的基本组件。


在此处下载相关文件

评论

您可以添加指向原始文件的链接以下载和检查吗?

@RadLexus感谢您的关注。我添加了更新的问题,以包括指向相关文件的链接。我还包括了我为提取数据而编写的相关脚本。

仅供参考:您在那些“重复序列”的正确轨道上。查找如何存储4字节浮点数。认识到这些是反转3D格式的重要而重要的一步。

@RadLexus我正在深入研究它。但是我仍然不确定模式是什么。但是,快速搜索显示3f80 0000 = 1或0000 803f用小字节序(文件使用的格式)。

#1 楼

仅一些初步说明-可能会演变成一个完整的答案。


我的方法如下。显然,末尾的数字是浮点数。而且,它们也不都是浮点数。 0C 00 00 00中几个字节的序列不是一个合理的浮点数。计数到下一个“不合理的”值(恰好再次为0C 00 00 00,但还有其他值)告诉我,此数据的步幅为28字节。 (十进制为40,但是对于文档,我强烈建议使用十六进制。)如果您具有功能强大的十六进制查看器,可以调整视图宽度,则可以将其视图宽度设置为40个字符,这是正确的。 br />
从末尾开始以40字节为单位进行计数,这给了我该序列的最可能起点。短),并且从开始到结束都有所增加。由于这是3D模型,因此我很想知道它们形成三角形数据,因此至少它们应该包含abc顶点索引,并可能包含其他三角形属性。事实证明,事实并非如此。 (“试验和错误”包括将它们转储到显示程序中。由于该操作立即生效,因此无需进行进一步的数值研究。)

由于此信息足以显示一个对象,因此(1)和(2)覆盖了文件中的所有数据,除了开头的几个字节(可以是任何东西)之外,我继续编写了完整的显示程序。字节未知。它们包含一些浮点数(004A00 00 80 3F,是一个4位字节的小尾数浮点数),它们可以是任何数字。 (可能是一个小数位数。)

接下来的2个字节形成数字1.0,该数字以小数点0016表示。这可能是内部的“对象编号”。

然后,从22开始,遵循004C(十进制的313)三角形定义。单个三角形定义由3个无符号的短索引113hab组成,它们指向3个坐标。此列表中最大的索引是c,这是一个相当大的数字!

此后紧接着是0117 3D点。每个3D点的结构如下:确认3个0118变量确实构成法线,可以通过将它们的平方加在一起来确定。它们应该徘徊在normal_*的值附近。这对于这些坐标中的前一百个左右是正确的,精度最高为3个小数: 1.0字节(十进制为40)的字节,并且:在28中(280,十进制)。

因此证明了三角形列表中“最高索引”的重要性:)它们确实是坐标索引。

在哪里做这些数字28118来自何处?它们出现在整个文件的标题部分!

这里证明前三个元素确实是x,y和z。我只绘制了x和y,而y却是反向的(朝着屏幕的底部负)。您可以清楚地识别游戏图像中的“身体”部分。




并非所有坐标都完全相同。对于前173个坐标,139h的浮点值为118h,然后对于其余的坐标,跳转为其他值。同样,整数unknown_1会在1.000unknown_2的值之间徘徊,然后跳到更高的值。这需要进一步调查。


443值可以直接映射到源图像上。它们以u的浮点数范围表示,因此您需要将它们乘以源图像的宽度和高度。以下是该图像的图像:



图像的未使用部分可能被其他3D模型使用。

评论


我开始了解格式。虽然,我对UV和映射纹理感到困惑。还有,如果无法识别“加扰的字母”,如何猜测面部索引的哪一部分。

– majidarif
16年8月23日在17:00

@majidarif:我对u,v的想法是正确的,请参阅更新。我不确定您对“加扰字母”的含义。您是指原始的十六进制转储吗?

–杂件
16年8月23日在22:43

谢谢,我现在尝试有关u,v的更新。关于加扰的字母,我在某处读到,找到面部索引的最简单方法是找到一段加扰的字母,如下所示。但是我只是在想如果不是这种情况怎么办?面部索引是否有更具体的定义?例如,可能值仅在1-255之间?

– majidarif
16年8月23日在22:50



当您说u,v时,使用.obj时是vp吗?我无法使其正常工作。这就是我的操作方式:“ vt%f%f”%(u *宽度,v *高度),我不确定这是否就是乘以源图像尺寸的意思。

– majidarif
16年8月23日在23:31

@majidarif:仅当您的库尚未为您做乘法时才需要乘法。阅读关于Blender的一些主题似乎表明没有必要,但是您当然可以在那里询问并参考这个问题。

–杂件
16年8月23日在23:35