作為一個個人項目,我一直在嘗試對舊的Dynamix遊戲Earthsiege 2(該遊戲早已被棄用,並且最近由當前版權所有者Hi-Rez免費發行)進行美術資產反向工程。解碼圖像/紋理是小孩子的工作,但是我一直在遇到二進制3D模型格式的麻煩。 DTS是專有的二進制格式(little-Endian),是“ Dynamix Three-Space”的縮寫。我找不到有關反轉ES2-era DTS文件的任何資源。
在這篇文章中,我將重點介紹《啟示錄》。
Apocalypse模型存儲在 Apoca.dts
中。該文件以如下形式開始(以十六進制形式,帶有註釋):
|檔案大小| ? | ChunkMarker |塊長度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 <-Faces00 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 <-這裡有些頂點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 14 00 00 00 00 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 FF 03 00 14 00 0A 00 0 0 00 00 00 02 00 04 00 00 00 00 00 03 00 14
有關格式化/彩色編碼的分析,請參見 http://postimg.org/image/8e56re90n/
要完整查看文件的前三個塊,請參閱 http://pastebin.com/RTFkdiBd
當前知識
每個DTS文件分為多個塊。第10-13個字節是塊開始標記;我認為這是每個文件中的 03 00 1E 00
。接下來的四個字節是該塊的大小,後跟FF00。一個新的塊將在上一個結束後立即開始。我不知道這些塊現在如何分割數據,但是看來確實有多個塊包含頂點。這可能與以下事實有關:模型被明顯分為離散部分,而不是單個網格。
每個頂點都是6個字節的集合,由3個 signed 組成該頂點的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 0524 FF E8 FE 00 0524 FF 04 01 60 04DC 00 04 01 60 04 DC 00 E8 FE 00 05
這些頂點定義了c部。有趣的是,actually部實際上位於文件中定義的3D空間中的頭部上方,因此必須在某處進行平移。我已經測試並通過在遊戲運行時在RAM中編輯這些字節來驗證上述字節是否包含the部,這在我單擊回游戲窗口時立即使模型失真。
請注意,在這些頂點中的某些頂點之間是兩組六個字節,它們看起來好像不是頂點(它們不對應於模型上的任何點,並且在RAM中更改時也不起作用)。我不知道如何處理這些問題:
00 F8 00 00 00 0000 08 00 00 00 00
模型的其餘部分在整個文件中都是分塊定義的。頂點被分為幾組,我認為每次定義一個形狀。除了武器和腿以外,我都能找到所有頂點。腿部具有動畫效果,因此它們的定義可能不同,或者位於不同的文件中。武器是在單獨的文件中定義的。
在頂點之前是一些具有較小值的短褲,例如06 00 0200。這些與面孔有關;我的猜測是它們通過索引引用頂點以定義面。我已經通過在遊戲運行時在RAM中編輯這些面孔來驗證這些面孔的影響,但是尚未完全解碼它們。
總有6個字節的0s( 00 00 00 00 00 00
)在面和頂點之間。頂點結束後不久,總會有標記 04 00 00 00 14 00 00 00 14 14 00 00 00
。使用這些知識,我可以通過在這兩個標記之間查看來解析文件的頂點。但是,這是不精確的,最終我得到了一堆垃圾頂點,這些垃圾頂點在模型周圍形成了部分球形殼。 DTS文件;我在這裡過濾掉了一些垃圾頂點,但是在邊緣和中間仍然存在一些垃圾頂點。請注意,臀部和c部位於文件中的軀幹上方 。
下一步是什麼?
我不希望從頭到尾對整個DTS文件進行解碼-它太長且太複雜-但我希望至少能夠從文件中讀取頂點,並希望將其面對。
我目前最大的掙扎是試圖弄清楚如何確切地知道一組面/頂點在哪裡開始和結束。 我的主要問題是如何精確確定一組面/頂點在哪裡開始和結束,因為它們在每個文件中的位置都不完全相同。您會發現我錯過的任何其他信息都很棒,但這是我的主要目標。