MD2檔案格式

2021-06-09 16:17:00 字數 2295 閱讀 6827

md2是一種3d模型網格儲存檔案格式,最早是由id software公司為射擊遊戲quake ii建立的。

現今,很多遊戲開發者借鑑於md2檔案格式的易用性來設計自己的模型檔案。

本文來詳細理解下md2檔案的結構。

參考內容《focus on 3d models》chapter 3 quake ii's md2 models

乙個md2檔案大致有以下內容

首先來看下md2的檔案頭結構(header)

[cpp]view plain

copy

print?

struct smd2header  

;  

imagicnum:檔案魔數,md2檔案魔數值為idp2,轉換成整型表達為844121161

iversion:版本號,md2檔案的版本值為8

iskinwidthpx/iskinheightpx:表示紋理的寬和高。雖然不同紋理可以被匯入,但每個md2模型同一時間只能使用一張紋理。

iframesize:每個關鍵幀的位元組數

inumskins:定義的紋理數量

inumvertices:每幀的頂點數

inumtexcoords:紋理座標數,無須與頂點數相同

inum********s:模型中的三角形個數

inumglcommands:opengl的命令,如繪製******** fans和******** strips。對於匯入模型的過程,該引數不是必須的

inumframes:幀數。每幀存有動畫某個時間步的所有頂點位置資訊,即一幀是乙個模型當前位置的快照

ioffsetskins/ioffsettexcoords/ioffset********s/ioffsetframes/ioffsetglcommands:上述資訊在檔案中的偏移位置

ifilesize:檔案總的大小

記憶體中存放每幀的資料結構(frame)如下

[cpp]view plain

copy

print?

struct smd2frame  

~smd2frame()  

};  

fscale:三個維度上的縮放比例

ftrans:三個維度上的平移

caname:該幀的名字

pvertss:該幀定義的頂點陣列

一般每個頂點結構(vertices)在記憶體中簡單如下

[cpp]view plain

copy

print?

struct smd2vert  

;  

通常頂點結構不是以float存放的,為了節省空間,每乙個維度位置資訊被壓縮至乙個byte,在讀取之後需要再乘以乙個float-point的縮放值,才能得到float的xyz資訊。

三角形麵片(********s)資訊如下

[cpp]view plain

copy

print?

struct smd2tri  

;  

在上述提及的檔案頭結構體中,inum********s變數記錄了模型所需的三角形麵片數。

每個麵片記錄了頂點的索引值,同時還記錄紋理座標的索引,方便進行紋理的對映。

紋理結構(texture coordinates)與頂點類似

[cpp]view plain

copy

print?

struct ***2texcoord  

;  

同樣,使用short也是因為考慮空間壓縮,需要通過乘以比例係數來獲得float值。

繪製

在進行一幀繪製的時候,就獲取當前需要繪製的frame,然後按照該幀定義的頂點集,遍歷所有三角形麵片的索引,進行繪製,**片段如下:

[cpp]view plain

copy

print?

glbegin(gl_********s);  

for(int i = 0; i 

glend();  

在處理動畫繪製的時候,遍歷每幀,對前後兩幀的每個頂點進行線性插值,插值引數t一般與時間點有關。

小結

md2是一種含有動畫的3d網格模型檔案,存放動畫的方式是儲存關鍵幀的所有頂點。

MD2檔案格式

md2是一種3d模型網格儲存檔案格式,最早是由id software公司為射擊遊戲quake ii建立的。現今,很多遊戲開發者借鑑於md2檔案格式的易用性來設計自己的模型檔案。本文來詳細理解下md2檔案的結構。參考內容 focus on 3d models chapter 3 quake ii s ...

ELF檔案格式(2) 檔案結構

在前面我們已經大概看到過elf檔案的整體布局情況,本文將更詳細地對elf的檔案結構進行闡述。乙個典型的elf檔案結構如下圖所示 elf檔案格式標準中提供了兩種檢視,分別是鏈結檢視和執行檢視。鏈結檢視是以節 section 為單位,執行檢視是以段 segment 為單位。顧名思義,鏈結檢視就是在程式鏈...

DPK4 檔案格式

uint32 header dpk4 uint32 archive size in bytes uint32 directory length not including these 4 fields uint32 number of files in the archive for each fi...