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...