分析 魔獸爭霸3的MPQ檔案及模型格式分析

2021-04-17 23:31:24 字數 3634 閱讀 7734

1 魔獸爭霸3的模型資料都被打包壓縮在*.mpq裡,可以通過sfmpq_static.lib提供的介面獲取相應的資料段控制代碼(mpqhandle)。

2 讀取mpq時,首先要知道這個mpq裡有多少個被打了包的檔案數目以及每個檔案的名字,可以通過sfmpq_static.lib的 sfileopenfile(lpcstr lpfilename, mpqhandle *hfile)介面查詢資料段標記(tag)為(listfile)在mpq裡的位置控制代碼,然後繼續用介面獲取到資料段長度後,將這段資料read到記憶體 裡來,這些資料全是關於檔名及相對路徑的字串,接下來可以建立乙個臨時檔案,把資料fwrite到這個臨時檔案裡,這樣就可以用fscan逐一讀出文 件名並儲存起來了(比如儲存成乙個table)。

3 現在有了檔案的索引了,在讀取模型時,還是用sfileopenfile獲取這個模型在mpq的控制代碼,然後再用介面讀到記憶體,這樣就可以專門針對這段模型資料段進行分析了。

下面是魔獸3的模型檔案格式:

mdlx  --  4個char,即4個位元組乙個dword的長度,這個是魔獸3模型格式的專用頭標記,如果沒有則表示出錯

vers  --  4個char,乙個dword的長度,即4個位元組

version data  --  dword型別  實際的version資料

modl  --  4個char  這個模型的屬性資料,如boundingbox

modl size  --  dword  在模型資料段中的長度,一般就是372的固定長度

modl name1  --  80個位元組

modl name2  --  260個位元組

modl unknow float  --  4個位元組,float型別  功能未知

modl boundingbox min vector  --  3個float,12個位元組  boundingbox min vector

modl boundingbox max vector  -- 3個float,12個位元組

modl unknow dword  --  4個位元組 ( 80+260+4+12+12+4=372 )

seqs  --  4個位元組  動作資料

seqs size  --  4個位元組

seqs data  --  上面讀出來的seqs size個位元組

(  單個動作資料的struct:

struct sequencename

;動作的數量:

mnumsequences = seqs size / sizeof(sequencename);

unknow tag  --  4個位元組

unknow tag size  --  4個位元組

unknow tag data  --  unknow tag size個位元組

mtls  --  4個位元組

mtls size  --  4個位元組

mtls data  --  mtls size個位元組

class mdxmaterial

;struct layer1

;mtls data裡具體的材質資料讀取是:

先讀乙個4個位元組的單個mdxmaterial的size(layer1的數量不同導致mdxmaterial的大小不同),然後按照結構順序填 充,碰到layer1時,用同樣的方法,先讀4位元組layer1的size,然後按照順序填充layer1,總共填充mnumlayers次

texs  --  4個位元組  模型使用的貼圖紋理資料

texs size  --  4個位元組 

struct texture

;由若干個texture構成,texture numbers = texs size / sizeof(texture)

texs data  --  texs size個位元組  貼圖紋理資料

geos  --  4個位元組

geos size  --  4個位元組

geos data  --  geos size個位元組

geos資料段由若干個mdxgeochunk構成

單個mdxgeochunk具體資料分布如下:

vrtx  --  4個位元組

number of vertex  --  4個位元組

vertex data  --  number of vertex * 12個位元組  每個頂點占用3*4個位元組

nrms  --  4個位元組

number of normals  --  4個位元組

normal data  --  number of normals * 12個位元組  法線資料

ptyp  --  4個位元組  primitives type

ptyp size  --  4個位元組 

ptyp data  --  ptyp size * 4個位元組

pcnt  --  4個位元組  primitives count

pcnt size  --  4個位元組

pcnt data  --  pcnt size * 4個位元組

pvtx  --  4個位元組  primitives vertices  構成ib的primitive資料

pvtx size  --  4個位元組

pvtx data  --  pvtx size * 2個位元組

struct ********

;pvtx data裡含pvtx size*2/sizeof(********)個********

gndx  --  4個位元組  vertex group indices

gndx size  --  4個位元組

gndx data  --  gndx size個位元組

mtgc  --  4個位元組  group matrix counts

mtgc size  --  4個位元組

mtgc data  --  mtgc size*4個位元組

mats  --  4個位元組  matrices

mats size  --  4個位元組

mats data  --  mats size*4個位元組

unknow dword*4  --  4*4個unknow dword

chunk bounding box  --  2*3*4個位元組

unknown struct number  --  4個位元組

unknown struct data  --  unknown struct number*(4+12*2)個位元組

uvas  --  4個位元組

uvas size  --  4個位元組

uvbs  --  4個位元組

uvbs size  --  4個位元組

uvbs data  --  uvbs size*8個位元組

unknown tag  --  4個位元組

unknown tag size  --  4個位元組

unknown tag data  --  unknown tag size個位元組

bone  --  4個位元組

bone size  --  4個位元組

bone data  --  bone size個位元組

unknown tag  --  4個位元組

unknown tag size  --  4個位元組

unknown tag data  --  unknown tag size個位元組

重複上面的unkown tag讀取過程5遍

魔獸爭霸3技術分析資源彙總

策劃設計 講的是第一代,也很有參考價值。中文版 mpq是暴雪公司用於遊戲資料打包的工具,能夠把資源放在乙個包裡,然後對其進行壓縮和加密。網上已經有很多的詳解 warcraft 3使用的是lock step技術,就是多個玩家的計算結果必須一樣的,誰落後了就要大家等他同步上來。lock step的特點,...

魔獸爭霸3在win10中調節亮度的辦法

魔獸爭霸3算是80後的乙個集體回憶,於我而言,從高中到大學到工作,斷斷續續玩了10多年了,當然,依然屬於娛樂型玩家,關於魔獸的記憶太多太多,wcg,sky,moon,th000等等,太多了,我就不囉嗦了,和今天要說的事沒多大關係。最近換了新電腦,用上了win10系統,說起來簡直天方夜譚,博主在一家西...

探尋《魔獸爭霸3》中最不為人知的按鍵

1.子組順序修改鍵 1 首先進入魔獸爭霸 遊戲,然後按 選項 2 然後按上方的 遊戲性 3 然後你可以看到左邊有乙個叫做 子組順序修改鍵 的東西了,就是它,在左邊打上勾 這個按鍵的作用是 在這個鍵被開啟的情況下,同時選中兩個不同的單位,再按住ctrl鍵鍵就可以實現分別給這兩個單位的不同工作。而不需要...