MD2文件格式
来源:互联网 发布:painter mac教程 编辑:程序博客网 时间:2024/05/22 01:40
http://blog.csdn.net/hunter8777/article/details/6386499
MD2是一种3D模型网格存储文件格式,最早是由id Software公司为射击游戏Quake II创建的。
现今,很多游戏开发者借鉴于MD2文件格式的易用性来设计自己的模型文件。
本文来详细理解下MD2文件的结构。
参考内容《Focus On 3D Models》Chapter 3 Quake II's MD2 Models
一个MD2文件大致有以下内容
首先来看下MD2的文件头结构(Header)
- struct SMD2Header
- {
- int m_iMagicNum;
- int m_iVersion;
- int m_iSkinWidthPx;
- int m_iSkinHeightPx;
- int m_iFrameSize;
- int m_iNumSkins;
- int m_iNumVertices;
- int m_iNumTexCoords;
- int m_iNumTriangles;
- int m_iNumGLCommands;
- int m_iNumFrames;
- int m_iOffsetSkins;
- int m_iOffsetTexCoords;
- int m_iOffsetTriangles;
- int m_iOffsetFrames;
- int m_iOffsetGlCommands;
- int m_iFileSize;
- };
iMagicNum:文件魔数,MD2文件魔数值为IDP2,转换成整型表达为844121161
iVersion:版本号,MD2文件的版本值为8
iSkinWidthPx/iSkinHeightPx:表示纹理的宽和高。虽然不同纹理可以被导入,但每个MD2模型同一时间只能使用一张纹理。
iFrameSize:每个关键帧的字节数
iNumSkins:定义的纹理数量
iNumVertices:每帧的顶点数
iNumTexCoords:纹理坐标数,无须与顶点数相同
iNumTriangles:模型中的三角形个数
iNumGLCommands:OpenGL的命令,如绘制triangle fans和triangle strips。对于导入模型的过程,该参数不是必须的
iNumFrames:帧数。每帧存有动画某个时间步的所有顶点位置信息,即一帧是一个模型当前位置的快照
iOffsetSkins/iOffsetTexCoords/iOffsetTriangles/iOffsetFrames/iOffsetGlCommands:上述信息在文件中的偏移位置
iFileSize:文件总的大小
内存中存放每帧的数据结构(Frame)如下
- struct SMD2Frame
- {
- float m_fScale[3];
- float m_fTrans[3];
- char m_caName[16];
- SMD2Vert * m_pVertss
- SMD2Frame()
- {
- m_pVerts = 0;
- }
- ~SMD2Frame()
- {
- if(m_pVerts)
- delete [] m_pVerts;
- }
- };
fScale:三个维度上的缩放比例
fTrans:三个维度上的平移
caName:该帧的名字
pVertss:该帧定义的顶点数组
一般每个顶点结构(Vertices)在内存中简单如下
- struct SMD2Vert
- {
- float m_fVert[3];
- };
通常顶点结构不是以float存放的,为了节省空间,每一个维度位置信息被压缩至一个byte,在读取之后需要再乘以一个float-point的缩放值,才能得到float的xyz信息。
三角形面片(Triangles)信息如下
- struct SMD2Tri
- {
- unsigned short m_sVertIndices[3];
- unsigned short m_sTexIndices[3];
- };
在上述提及的文件头结构体中,iNumTriangles变量记录了模型所需的三角形面片数。
每个面片记录了顶点的索引值,同时还记录纹理坐标的索引,方便进行纹理的映射。
纹理结构(Texture Coordinates)与顶点类似
- struct tMd2TexCoord
- {
- short u, v;
- };
同样,使用short也是因为考虑空间压缩,需要通过乘以比例系数来获得float值。
绘制
在进行一帧绘制的时候,就获取当前需要绘制的frame,然后按照该帧定义的顶点集,遍历所有三角形面片的索引,进行绘制,代码片段如下:
- glBegin(GL_TRIANGLES);
- for(int i = 0; i < m_Head.m_iNumTriangles; i++)
- {
- glVertex3fv(m_pFrames[frame].m_pVerts[m_pTriangles[i].m_sVertIndices[0]]);
- glVertex3fv(m_pFrames[frame].m_pVerts[m_pTriangles[i].m_sVertIndices[1]]);
- glVertex3fv(m_pFrames[frame].m_pVerts[m_pTriangles[i].m_sVertIndices[2]]);
- }
- glEnd();
在处理动画绘制的时候,遍历每帧,对前后两帧的每个顶点进行线性插值,插值参数t一般与时间点有关。
小结
MD2是一种含有动画的3D网格模型文件,存放动画的方式是保存关键帧的所有顶点。
- MD2文件格式
- MD2文件格式
- MD2文件格式简介
- Quake2的MD2文件格式
- Quake2的MD2文件格式
- Quake2的MD2文件格式
- MD2 文件格式详解
- Quake2的MD2文件格式
- 看Irrlicht引擎,获知md2文件格式
- Openssl-MD2
- md2格式杂记
- MD2关键帧动画
- OpenGL MD2模型显示
- MD2格式的认识
- MD2载入和绘制
- MD2模型結構解釋
- MD2模型结构解释
- MD2格式简介
- Visual Studio 字符编码
- 淘宝面试题
- 统计自然语言处理基础-笔记-数学基础
- JVM学习之:虚拟机中的运行时栈帧总结(一)
- 哈夫曼编码简介
- MD2文件格式
- 明年的七夕,你还记得我吗
- C++---基础篇(指针)
- Windows has triggered a breakpoint in xxx.exe
- 各大IT公司面试笔试题
- OBJ文件格式
- 汽车Linux工作组
- 设计模式之-工厂模式
- PowerBuilder9.0 调用sqlite3数据库