关键词不能为空

当前您在: 主页 > 英语 >

MD2文件格式分析及显示

作者:高考题库网
来源:https://www.bjmy2z.cn/gaokao
2021-02-01 21:15
tags:

-

2021年2月1日发(作者:paclitaxel)


MD2


《雷神之锤》


文件格式分析及显示



2010-03-31 18:00:22|


分类:



MD2


|


标签:



|


字号大中小



订阅




MD2


文件格式分析及显示



本文介绍


MD2


文件的格式,并介绍使用


OpenGL


显示


MD2

文件的方法。



首先,我们必须要搞清几个问题:



1


、动画的实现原理



2



MD2


文件的数据存储格 式



3



Op enGL


显示动画的方法



一、动画的原理



动画就是连续出现的 画面,在


3D


动画中,在一个在两个差别很大的动作之间进


行插值,使得


3D


模型的各个部分连续运动 而得到动画的效果。比如:将手臂在


左边时的


3D


模型和手臂在右边时的


3D


模型进行保留,然后根据 时间在这两个


模型之间进行插值,让其在某个时刻显示其在中间的模型,如此连续的显示 便构


成了动画的效果。



因此,


MD2


文件中便存储了动画的各个关键帧,只不过可能某些动作的完成 需


要多个关键帧,另外,我们了解了动画的原理,我们便知道,在动画的运动过程


中,模型的顶点个数和纹理是相同的,只是在某个时刻模型的顶点坐标有差异。



二、


MD2


文件数据的格式



要搞清楚


MD2

文件的格式必须要知道其中都存储了那些数据,


MD2


动画 由两


个文件组成,一个是以


.MD2


为 后缀的文件,其中保留了动画模型的各个点的信


息,包括:顶点坐标、纹理坐标、纹理名 称、三角形索引等信息。另一个是一个


图片文件,可以是多种格式的图片,本文中使用的 是


BMP


文件。



1


、文件头



要搞清楚


MD2


文件中各种数据的大小和存储位置就必须要先分 析文件头,我们


使用下面的结构体来描述文件头


:



/** MD2


文件头


*/



struct


tMd2Header


{



int


magic;


/**<


文件标志


*/




int


version;


/**<


文件版本号


*/




int


skinWidth;


/**<


纹理宽度


*/




int


skinHeight;


/**<


纹理高度


*/




int


frameSize;


/**<


每一帧的字节数


*/




int


numSkins;


/**<


纹理数目


*/




int


numVertices;


/**<


顶点数目


(


每一帧中


) */




int


numTexCoords;


/**<


纹理坐标数目


*/




int


numTriangles;


/**<


三角行数目


*/




int


numGlCommands;


/**< gl


命令数目


*/




int


numFrames;


/**<


总帧数


*/




int


offsetSkins;


/**<


纹理的偏移位置


*/




int


offsetTexCoords;


/**<


纹理坐标的偏移位置


*/




int


offsetTriangles;


/**<


三角形索引的偏移位置


*/




int


offsetFrames;


/**<


第一帧的偏移位置


*/




int


offsetGlCommands;


/**< OPenGL


命令的偏移位置


*/




int


offsetEnd;


/**<


文件结尾偏移位置


*/



};



下面对各个变量进行解释:



magi c:


是表明该文件是


MD2


文件的标志 ,它必须等于



,不然就不是一



MD2


文件。



ve rsion:


表明该文件的版本,本文中,它的值为


8




skinWidth:

纹理的宽度,我们用这个参数来对纹理坐标进行解压。当然,因为


纹理是与


MD2


文件分离的,你也可以到文件中去获取。



skinHeight:


纹理的高度,它的用途同上。



frameSize:


表明每个关键帧的大小 ,它决定了我们每次读取关键帧时的数据读


取量。


< p>
numSkins:


表明纹理的个数,本文中只有一个纹理。



numVertices:


每帧中顶点的个数,我 们用这个参数决定读取顶点信息时的数据


读取量。


< p>
numTexCoords:


纹理坐标的个数


,< /p>


我们用这个参数决定读取纹理坐标时的数据


读取量。



numTriangles:


三角形个数,在动画 模型中,使用三角形索引来绘制一个面。



numGlComm ands:OpenGL


命令的条数,本文中未使用这个参数。



numFrames:


总帧数,它决定了我们需要读取的帧信息 量。



offsetSkins:


纹理 名称在文件中的偏移量,读取纹理名称从它指定的地方开始。



offsetTexCoords:


纹理坐标在文件中的偏移量,读取纹理坐标从它指定 的地方


开始。



offsetTria ngles:


面顶点索引在文件中的偏移量


< br>读取面顶点索引从它指定的地


方开始。



offsetFrames:


第一帧的位置,读取帧信息时从它指定的地方开始 。



offsetGlCommands:OpenGL


命令在文件中的偏移量



文中未使用这个参数 。



offsetEnd:


文件结束的 位置,这个参数可以用来检查该文件的完整性。



2


、顶点结构



MD2


文件中的顶点是经过压缩的,它包含的这样的一个结构:




/**


帧中的顶点结构


*/



struct


tMd2AliasFrame


{



float


scale[


3


];


//


坐标的缩放比例




float


transl ate[


3


];


//

< br>坐标的偏移量




char


name[


16

< p>
];


//


顶点所属的帧名



tMd2AliasTriangle aliasVertices[


1


];


//


压缩的顶点



};



/**


压缩的顶点顶点结构


*/



struct


tMd2AliasTriangle


{


BYTE vertex[


3


];


//

< p>
压缩的


x,y,z




BYTE lightNormalIndex;


//< /p>


法向量索引



};



每一帧都是由帧大小(


frameSize


)个顶点组成,因此,每个帧占用的空间

< p>


:sizeof



tM d2AliasFrame



*frameSize

< p>



2


、纹理名称



MD2


文件中纹理名称是长度为


64


的字符序列,我们这样表示:



/**


纹理名字


*/



typedef


char


tMd2Skin[


64


];



3


、纹理坐标



MD2


文件中的纹理坐标也是经过压缩的,它的结构如下:



/**


纹理坐标结构


*/



struct


tMd2TexCoord


{



short


u, v;


};



在读取纹理坐标后需要对其进行解压,公式为:


U = u / skinWidth; V = v /


skinHeight




4


、面结构



我们说过了,


MD2


文件中的使用面结构组成一个三角形,面结 构保存了该三角


形的三个顶点在帧顶点中的索引



和三个顶点所对应的纹理坐标在纹理坐标序列


中的索引。


/**


面结构


*/



struct


tMd2Face


{



short


vertexIndices[

< br>3


];


//


顶点索引

< p>



short


t extureIndices[


3


];


//


纹理索引



};



三、辅助结构



因为

< br>MD2


文件数据本身是压缩过的,因此为了得到真正能有的信息,我们必须


要定义一些辅助结构来存储转换后的数据。



1


、顶点结构



顶点结构用来存储解压后的顶点信息。



/**


解压后的顶点结构


*/



struct


tMd2Triangle


{



float


vertex[


3


];


//


顶点坐标




float


normal[< /p>


3


];


//


法向 量



};



2


、面结构



面结构用来存储每个三角形面的三个点的顶点坐标索引和纹理坐标索引。


-


-


-


-


-


-


-


-



本文更新与2021-02-01 21:15,由作者提供,不代表本网站立场,转载请注明出处:https://www.bjmy2z.cn/gaokao/595110.html

MD2文件格式分析及显示的相关文章