EvilEngine/ANIM
ANIM | |
---|---|
Animation | |
Type | Binary |
Games used | Night of 100 Frights Battle for Bikini Bottom |
Source code | iAnimSKB.h |
Tools[edit]
The following tools can be used to work with ANIM files.
BFBBAnimTools[edit]
This is a 3ds Max script written by Seil for working with ANIM files. See BFBBAnimTools for the tool page. See Custom Animations for a tutorial.
ANIM Importer (Deprecated)[edit]
These are scripts to import most .ANIM files into 3ds Max. You really should not use these. They are listed for historical reasons.
Format[edit]
Animation assets are stored using the SKB format. The overall format looks like this:
iAnimSKBHeader header;
iAnimSKBKey keys[header.KeyCount];
float times[header.TimeCount];
unsigned short offsets[header.TimeCount - 1][header.BoneCount];
Header[edit]
The header is defined by an iAnimSKBHeader struct:
struct iAnimSKBHeader
{
unsigned int Magic;
unsigned int Flags;
unsigned short BoneCount;
unsigned short TimeCount;
unsigned int KeyCount;
float Scale[3];
};
- Magic is always 'SKB1'.
- Flags
- BoneCount is the number of bones in the model.
- TimeCount is the number of times (frames) in the animation.
- KeyCount is the total number of keyframes in the animation.
- Scale
Keys[edit]
Each keyframe in the keys array is defined by an iAnimSKBKey struct:
struct iAnimSKBKey
{
unsigned short TimeIndex;
short Quat[4];
short Tran[3];
};
- TimeIndex is an index into the times array
- Quat represents an quaternion rotation (X, Y, Z, W) for a bone at this keyframe.
- Tran represents an offset position (X, Y, Z) for a bone at this keyframe.
Times[edit]
The times array maps each frame of the animation to a time in seconds. Typically this starts at 0 and increases by a multiple of 0.01666... (1/60th of a second). The last time in the animation can be interpreted as the length of the animation in seconds.
Offsets[edit]
The offsets array maps each bone in the model to a starting index in the keys array, for each time (frame) in the animation (except for the last one, because it signifies the end of the animation and doesn't have a keyframe associated with it).
For example, if a model has 3 bones, and each bone has a keyframe on every time (so 3 keyframes per time), then the offsets array would look like this:
offsets[0][0] = 0
offsets[0][1] = 3
offsets[0][2] = 6
offsets[1][0] = 1
offsets[1][1] = 4
offsets[1][2] = 7
offsets[2][0] = 2
...