File Format
An MD2 file begins with a fixed length header followed by static model data such as texture coordinates. Dynamic data such as vertices and normals are stored within a number of file chunks called frames (or key-frames) which each have their own short headers.
In defining the file structure several data types will be referred to.
int (4 bytes), short (2 bytes), and char (1 byte)
MD2 Header
Offset | Data type | Name | Description |
---|---|---|---|
0 | int | ident | Magic number. Must be equal to "IDP2" |
4 | int | version | MD2 version. Must be equal to 8 |
8 | int | skinwidth | Width of the texture |
12 | int | skinheight | Height of the texture |
16 | int | framesize | Size of one frame in bytes |
20 | int | num_skins | Number of textures |
24 | int | num_xyz | Number of vertices |
28 | int | num_st | Number of texture coordinates |
32 | int | num_tris | Number of triangles |
36 | int | num_glcmds | Number of OpenGL commands |
40 | int | num_frames | Total number of frames |
44 | int | ofs_skins | Offset to skin names (each skin name is an unsigned char and are null terminated) |
48 | int | ofs_st | Offset to s-t texture coordinates |
52 | int | ofs_tris | Offset to triangles |
56 | int | ofs_frames | Offset to frame data |
60 | int | ofs_glcmds | Offset to OpenGL commands |
64 | int | ofs_end | Offset to end of file |
At the offset ofs_st there are num_st of this structure:
Data type | Name |
---|---|
short | s |
short | t |
To recover the floating-point texture coordinates as used by common 3D display API's such as OpenGL, divide the texture coordinates by the respective size dimensions of the texture:
sfloat = (float)s / texturewidth tfloat = (float)t / textureheightAt offset ofs_tris there are num_tris of the following structure
short vertexindex short textureindexThese are indices to the vertices and texture coordinates.
At offset ofs_frames frame data is stored, each frame has a short header followed by a number of vertex and surface normal indices, the frame header structure is like this:
float scale float translate char nameThen there is num_xyz of this structure:
unsigned char v unsigned char lightnormalindexEach vertex is stored as an integer array. To recover the floating-point vertex coordinates, the MD2 reader multiplies each coordinate by the scaling vector for the current frame and then adds the frame's translation vector; these vectors can be found in the frame's header. Alternatively, you can set the translation/scale matrix with model's values before rendering the model's frame (e.g. if using OpenGL); please note that scaling using glScale may de-normalize the surface normals.
Read more about this topic: MD2 (file Format)
Famous quotes containing the word file:
“Probably nothing in the experience of the rank and file of workers causes more bitterness and envy than the realization which comes sooner or later to many of them that they are stuck and can go no further.”
—Mary Barnett Gilson (1877?)