ANIM (File Format): Difference between revisions

no edit summary
imported>Jackoalan
No edit summary
>Aruki
No edit summary
 
(21 intermediate revisions by 2 users not shown)
Line 1: Line 1:
{{research|1|Having trouble with bone rotations +/- 180 degrees in format 2}}
The '''ANIM''' format is used to represent discrete [[wikipedia:Key frame|animation keys]]
The '''ANIM format''' is used in conjunction with the [[CINF (File Format)|CINF]] and [[CSKR (File Format)|CSKR]]
bound to a skeletal rig.
to animate rigged [[CMDL (File Format)|CMDL meshes]].


There are two versions of the ANIM format in ''Metroid Prime'' (indicated by the file's first long value):
Keyed attributes include:


{| class="wikitable"
* [[wikipedia:Quaternion|Quaternion]] Rotations (WXYZ)
!Version
* Translations (XYZ)
!Description
* Scale (XYZ, since MP2)
|-
|0x0
|[[#Quaternion Array Format|Quaternion Array Format]]
|-
|0x2
|[[#Rotation Vector Bitstream Format|Rotation Vector Bitstream Format]]
|}


== Quaternion Array Format ==
ANIMs are used in a variety of ways by Retro's engine. A single ANIM resource is known as
a ''primitive'' which may be blended and/or sequenced with other primitives to assemble
complex character animations (defined by [[ANCS (File Format)|ANCS]] and [[CHAR (File Format)|CHAR]]).


The '''Quaternion Array Format''' (0x0) is a less common animation format in ''Metroid Prime''.
Each game has deviations in the format, but the principle of operation remains the same for all of them:
It's only used in a ''Ridley'' intro animation and the rotating ''pirate data'' artifact hologram
above the Impact Crater.
 
The format maps animation channels to bones and supplies rotations as an array of [[wikipedia:Quaternion|quaternion]] (WXYZ) keys.
Optionally, translations may be specified for a subset of bones as an array of float3 keys.
 
{| class="wikitable"
!Data Type
!Element Count
!Identifier
!Notes
|-
|[[#Header0|Header0]]
|1
|header
|
|-
|char
|header‑>bone_entry_count
|bone_entry_map
|The index-positions of this table correspond to the ''bone ids'' in the associated [[CINF (File Format)|CINF]]. The value is 0xff if the bone is not animated by this ANIM or an index relating the ''bone_translation_map'' and ''quaternion_key_array'' below
|-
|long
|1
|bone_channel_count
|Count of bone channels present in the ''bone_translation_map'' and ''quaternion_key_array'' below
|-
|char
|bone_channel_count
|bone_translation_map
|Each bone channel may be optionally augmented with translation vectors at the bottom of the file. The index-positions of this table correspond to the values in the ''bone_entry_map'' above. The value is 0xff if the bone is not translated by this ANIM or an index relating the ''quaternion_key_array'' below
|-
|long
|1
|quaternion_key_count
|Count of elements in ''quaternion_key_array'' below
|-
|float4
|quaternion_key_count
|quaternion_key_array
|The quaternion keys are interleaved like such (bone-major):
<pre>
|------------|------------|-----|------------|
| bone0/key0 | bone0/key1 | ... | bone0/keyN |
| bone1/key0 | bone1/key1 | ... | bone1/keyN |
| .......... | .......... | ... | .......... |
| boneN/key0 | boneN/key1 | ... | boneN/keyN |
|------------|------------|-----|------------|
</pre>
|-
|long
|1
|translation_key_count
|Count of elements in ''translation_key_array'' below
|-
|float3
|translation_key_count
|translation_key_array
|The translation keys are interleaved like such (bone-major):
<pre>
|------------|------------|-----|------------|
| bone0/key0 | bone0/key1 | ... | bone0/keyN |
| bone1/key0 | bone1/key1 | ... | bone1/keyN |
| .......... | .......... | ... | .......... |
| boneN/key0 | boneN/key1 | ... | boneN/keyN |
|------------|------------|-----|------------|
</pre>
Any bone channels that were marked 0xff in the ''bone_translation_map'' are skipped by this array
|-
|long
|1
|evnt_ref
|ID for this ANIM's [[EVNT (File Format)|EVNT]] resource, or 0xffffffff if no events triggered
|}
 
=== Header0 ===
 
{| class="wikitable"
!Offset
!Length
!Data Type
!Identifier
!Notes
|-
|0x0
|4
|float
|duration
|Time in seconds that the animation plays for
|-
|0x4
|4
|float
|key_interval
|Time in seconds between keys of each bone channel (reciprocal of frame-rate)
|-
|0x8
|4
|long
|bone_entry_count
|Count of bone-channels in animation
|-
|0xC
|4
|long
|key_count
|Count of keys for each bone channel (keys are set for every frame of the animation)
|}
 
== Rotation Vector Bitstream Format ==
 
The '''Rotation Vector Bitstream Format''' is the most widely used animation format in ''Metroid Prime''.
The format uses a compressed [[wikipedia:Bitstream|bitstream]] to store keys that have been
[[wikipedia:Delta encoding|delta encoded]] and [[wikipedia:Quantization (signal processing)|quantized]]
to make for a very compact, compressed animation. The data is processed sequentially to reconstruct the
decompressed bone channel data.
 
In addition to the bitstream quantization, the format includes a bitmap specifying which frames of the animation have
keys added. Consequently, the runtime constructs missing keys via interpolation (reducing animation size further).
 
=== Header2 ===
 
{| class="wikitable"
!Offset
!Length
!Data Type
!Identifier
!Notes
|-
|0x0
|4
|long
|scratch_size
|Amount of memory that the animation system needs to allocate to process animation
|-
|0x4
|4
|long
|evnt_ref
|ID for this ANIM's [[EVNT (File Format)|EVNT]] resource, or 0xffffffff if no events triggered
|-
|0x8
|4
|long
|unknown0
|Always 0x1
|-
|0xC
|4
|float
|duration
|Time in seconds that the animation plays for
|-
|0x10
|4
|float
|interval
|Time in seconds between keys of each bone channel (reciprocal of frame-rate)
|-
|0x14
|4
|long
|unknown1
|Always 0x3
|-
|0x18
|4
|long
|unknown2
|Always 0x0
|-
|0x1C
|4
|long
|rotation_divisor
|Rotation vectors are divided by this value before being applied
|-
|0x20
|4
|float
|translation_multiplier
|Translation vectors are multiplied by this value before being applied
|-
|0x24
|4
|long
|bone_channel_count
|Count of bone channels present in ANIM
|-
|0x28
|4
|long
|unknown3
|Always 0x1
|-
|0x2C
|4
|long
|key_bitmap_length
|Number of bits in ''key bitmap''
|}


* [[ANIM (Metroid Prime)]] (used in Metroid Prime 1 and 2)
* [[ANIM (Metroid Prime 3)]]
* [[ANIM (Donkey Kong Country Returns)]]
* [[ANIM (Tropical Freeze)]]


[[Category:File Formats]]
[[Category:File Formats]]
Anonymous user