原文:http://blog.csdn.net/ouyang2008/archive/2007/04/01/1548504.aspx
// md2 header
typedef struct
{
int ident; // 文件标识. 必须是"IPD2"
int version; // md2 版本. 等于 8
int skinwidth; // 纹理宽度
int skinheight; //纹理高度
int framesize; // 每一帧占的字节数
int num_skins; // 纹理的数目
int num_xyz; // 三维空间中点数
int num_st; // 纹理的坐标数
int num_tris; //三角形的数目
int num_glcmds; // OPENGL命令数目
int num_frames; // 文件包含的帧数
int ofs_skins; // 纹理名称的偏移量(每个64字节)
int ofs_st; // 存储纹理坐标偏移量
int ofs_tris; // 存储三角形地址偏移量
int ofs_frames; //存储帧的地址偏移量
int ofs_glcmds; // 存储OPENGL命令的地址偏移量
int ofs_end; // 文件结尾的偏移量
} md2_t;
typedef float vec3_t[3];
每一个模体都有num_frame * num_xyz个向量,下面是单个向量的结构:
// vertex
typedef struct
{
unsigned char v[3]; // 压缩的向量 坐标(x, y, z)
unsigned char lightnormalindex; // 向量的索引
} vertex_t;
你可能注意到了 unsigned char v[3]; 是的,这个向量的表示的是已经压缩过的数据(听起来很专业:)),在计算中我们会把这些数据解压,然后熏染,所以模型不会受到太大的影响。
Lightnormalindex是一个向量的索引。
对于一个模体的向量,还会有一个纹理坐标:
// 纹理坐标
typedef struct
{
short s;
short t;
} texCoord_t;
RealST[i].s = (float)texCoord[i].s / header.skinwidth;
RealST[i].t = (float)texCoord[i].t / header.skinheight;
关键帧的结构如下:
// frame
typedef struct
{
float scale[3]; // 压缩,解压码
float translate[3]; //平移向量
char name[16]; // 帧名称
vertex_t verts[1]; // 帧向量开始的地方
} frame_t;
vertex.x = (frame.verts[i].v[0] * frame.scale[0]) + frame.translate[0]
vertex.y = (frame.verts[i].v[1] * frame.scale[1]) + frame.translate[1]
vertex.z = (frame.verts[i].v[2] * frame.scale[2]) + frame.translate[2]
// triangle
typedef struct
{
short index_xyz[3]; // 向量索引
short index_st[3]; // 纹理索引
} triangle_t;
你可能已经注意到,我们现在已经把每一个三角型的定点已经和三角型的纹理对应上了,渲染代码如下:
glBegin( GL_TRIANGLES );
// draw each triangle
for( int i = 0; i < header.num_tris; i++ )
{
// draw triangle #i
for( int j = 0; j < 3; j++ )
{
// k is the frame to draw
// i is the current triangle of the frame
// j is the current vertex of the triangle
glTexCoord2f( (float)TexCoord[ Meshes[i].index_st[j] ].s / header.skinwidth,
(float)TexCoord[ Meshes[i].index_st[j] ].t / header.skinheight );
glNormal3fv( anorms[ Vertices[ Meshes[i].index_xyz[j] ].lightnormalindex ] );
glVertex3f( (Vertices[ Meshes[i].index_xyz[j] ].v[0] * frame[k].scale[0]) + frame[k].translate[0],
(Vertices[ Meshes[i].index_xyz[j] ].v[1] * frame[k].scale[1]) + frame[k].translate[1],
(Vertices[ Meshes[i].index_xyz[j] ].v[2] * frame[k].scale[2]) + frame[k].translate[2] );
}
}
glEnd();
opengl命令应用,我不在翻译,参照原版。
下面是整个文件的结构图:
http://tfc.duke.free.fr/old/models/md2.htm