md的文件格式,md2

2023-10-16 1593阅读

MD2是一种3D模型网格存储文件格式,最早是由id Software公司为射击游戏Quake II创建的。现今,很多游戏开发者借鉴于MD2文件格式的易用性来设计自己的模型文件。本文来详细理解下MD2文件的结构。参考内容《Focus On 3D Models》Chapter 3 Quake II\’s MD2 Models. 虽然不同纹理可以被导入,但每个MD2模型同一时间只能使用一张纹理。iNumGLCommands:OpenGL的命令,如绘制triangle fans和triangle strips。struct SMD2Tri{ unsigned short m_sVertIndices[3]; unsigned short m_sTexIndices[3];};在上述提及的文件头结构体中,iNumTriangles变量记录了模型所需的三角形面片数。MD2是一种含有动画的3D网格模型文件,存放动画的方式是保存关键帧的所有顶点。《md的文件格式,md2》来自互联网同行内容,若有侵权,请联系我们删除!

MD2是一种3D模型网格存储文件格式,最早是由id Software公司为射击游戏Quake II创建的。

md的文件格式,md2
(图片来源网络,侵删)

现今,很多游戏开发者借鉴于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:每帧的顶点

iNumTexCoor活动:慈云数据爆款香港服务器,CTG+CN2高速带宽、快速稳定、平均延迟10+ms 速度快,免备案,每月仅需19元!! 点击查看ds:纹理坐标数,无须与顶点数相同

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

?

在处理动画绘制的时候,遍历每帧,对前后两帧的每个顶点进行线性插值,插值参数t一般与时间点有关。

?

?


小结

MD2是一种含有动画的3D网格模型文件,存放动画的方式是保存关键帧的所有顶点。

《md的文件格式,md2》来自互联网同行内容,若有侵权,请联系我们删除!

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]