Example of two MD3 model assets from Quake III Arena that have been linked together using tags.
MD3 is a model format supported by the Quake 3 engine. The format can be used for characters, items, and level structure geometry. Animations are saved on a per-vertex basis, opposed to skeletal animation. The format can contain tags (origin and rotation) that games can place models or effects at.
Offset of MD3 object. Usually 0, but not guaranteed.
Magic number. As a string of 4 octets, reads "IDP3"; as unsigned little-endian 860898377 (0x33504449); as unsigned big-endian 1229213747 (0x49445033).
MD3 version number, latest known is 15, but use the constant MD3_VERSION.
U8 * 64
MD3 name, usually its pathname in the PK3. ASCII character string, NULL-terminated (C-style).
Number of Frame objects, with a maximum of MD3_MAX_FRAMES. Current value of MD3_MAX_FRAMES is 1024.
Number of Tag objects, with a maximum of MD3_MAX_TAGS. Current value of MD3_MAX_TAGS is 16. There is one set of tags per frame so the total number of tags to read is (NUM_TAGS * NUM_FRAMES).
Number of Surface objects, with a maximum of MD3_MAX_SURFACES. Current value of MD3_MAX_SURFACES is 32.
Number of Skin objects. I should note that I have not seen an MD3 using this particular field for anything; this appears to be an artifact from the Quake 2 MD2 format. Surface objects have their own Shader field.
Relative offset from start of MD3 object where Frame objects start. The Frame objects are written sequentially, that is, when you read one Frame object, you do not need to seek() for the next object.
Relative offset from start of MD3 where Tag objects start. Similarly written sequentially.
Relative offset from start of MD3 where Surface objects start. Again, written sequentially.
Relative offset from start of MD3 to the end of the MD3 object. Note there is no offset for Skin objects.
The array of Frame objects usually starts immediately afterwards, but OFS_FRAMES should be used.
The array of Tag objects usually starts immediately after FRAMES, but OFS_TAGS should be used.
The array of Surface objects usually start after TAGS, but OFS_SURFACES should be used.
List of Vertex objects usually starts immediate after the list of St objects, but use OFS_XYZNORMALS (+ SURFACE_START). The total number of objects is (NUM_FRAMES * NUM_VERTS). One set of NUM_VERTS Vertex objects describes the Surface in one frame of animation; the first NUM_VERTS Vertex objects describes the Surface in the first frame of animation, the second NUM_VERTEX Vertex objects describes the Surface in the second frame of animation, and so forth.
List of offset values into the list of Vertex objects that constitute the corners of the Triangle object. Vertex numbers are used instead of actual coordinates, as the coordinates are implicit in the Vertex object. The triangles have clockwise winding.
s and t texture coordinates, normalized to the range [0, 1]. Values outside the range indicate wraparounds/repeats. Unlike UV coordinates, the origin for texture coordinates is located in the upper left corner (similar to the coordinate system used for computer screens) whereas, in UV mapping, it is placed in the lower left corner. As such, the t value must be flipped to correspond with UV coordinates. See also Left-hand coordinates
The normal vector uses a spherical coordinate system. Since the normal vector is, by definition, a length of one, only the angles need to be recorded. Each angle is constrained between 0 - 255 to fit in one octet. A normal vector encodes into 16 bits.