From Niotso Wiki
|Type of format||Character rendering|
|Byte order||Big endian|
Skeletons follow the following format:
- Version - A 4-byte unsigned integer specifying the version number of this skeleton file; should be equal to 1
- Name - A Pascal string specifying the name of this skeleton; should be the same as the filename but without the .skel extension
- Bone count - A 2-byte unsigned integer specifying the number of bones that make up this skeleton
For each bone:
- Unknown - A 4-byte unsigned integer set to 1
- Name - A Pascal string specifying the name of this bone
- Parent's name - A Pascal string specifying the name of the parent bone which this bone is directly attached to; the parent is more proximal than the child. The ROOT bone acts as the center of gravity. The parent of the ROOT bone is "NULL", which means "no bone".
- Has property list - A 1-byte unsigned integer specifying whether or not a property list is defined with this bone
- Property list - If Has property list is set:
- Property count - A 4-byte unsigned integer specifying the number of properties in this property list
- Properties - For each property:
- Pair count - A 4-byte unsigned integer specifying the number of key/value pairs in this property
- Key/value pairs - As many pairs as defined by the previous field. A pair is made up of a key Pascal string followed by a value Pascal string.
- Note: A property list is two dimensional; there can be any number of properties, each with any number of key/value pairs.
- Note: The adult skeleton has only one key/value pair, on one property on one bone: the PELVIS has a key "name" with the value "adult".
- Translation - X,Y,Z coordinates, each a 32-bit little-endian float, specifying the default distance from the joint with the parent to the distal end of this bone before rotation
- Rotation - A normalized quaternion (called a "versor") consisting of X,Y,Z,W coordinates, each a 32-bit little-endian float, specifying the default rotation of this bone to be applied after translation. These values assume a left-handed coordinate system, meaning that for a right-handed coordinate system (like OpenGL and XNA), you have to mirror the quaternion by negating Y and Z.
- Can translate - A 4-byte integer specifying whether or not this bone can be translated by an animation
- Can rotate - A 4-byte integer specifying whether or not this bone can be rotated by an animation
- Can blend - A 4-byte integer specifying whether or not this bone can blend (exact meaning unclear, at the moment)
- Wiggle value - A 32-bit float in little-endian byte order; not used
- Wiggle power - A 32-bit float in little-endian byte order; not used
- Don Hopkins says the Wiggle parameters are left over from an attempt to use Perlin noise to introduce some randomness into the animations, so that an animation would look a little different each time it was run.