专有 3D 格式逆向工程:这些数字和矩阵能代表什么?

逆向工程 二元分析 文件格式 二进制格式
2021-06-23 01:57:49

我正在尝试对来自较旧的俄罗斯游戏 (Pathologic) 的模型格式进行逆向工程,但收效甚微。这是任何转换器/编辑工具都无法识别的专有模型格式(相信我,我已经尝试过!粉丝论坛上的某个人也向引擎背后的人证实了这一点)。我希望能够将模型读入原始引擎的潜在开源娱乐。原始游戏使用 Direct3D 并且是 2005 年的,所以我阅读了相关文档以开始使用。不幸的是,它不是“x”模型格式。

到目前为止我所拥有的(对于一个简单的网格):

  • 纹理文件名/位置
  • 面数和顶点数
  • 每个顶点的 UV 坐标
  • 顶点缓冲区

我难以理解的事情(最不重要)

  • 文件头:这可能是什么意思?

  • 文件中的“任意”填充:什么可以决定其大小?

  • 12 元素浮点矩阵。可能是没有最后一行的变换矩阵 - 与齐次坐标系一起使用,但是在具有 4 个顶点和 2 个面的网格中有 6 个矩阵 - 是不是太多了?

  • 描述每个顶点的神秘 4 个字节:某种颜色格式?

  • 重复多次的 3 个 32 位浮点数的神秘集合 - 它可能是什么?

  • 顶点法线可以存储在哪里?

附件是一个非常简单的网格(小于 1kB),我正在研究更复杂的网格。我相信它是一个简单的纹理平面。我已经开始使用 XY 平面中的类似网格,这个网格似乎更加随意。由于它是一个平面,我假设它有 4 个顶点和 2 个面。

简单网格

据我所知文件的结构

  • 0x00 处的标头。
  • 纹理文件名长度为 0x11(此处为 16 个字符)
  • 1 字节填充
  • 纹理文件名 (h2_door_DXT1.tex)
  • 1 字节填充
  • 0x23 处的顶点数(4 个顶点)
  • 0x27 处的面数(2 个面)
  • 12 字节的循环 3x 4 字节浮点数(第一次出现)
  • 神秘漂浮物
  • 12 字节的重复 3x 4 字节浮点数(第二次出现)
  • 12 元素浮点矩阵(转换矩阵?)
  • 73 字节的未知数据
  • 12 字节的重复 3x 4 字节浮点数(第三次出现)在 0xC0
  • 0xCC 处四个顶点的数据。对于每个顶点,X、Y、Z 坐标有 3 个 int16,然后是 4 个神秘字节,最后是 UV 坐标的 2 个 32 位浮点数。
  • 0x114 处的顶点缓冲区。两个三角形描述,每个三角形的顶点 ID 有 3 个 int16。

之后,它变成了 12 元素浮点矩阵和重复出现的 3x 浮点的混合体,它们之间有一些填充/幻数。

十六进制编辑器中文件的初步地图

我很感激所有帮助回答我的问题/帮助解决我正在努力解决的要点。我还可以根据需要提供其他网格示例。

1个回答

我要放弃了。如果你说场景中有 21 个 .mesh 文件用于 21x 相同的对象,那么很有可能这个文件中有更多的非网格数据(如你所说,烘焙阴影信息、世界位置、碰撞器、演员参考,可能是动画数据,......对我来说听起来很不寻常,但可能有理由将所有这些都放在一个文件中)。

我能够使用 binwalk 在 actor 文件中的 0x4B 和 0x11C 中找到两个 zlib 压缩流,但仅此而已。网格文件比乍一看要复杂得多......

通过更改随机值和观察效果,​​您可能会从文件中获得更多信息,但是您在不调试或逆向工程可执行文件的情况下发现这些文件真正工作的可能性很小。