作为个人项目,我一直在尝试对旧的Dynamix游戏Earthsiege 2(该游戏早已被放弃,并且最近由当前版权所有者Hi-Rez免费发行)进行美术资产反向工程。解码图像/纹理是小孩子的游戏,但是我一直对二进制3D模型格式感到困惑。 DTS是专有的二进制格式(little-Endian),是“ Dynamix Three-Space”的缩写。我找不到有关逆转ES2-era DTS文件的任何资源。

对于这篇文章,我将重点介绍《启示录》。



Apocalypse模型存储在Apoca.dts中。该文件的开头是这样的(十六进制,带注释):

  | File size |     ?     |ChunkMarker|Chunk Length
02|7C 7F 01 00|4B 1F 3D 7F|03 00 1E 00|FC 5F 00 
00|FF FF 00 00 0E 08 BF FF CC FF 23 04 01 00 15 
00 14 00 70 46 00 00 FF FF 00 00 B7 06 BF FF CC 
FF 23 04 1B 00 14 00 14 00 4A 01 00 00 01 00 0C 
00 AB 01 FB FF 22 00 7B 05 18 00 0F 00 10 00 06  <-Faces
00 02 00 03 00 04 00 05 00 02 00 05 00 07 00 08 
00 0A 00 0B 00 04 00 03 00 03 00 02 00 08 00 0A 
00 0B 00 07 00 05 00 04 00 0A 00 08 00 07 00 0B 
00 00 00 1D 00 FF 07 00 00 00 00 00 00 24 FF 72  <-Some vertices here
01 82 05 DC 00 72 01 82 05 DC 00 C0 FE 8C 05 24  <-
FF C0 FE 8C 05 00 F8 00 00 00 00 24 FF E8 FE 00  <-
05 24 FF 04 01 60 04 00 08 00 00 00 00 DC 00 04  <-
01 60 04 DC 00 E8 FE 00 05 00 00 7A 07 2A FD 00  <-
00 4F F8 CE FD 00 00 BB FD 55 F8 02 00 00 04 02 
00 00 04 00 00 00 14 00 00 00 14 00 00 00 00 FF 
FF FF FF FF FF FF FF FF FF FF FF 1B 00 00 00 FF 
FF FF FF FF FF FF FF FF FF FF FF 19 00 00 00 FF 
FF FF FF FF FF FF FF FF FF FF FF 03 00 14 00 0A 
00 00 00 00 00 02 00 04 00 00 00 00 00 03 00 14


有关格式化/彩色编码的分析,请参见http://postimg.org/image/ 8e56re90n /

要完整查看文件的前3个块,请访问http://pastebin.com/RTFkdiBd

当前知识

每个DTS文件都分成多个块。第10-13个字节是块开始标记;我认为这是每个文件中的03 00 1E 00。接下来的四个字节是块的大小,后跟FF00。新的块将在上一个结束后立即开始。我不知道这些块现在如何分割数据,但是看来确实有多个块包含顶点。这可能与以下事实有关:模型明显分为离散部分,而不是单个网格。

每个顶点都是6个字节的集合,由3个带符号的X,Y短裤组成,以及该顶点的Z坐标。该文件的第一个顶点为24 FF 62 01 82 05,转换为十进制时其坐标为-220、354、1401。我提供的示例包含以下顶点:

24 FF 72 01 82 05 
DC 00 72 01 82 05 
DC 00 C0 FE 8C 05 
24 FF C0 FE 8C 05
24 FF E8 FE 00 05
24 FF 04 01 60 04
DC 00 04 01 60 04 
DC 00 E8 FE 00 05


这些顶点定义了the部。有趣的是,actually部实际上位于文件中定义的3D空间中的头部上方,因此必须在某处进行平移。我已经测试并通过在游戏运行时在RAM中编辑这些字节来验证上述字节是否包含the部,这在我单击回游戏窗口时立即使模型失真。

请注意,在这些顶点中的某些顶点之间是两组六个字节,它们看起来好像不是顶点(它们不对应于模型上的任何点,并且在RAM中更改时也不起作用)。我不知道该怎么处理:顶点被分为几组,我认为每次定义一个形状。除了武器和腿以外,我都能找到所有顶点。腿部具有动画效果,因此它们的定义可能不同,或位于不同的文件中。武器在单独的文件中定义。

在顶点之前是一些具有较小值的短裤,例如06 00 0200。这些与面孔有关;我的猜测是它们通过索引引用顶点以定义面。我已经通过在游戏运行时在RAM中对其进行编辑来验证它们是否影响了这些面孔,但尚未对其进行完全解码。

在面孔和顶点。顶点结束后不久总会有标记00 00 00 00 00 00。利用这些知识,我可以通过在这两个标记之间查看来解析文件的顶点。但是,这是不精确的,最终我得到了一堆垃圾顶点,在模型周围形成了部分球形壳。

这是我能够从Apocalypse DTS文件中读取的顶点的点云的渲染;我在这里过滤掉了一些垃圾顶点,但是在边缘和中间仍然存在一些垃圾顶点。请注意,臀部和c部位于文件中的躯干上方。


下一步是什么?

我不希望解码整个DTS。从头到尾的文件-它太长和太复杂-但我希望至少能够从文件中读取顶点,并希望面朝上。

我目前最大的挣扎是试图弄清楚如何确切地知道一组面/顶点在哪里开始和结束。我的主要问题是如何精确确定一组面/顶点在哪里开始和结束,因为它们不在每个文件中完全相同的位置。您会发现我错过的任何其他信息都很棒,但这是我的主要目标。

评论

我目前正在为长期被遗弃的2001年韩国MMORPG设计相同的项目。像您一样,纹理很容易。但是这些对象是我当前卡住的地方。您可以共享任何有助于最终解码目标文件的资源或书籍吗?

@majidarif首先,两个标题之间的文件格式几乎不可能相似。其次,如果您阅读了接受的答案,您将学到我学到的一切。

这还在继续吗?只是想说我能够使用booto的脚本转换Earthsiege 1中的某些模型。

#1 楼

仅通过检查来确定面/顶点在何处布局可能会非常耗时且容易出错。鉴于可以使用可执行文件来处理这些文件,我认为这可能是一个更好的起点-它明确地知道如何处理格式。

我使用IDA Pro分析了涉及到的可执行文件中的代码。使用一些不可思议的数字(包括您标记为ChunkMarker的0x001e0003)加载数据,以找到相关的零件并从那里展开。

您会发现,网格-我认为基础网格只是纯阴影,但在基础网格上像贴花一样很少使用纹理。

这是导入Blender的示例。


您可以访问我编写的在github上生成该代码的代码。

评论


在这里,我放弃了得到答复的机会。先生,您赢得了所有互联网。希望我能给您更多的支持。我迫不及待地想给您的脚本打个招呼。我曾考虑过尝试使用调试器进入EXE,但我从未尝试过这样做,甚至都不知道从哪里开始。

–user45623
2015年12月18日23:26



我假设您正在查看DBSIM.exe?如果您可以轻松地解释如何做您所做的事情,我一定会感激的,但是如果您要向不熟悉IDA或反汇编程序的人解释这种事情非常麻烦,请不要担心。无论哪种方式谢谢!

–user45623
2015年12月18日23:33

您能否指定Python和lib3ds的版本?我从您的打印语句中缺少括号的情况下猜测到Python 2.x吗?

–user45623
2015年12月19日在1:05

从外观看Python 2.7。

– booto
2015年12月19日下午4:12

实际上,它是“ dbsim.exe”。从0x00405F09开始(通过该魔术数字)并从那里进行跟踪。您会发现vtable开头之前的0xc字节是指向包含有关该类的元数据的结构的指针(它可能是borland的rtti的c ++东西使用的?)Lib3ds版本似乎是1.3.0?我刚刚安装了debian打包的任何版本。

– booto
2015年12月19日下午4:18