早在一年前就計(jì)劃把wow的資源利用起來(lái),在業(yè)余時(shí)間可以自己做些東西。雖然去年5月份就把mpq庫(kù)放到MyEngine中了,但一直抽不出整塊時(shí)間安心寫(xiě)代碼,總是在遺忘和重拾之間緩慢前行。年后,越發(fā)感覺(jué)手上的工作吊不起胃口,便決定擠時(shí)間盡快搞定它。
wow的資源文件關(guān)系比較復(fù)雜,一個(gè)靜態(tài)模型至少會(huì)涉及三類文件.m2、.skin及.blp,如果不可換膚,texture會(huì)在.m2中直接給出blp文件名,否則需要查找對(duì)應(yīng)的XXXDisplayInfo.dbc。對(duì)于帶動(dòng)畫(huà)的模型,除了上面提到的三類文件,可能還會(huì)涉及到.anim。wow中的動(dòng)畫(huà)大致有下面幾種:骨骼、材質(zhì)(紋理、顏色、透明)、粒子、條帶、攝像機(jī)、光照。為了骨骼數(shù)據(jù)的復(fù)用,wow將可由一個(gè)以上模型共用的骨骼數(shù)據(jù)放到.anim文件中,而模型特有動(dòng)畫(huà)則會(huì)直接放在.m2中。動(dòng)畫(huà)的ID與名字等信息放在AnimationData.dbc中。
wow資源所使用的坐標(biāo)系與D3D有區(qū)別,旋轉(zhuǎn)角度的定義也與D3D相反,三維、四維向量的轉(zhuǎn)換代碼如下:
Vector3 Conv2D3DCoordSystem(const Vector3& v)
{
return Vector3(v._x, v._z, v._y);
}
typedef Vector4 Quaternion;
Quaternion Conv2D3DCoordSystemQuat(const Quaternion& v)
{
return Quaternion(-v._x, -v._z, -v._y, -v._w);
}
對(duì)于texture,根據(jù)壓縮和非壓縮來(lái)處理,如果為壓縮格式(D3DFMT_DXT1、3、5),則先創(chuàng)建對(duì)應(yīng)壓縮格式的Texture,然后直接memory copy LockRect出來(lái)的空間;如果為非壓縮格式,則先將texture數(shù)據(jù)寫(xiě)到內(nèi)存,然后簡(jiǎn)單調(diào)用D3DXCreateTextureFromFileInMemoryEx創(chuàng)建格式為D3DFMT_A8B8G8R8的紋理。
下圖為整個(gè)框架設(shè)計(jì)的簡(jiǎn)易類圖(目前還不是很合理)

上兩張截圖:
P.S. 貼圖沒(méi)做融合、光照還未處理 :P
參考:
[1] wowmodelview, www.wowmodelviewer.org
[2] Game Engine Architecture, Jason Gregory, A K Peters, 2009.7