- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
1.MD2文件简介
MD2 文件是Quake2 专用模型文件。他是基于帧动画实现模型的动态活动的(播放多个连续的帧来实现3D模型的动态展示)。因此,一个MD2文件,实际上是有多个帧组成的MD2模型文件(*. md2)以及对应的纹理文件(*. pcx ,*.bmp等)组成。
如图:
其中MD2模型文件(*. md2)又有两部分组成,头文件和数据区。头文件的格式是固定的,定义了MD2文件的基本信息,如文件的标志,版本号,MD2文件中含有几个帧等信息。头文件结构如下(对每个MD2文件都是一样的):
/** MD2文件头 */
struct tMd2Header
{
int magic; /** 文件标志 */ 其值必须为IDP2
int version; /** 文件版本号 */ 其值为8
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; /** 文件结尾偏移位置 */
};
而对于MD2文件的数据区,则是不同的MD2有不同的大小(很明显,不同的模型所含的帧数,纹理数目等数据是不同的)。对于读取MD2的数据区时还应该注意,由于MD2原文件对帧的顶点信息(将float存储为 BYTE 型),纹理坐标信息(int 存储为 short)都进行了压缩,因此在读取上面两个信息时,都要进行解压缩。
他们的解压公式为:
帧的顶点解压:
x = 缩放比例 * v[0] + 偏移量;
y = 缩放比例 * v[1] + 偏移量
z = 缩放比例 * v[2] + 偏移量
其中缩放比例,偏移量在帧结构体中定义。
纹理坐标解压:
Like for vertices, data is compresed. Here we use short (2 bytes) instead of float (4 bytes) for storing texture coordinates. But to use them, we must convert them to float because texture coordinates range from 0.0 to 1.0, and if we kept short values, we could have only 0 or 1 and any intermediate value! So how to uncompress them? Its quite simple. Divide the short value by the texture size :
公式如下:
RealST[i].s = (float)texCoord[i].s / header.skinwidth;
RealST[i].t = (float)texCoord[i].t / header.skinheight;
2.读取MD2文件
前面说过,MD2文件是基于帧动画的模型文件,因此,一个*.md2文件实际上是一个有许多帧的集合体(每个帧又由许多三角形组成一个网络,每个三角形又由3的顶点组成,每个顶点又由(x,y,z)组成)。对于MD2文件的读取,实质上是我们把MD2文件中的帧一个个读取到我们自定义的MD2文件对象中。当我们把所有的帧都统一存储在我们定义的MD2文件对象(*pModel)后,我们对于MD2文件的读取就完成了。但事实是这样的吗,当然不是!我们此时只是存储了一个个静止的帧(其实就是一个个摆出静止动作的3D模型),我们下面的任务
您可能关注的文档
最近下载
- 2024北师大版小学数学六年级上册第四单元百分数集体备课教学设计.docx VIP
- 乡村物流配送体系完善.pptx
- 街道居民议事会组织与运行规范.pdf VIP
- 新型αvβ3和Neuropilin1双靶点正电子成像探针18FFAlNOTARGDATWLPPR用于脑胶质瘤的PET显像研究.pdf VIP
- 关于绑架的小故事-绑架关起来的故事.docx VIP
- 第三章_期权交易结算.pdf VIP
- 最新人教版九年级上册数学期中试题(含答案).docx VIP
- 北师大版六年级数学上册第四单元《百分数》(大单元教学设计).docx VIP
- 大班游戏活动案例《快乐沙池》.pptx VIP
- 深圳华大基因园-西门子智能照明技术方案.docx VIP
原创力文档


文档评论(0)