-
MD2
《雷神之锤》
文件格式分析及显示
2010-03-31 18:00:22|
分类:
MD2
|
标签:
|
字号大中小
订阅
MD2
文件格式分析及显示
本文介绍
MD2
文件的格式,并介绍使用
OpenGL
显示
MD2
文件的方法。
首先,我们必须要搞清几个问题:
1
、动画的实现原理
2
、
MD2
文件的数据存储格
式
3
、
Op
enGL
显示动画的方法
一、动画的原理
动画就是连续出现的
画面,在
3D
动画中,在一个在两个差别很大的动作之间进
p>
行插值,使得
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:
表明每个关键帧的大小
,它决定了我们每次读取关键帧时的数据读
取量。
numSkins:
表明纹理的个数,本文中只有一个纹理。
numVertices:
每帧中顶点的个数,我
们用这个参数决定读取顶点信息时的数据
读取量。
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
];
//
顶点所属的帧名
tMd2AliasTriangle aliasVertices[
1
];
//
压缩的顶点
};
/**
压缩的顶点顶点结构
*/
struct
tMd2AliasTriangle
{
BYTE
vertex[
3
];
//
压缩的
x,y,z
值
BYTE lightNormalIndex;
//<
/p>
法向量索引
};
每一帧都是由帧大小(
frameSize
)个顶点组成,因此,每个帧占用的空间
为
:sizeof
(
tM
d2AliasFrame
)
*frameSize
。
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
];
//
顶点索引
short
t
extureIndices[
3
];
//
纹理索引
};
三、辅助结构
因为
< br>MD2
文件数据本身是压缩过的,因此为了得到真正能有的信息,我们必须
要定义一些辅助结构来存储转换后的数据。
1
、顶点结构
顶点结构用来存储解压后的顶点信息。
/**
解压后的顶点结构
*/
struct
tMd2Triangle
{
float
vertex[
3
];
//
顶点坐标
float
normal[<
/p>
3
];
//
法向
量
};
2
、面结构
面结构用来存储每个三角形面的三个点的顶点坐标索引和纹理坐标索引。
-
-
-
-
-
-
-
-
-
上一篇:六西格玛术语对照表(64开)
下一篇:ANSYS操作常用菜单中英文对照精修订