转载自: http://www.cnblogs.com/tanhao/archive/2009/09/24/1573376.html
http://blog.csdn.net/lostgdi731/article/details/6113041
动画就是连续出现的画面,在3D动画中,在一个在两个差别很大的动作之间进行插值,使得3D模型的各个部分连续运动而得到动画的效果。比如:将手臂在左边时的3D模型和手臂在右边时的3D模型进行保留,然后根据时间在这两个模型之间进行插值,让其在某个时刻显示其在中间的模型,如此连续的显示便构成了动画的效果。
因此,MD2文件中便存储了动画的各个关键帧,只不过可能某些动作的完成需要多个关键帧,另外,我们了解了动画的原理,我们便知道,在动画的运动过程中,模型的顶点个数和纹理是相同的,只是在某个时刻模型的顶点坐标有差异。
MD2格式是由id Software公司开发的,首先用在了Quake II游戏中。id Software后来开发了Quake II游戏引擎的源代码,自此以后,Quake II模型格式变得很流行,因为它的动画很稳定,容易实现,制作模型的工具花费也不多。
Quake II格式是通过关键帧实现动画的。模型的顶点定位在关键帧上。在动画过程中,顶点被映射到两个关键帧之间的时间线上的对应位置。
不像其他模型格式,在模型创建过程中Quake II模型不使用骨骼层次或蒙皮权重,这些信息的缺失会导致模型关节周围的蒙皮不真实的褶皱。但是你可以通过在设计模型时仔细的规划避免(或使之最小)这种情况的发生。近距离观察Quake II模型时蒙皮会有些缺陷,但在远距离时很难注意到它们。
Quake II模型使用的三角形不能超过4,096个。
深入理解.md2数据
让我们看一下.md2文件的结构和它如何实现动画。
Quake II数据以二进制方式存储,可以对顶点和索引进行压缩。为了帮你解开数据,文件开始包含了一个文件头显示文件类型,纹理属性,顶点属性,顶点数量,帧数量和二进制偏移(处理顶点和动画帧的细节)。下面是标准的.md2文件头:
struct md2 { int fileFormatVersion; // file type which must equal 844121161 int version; // file format version which must be 8 int skinWidth; // texture width int skinHeight; // texture height int frameSize; // bytes per frame int numSkins; // total skins used int numVertices; // total vertices per frame int numUVs; // total texture UV's int numTris; // number of triangle coordinates int numglCommands; // number of glCommands int numFrames; // number of keyframes int ofsSkins; // binary offset to skin data int ofsUV; // offset to texture UV data int ofsTriangle; // offset to triangle list data int ofsFrames; // offset to frame data int ofsglcmds; // offset to OpenGL command data int ofsEnd; // offset to end of file };
每帧中的每个顶点都是被索引化的,索引的顺序就是三角形序列的顺序。当文件加载时,索引用来生成顶点坐标的集合,这个坐标用来创建三角形集合。基于效率考虑,你可以使用glCommands数据重写模型加载和动画代码,以三角形带或三角扇形绘制模型。在Quake II模型中可以存储一个以上的动画,例如,你的模型可以跑、跳、挑衅、点头,蹲下或站立,你还想控制这些动作。要处理这些信息,使用.md2文件头,文件头包含了帧信息的偏移量。帧信息可以使用偏移量读取,所有帧信息从第一帧到最后一帧排列在一起,每个帧信息包含动画名称和帧数量的信息。
要确定每个动画的开始帧和结束帧,你必须解析每个帧信息匹配动画名称。一旦有了匹配动画名称的集合,你就可以将开始帧和结束帧的序号存储在这个集合中了。当你想播放想要的动画时,你可以将帧的序号设置为开始帧的序号,当到达结束帧的序号时,你可以从头播放或切换到另一个动画。
在动画播放过程中,顶点被映射到两个关键帧之间的时间线上,法线向量必须也通过这种方式进行插值。
md2格式的纹理
在Quake II游戏中,Quake II模型使用.pcx文件作为纹理。但是XNA的内容管道不支持.pcx格式。一种解决方法是使用图像编辑器将.pcx文件保存为.tga格式,你可以使用.tga文件作为纹理。一个模型文件还可以包含多张纹理,本章的Quake II模型导入器只支持一张纹理。