SKEL

## Skeleton

**Skeletons** specify the network of bones that can be moved by an animation to bend the applied meshes of a rendered character. Skeletons also provide non-animated default translation and rotation values for each bone, for convenient editing in 3DS Max by the artists of Maxis, which are used only for Create-a-Sim (in both games) and character pages.

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 distance from the joint with the parent to the distal end of this bone after the default rotation has been applied
* **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.