早在一年前就计划把wow的资源利用起来,在业余时间可以自己做些东西。虽然去年5月份就把mpq库放到MyEngine中了,但一直抽不出整块时间安心写代码,总是在遗忘和重拾之间缓慢前行。年后,越发感觉手上的工作吊不起胃口,便决定挤时间尽快搞定它。
wow的资源文件关系比较复杂,一个静态模型至少会涉及三类文件.m2、.skin及.blp,如果不可换肤,texture会在.m2中直接给出blp文件名,否则需要查找对应的XXXDisplayInfo.dbc。对于带动画的模型,除了上面提到的三类文件,可能还会涉及到.anim。wow中的动画大致有下面几种:骨骼、材质(纹理、颜色、透明)、粒子、条带、摄像机、光照。为了骨骼数据的复用,wow将可由一个以上模型共用的骨骼数据放到.anim文件中,而模型特有动画则会直接放在.m2中。动画的ID与名字等信息放在AnimationData.dbc中。
wow资源所使用的坐标系与D3D有区别,旋转角度的定义也与D3D相反,三维、四维向量的转换代码如下:
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);
}
对于texture,根据压缩和非压缩来处理,如果为压缩格式(D3DFMT_DXT1、3、5),则先创建对应压缩格式的Texture,然后直接memory copy LockRect出来的空间;如果为非压缩格式,则先将texture数据写到内存,然后简单调用D3DXCreateTextureFromFileInMemoryEx创建格式为D3DFMT_A8B8G8R8的纹理。
下图为整个框架设计的简易类图(目前还不是很合理)
上两张截图:
P.S. 贴图没做融合、光照还未处理 :P
参考:
[1] wowmodelview, www.wowmodelviewer.org
[2] Game Engine Architecture, Jason Gregory, A K Peters, 2009.7