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鍵鍵就可以實現分別給這兩個單位的不同工作。而不需要...