Skip to content

Havok clips and skeletons

Animation binders contain Havok hkaAnimationContainer tagfiles: skeletons, animations and bindings specifying the skeleton bone driven by each track. Motion data and TAE events are separate files in the binder. Observed

The named skeleton contains bone names, signed 16-bit parent indices (-1 is a root), reference transforms and optional float slots. A binding carries originalSkeletonName, transform-track-to-bone indices, float-track-to-slot indices, partitions and a blend hint. Sourced · HKLib

hkQsTransform48 bytes100% known

Four-float lanes; quaternion components are x, y, z, w.

ProvenObservedSourcedInferredUnknownNot described
OffsetSizeTypeFieldConfidenceNotes
0x016f32[4]translationObservedFourth lane is padding
0x1016f32[4]rotation quaternionObserved
0x2016f32[4]scaleObservedFourth lane is padding

The fourth lane of a translation and of a scale is padding that holds whatever bytes the writer left. Over the 15,920 bones of Sekiro’s 316 skeletons a translation’s fourth lane is exactly 0.0 on 2,079, exactly 1.0 on 318, a nonzero value below 1e-3 in magnitude on 1,680 and some other value on 11,843; over Elden Ring’s 72,571 bones in 966 skeletons the counts are 5,919, 974, 6,918 and 58,760. A scale’s fourth lane is 0.0 on 15,602 (Sekiro) and 71,596 (Elden Ring) bones and 1.0 on 318 and 975. Every rotation is a unit quaternion to within 1e-4. Proven · Sekiro, Elden Ring · over the skeletons read

A negative track-to-bone index drives no bone; two examined c7300 files use such a binding in Sekiro. Observed · Sekiro Extracted root motion is a separate sampled reference frame with up and forward vectors, duration and four-float samples containing XYZ translation and rotation about up. Sourced · HKLib

The census below covers every animation tagfile of the animation binders of both installs: 11,170 distinct tagfiles in Sekiro’s 465 binders (12,121 binder members), of which 11,159 open (10 name a compendium that only another character’s binder holds, 1 is SDK 2015.1), and 39,736 in Elden Ring’s 1,657 binders (44,735 members), all of which open.

Sekiro Elden Ring
Animations 10,866 38,770
hkaSplineCompressedAnimation 10,865 38,769
hkaInterleavedUncompressedAnimation 1 1
Animations with extracted motion 6,864 20,606
frameType of every reference frame 0 0
blendHint 0 / 1 / 2 10,542 / 321 / 3 34,634 / 4,136 / 0
Bindings whose track lists match the animation’s track counts 10,866 38,770

Proven · Sekiro, Elden Ring · over the tagfiles that open

The reference frame’s frameType member carries member flags 0x21 in the type tables, where the stored members such as blendHint carry 0x20 (the 160 distinct Sekiro type tables that describe the class all agree). Proven · Sekiro · over the Sekiro tables The extra bit is the flag Havok gives a member that is not written to the file. Inferred The member reads 0 in all 27,470 reference frames (6,864 in Sekiro, 20,606 in Elden Ring), so it holds no data. Proven · Sekiro, Elden Ring · over the frames read

blendHint is 0 on ordinary clips and 1 on additive ones (321 of Sekiro’s bindings, in 62 binders; 4,136 of Elden Ring’s). The value 2 occurs on three Sekiro bindings, all in c9520, whose clips (a000_009500, a000_009600, a000_009999) have the same numbers as additive clips that every other Sekiro character stores with 1. Proven · Sekiro, Elden Ring · over the bindings read The type tables name the enum hkaAnimationBinding::BlendHint but list no members, so the files do not say what 1 and 2 mean (whether an additive clip’s deltas are in the parent’s or the child’s space). Proven · Sekiro, Elden Ring · over every table of both installs Other sources name the values differently: HKLib’s Havok 2018.1 registry names 1 ADDITIVE_PARENT_SPACE and 2 ADDITIVE_CHILD_SPACE Sourced · HKLib, while the Havok 2014 class dumps Smithbox carries for Dark Souls III name 0 NORMAL, 1 ADDITIVE_DEPRECATED and 2 ADDITIVE. Sourced · Smithbox Both agree that 1 and 2 are additive. In the running Sekiro 1.06 game, one clip (the same clip with blend hint 0, 1 and 2, in a character’s behaviour layer that plays at weight 1 over the idle pose) gives three different poses on the 47 bones where the layer reaches the pose: with 0 the bone rotation is the clip’s own; with 1 it is the clip’s rotation times the idle rotation (clip on the left, the parent-space reading, quaternion product with the right operand acting first); with 2 it is the idle rotation times the clip’s (the child-space reading). Every one of the 30 pose snapshots of each run matches its own reading to 0.002 rad on all 47 bones and the other two readings fit fewer (the nearest one 83 percent of the bones). Observed · Sekiro · one clip, one layer, one run per hint value This matches HKLib’s names (1 parent space, 2 child space); the Smithbox names say nothing about the space. In Elden Ring’s runtime the space is not shown yet: what hints 1 and 2 do there is below.

In Elden Ring, setting blendHint to 1 or to 2 on every clip of the player’s 11 animation binders changes the player’s final pose in the same way for both values: idling and walking, 126 (hint 1) and 127 (hint 2) of the 150 bones come out as with the stored hint, which for a bone a clip drives is the clip’s value, and 7 bones that no clip drives (the foot, hand and pelvis dummies, Jaw, Lips_Lower) hold the identity rotation instead of their reference-pose rotation. Observed · Elden Ring (Rotations of the live model-space pose compared with the stock pose frame by frame, over 20 s of idle and 10 s of walking in each of the three runs; 17 helper bones the graph derives from others differ otherwise and are not explained.) The clip’s value is therefore a delta that starts from the identity, with absent components neutral, when the hint is 1 or 2; whether the engine composes it onto a base pose in the parent’s or the child’s space is not shown, since no additive blend sits above the clip in the idle and walking states. Observed · Elden Ring

Every animation stores the type of its class, so the class and the value say the same thing: 1 for hkaInterleavedUncompressedAnimation, 3 for hkaSplineCompressedAnimation and, in Sekiro’s 431 hkaQuantizedAnimation objects, 4 (HKLib’s names are in Enumerated members). Observed · every distinct tagfile read

The player’s behaviour graph has a layer generator above its state machines whose layers each play one clip, with the weight of ten of them bound to a float variable (AddBlend00 to AddBlend09, initial value 0) and the stored weight 1.0. Observed · Elden Ring Two of those layers play a000_098120 (Jaw up to 0.12 rad, Lips_Lower 0.351 rad) and a000_098130 (both eyeA bones 0.620 rad), stored with blendHint 1. Above them, the speaking layer (off by default, switched by events, bone weights Jaw and Lips_Lower) and the blinking layer (on by default, weight variable 1.0, bone weights the four eye bones) set those bones, so the eyeA rotations of the final pose say nothing about the clips below. Observed · Elden Ring With the two layers’ variable bindings removed so that each weight is a constant 1.0, a buffer that holds the clip’s own sampled values on Lips_Lower and Jaw exists in the process and does not exist in the stock run. In captures whose pose array is tied to the player (the player’s ChrIns found from the module that moved under a held key, the array reached by pointers from it), the final pose has Jaw and Lips_Lower within 0.001 rad of their reference rotation, though the clip’s Lips_Lower value is 0.351 rad: in 1,528 snapshots with the stored blendHint 1 and in 1,615 with every clip’s hint set to 2. A hint 1 or 2 clip that the layer samples at weight 1 changes neither bone in the final pose, in either composition space. Observed · Elden Ring With the hint set to 0, the same array holds the clip’s values on 112 of the 130 bones the clip drives (within 0.01 rad over 1,579 snapshots; the median over those bones is 0.996 rad from the stock pose): a hint 0 clip in that layer replaces the pose. The 18 other bones are the four eye bones, which the blinking layer above sets, and 14 leg bones, whose difference from the clip is not explained: the calf, foot and foot-target bones are 1.571 rad from the identity (the clip’s values) and 0.9 to 1.6 rad from the stock pose, the knee helper bones half of that from the identity (0.785), the calf twists at the identity. A modifier list above the layer generator holds a foot IK controls modifier, handle-on-bone modifiers for the foot targets and twist modifiers on the thighs, legs and feet, and the capture is of another spawn, so the legs may come from a later stage or from another state of the player. Observed · Elden Ring (Rotations of the live model-space pose converted to the parent’s space, compared with the stock pose and the clip’s values; one capture of 20 s of idle each. The hint 0 capture started at another place of the map than the two others (the player’s spawn position), the same pointers reaching the array. Runs with unrelated edits started at that other place too, so the move is not tied to the hint.) Unknown

In a capture at the stock spawn, with one behaviour member edited so that the layer AddBlend02 plays a000_098200 (a stored blendHint 0 clip of the face) at a constant weight 1, and the player’s pose array tied as above, Head, Jaw and Lips_Lower of the final pose are within 0.01 rad of the clip’s values in every one of 415 snapshots sampled from 1,659 of 20 s of idle (their median distance from the clip: 0.0000, 0.0018, 0.0009 rad; from their rotation in the stock run: 0.127, 0.107, 0.146 rad; within 0.01 rad of the reference rotation in 100%, 5% and 7% of the snapshots). Observed · Elden Ring A hint 0 clip that a layer samples at weight 1 in the stock scene reaches the final pose, where the hint 1 and hint 2 clips of the same layer do not (above). Observed · Elden Ring In the same capture 43 of the 130 bones, the legs, feet and foot targets and the left arm among them, differ from the stock run by more than 0.01 rad (feet targets 0.2 to 0.62 rad) without taking the clip’s values, so the leg bones that the hint 0 capture above leaves unexplained are not the layer’s clip either. Observed · Elden Ring (The edit’s file was not logged as served in this run; the clip’s values on Jaw and Lips_Lower, which the stock run does not have, are what show it was read.)

The one interleaved clip of each game stores duration as (samples - 1) frames of 1/30 s: Sekiro’s c1050 a000_400600 has 166 samples of 101 tracks and lasts 5.5 s; Elden Ring’s c4751 a000_030000 has 2 samples of 185 tracks and lasts 1/30 s. Observed

A clip’s annotation tracks differ by game. Every Sekiro animation has one annotation track per transform track and none of them holds an annotation; the track’s name is the name of the bone its transform track drives in 9,365 of the 9,400 animations whose skeleton is in the same binder (the other 35 are clips authored on another object’s skeleton). Elden Ring’s animations mostly have none (36,245 of 38,770); the other 2,525 have one per transform track, again with no annotations. Proven · Sekiro, Elden Ring · over the animations read

An animation binder holds no compendium or one: Sekiro 85 and 380 of its 465 binders, Elden Ring 763 and 894 of its 1,657. A compendium names 1 to 3 type-table ids (Sekiro 65, 312 and 3 compendia; Elden Ring 113, 702 and 79), and a tagfile with a TCRF section names one of them. Every clip and skeleton tagfile of both games names an id its own binder’s compendium holds, except 10 Sekiro clips in c0010_c5000.anibnd, a binder with no compendium of its own: their id is the common Sekiro character type table, which the compendia of 104 other binders hold, among them the player’s. Proven · Sekiro, Elden Ring · over the tagfiles read

Some stock animation tagfiles carry their own TYPE section instead. In Sekiro 49 distinct tagfiles do: 42 object and part skeleton.hkx, six effect clips (s04016_a000_000000.hkx and others, each holding one animation) and the one SDK 2015.1 clip c1090’s a000_205000.hkx. In Elden Ring 530 do: 473 skeletons, including c2130’s and c4370’s, and 57 effect clips, all SDK 2018.1; no Elden Ring character clip does. Proven · Sekiro, Elden Ring · over the tagfiles read

An animation member named a000_003000.hkx corresponds to animation record 3000 in TAE; for groups other than a000 the record number depends on the character, see TAE. Observed

How the binders are divided differs between the games; see each game’s section.

The animation skeleton is not necessarily the FLVER skeleton. Each game’s section gives an example.

How does the engine transfer every animation to the model hierarchy?

Name correspondence and matching model-space poses can construct a coherent pose across different hierarchies. That reconstruction alone does not establish the engine’s complete mapping, additive blending, IK or procedural bone rules. Live Sekiro poses retain residual differences on some finger and twist bones.

only in Sekiro c0000.anibnd contains the player skeleton and markers such as c0000_a000_hi.txt naming companion animation binders. Object animation can be nested: 233 of the 1,395 object binders examined contain an .anibnd member. Observed · Sekiro

The player’s clips are in the seven companion binders those markers name: c0000_a000_hi, c0000_a000_md, c0000_a000_lo and the a00x, a05x, a07x and a2xx sets. They hold 1,248 spline-compressed animations, 671 with extracted root motion sampled once per frame with up vector (0, 1, 0). Observed · Sekiro

The reference frames of 6,858 of the 6,864 Sekiro clips with extracted motion, and of all 20,606 Elden Ring ones, have up (0, 1, 0) and forward (0, 0, 1); six Sekiro clips have up (0, 0, 1) and forward (1, 0, 0). Proven · Sekiro, Elden Ring · over the frames read In the clips whose path turns and whose steps keep one direction in the character’s own frame, the heading of the translation steps minus the rotation angle is constant for one sign of the angle (a circular resultant above 0.95) and not for the other (below 0.8) in 27 Sekiro clips and 74 Elden Ring clips. The sign that holds is the one where the heading rises with the stored angle, measured from forward towards up × forward: all 27 Sekiro clips and 71 of the 74 Elden Ring clips. Observed The angle is then a right-handed rotation about up. The other 666 turning Sekiro clips and 2,092 Elden Ring clips are not decided by this test, because their steps change direction in the character’s frame. Inferred

Sekiro’s c1010 has 127 Havok bones and 400 FLVER bones. Shared reference poses agree in examined c1010 and player c0000 data, but this does not establish equal bone counts or index orders. Observed · Sekiro

The running game (1.06) holds the player’s local pose as arrays of 146 hkQsTransform records in Havok skeleton order, and the skeleton’s reference pose is in memory exactly as stored. During idle, an array matches clip a000_000000 evaluated at fractional frames (frame × 1/30 s) within 1e-5 on 59 to 64 of the 146 bones. Five bones (4, 5, 6, 11 and 26) differ from every decoding of the clip by 2e-3 to 8e-3, and about 25 finger and twist bones by about 3e-4. Observed · Sekiro

The player’s local pose array is rewritten once per frame: sampled from memory about 600 times a second for 24 s, it changed exactly 1,440 times, at the 60 Hz frame rate. Observed · Sekiro Over those 1,440 snapshots, which cover standing idle, starting and stopping a walk, strafing and sprinting, every one of the 146 rotations has a length within 4.4e-7 of 1 (float rounding). During the walk transitions and the sprint, bones sit up to 105 to 149 degrees from their idle rotation, so a linear blend of two such rotations that is not renormalised would be 0.27 to 0.7 short of unit length: the pose the game hands on is normalised. Observed · Sekiro The arrays that hold the clip samples before blending were not found, so whether the blender or a later stage does the normalising is not established. Unknown · Sekiro

The player’s skeleton has 150 bones and the running game (1.17.2, offline) holds the local pose as arrays of 150 hkQsTransform records, rewritten every frame; bone 7, RootPos, has a static Y translation of 0.9349806 in the live pose and in the clips. A clip of the player’s animation binders rewritten with one static translation changed (that bone’s Y plus 0.6 m, in each of the 1,257 clips of eleven binders whose RootPos Y is a single static value) is loaded and played: the live pose then holds 1.5349805, the stock value plus 0.6, and nothing crashes. The same holds when each rewritten clip carries its type table inline (TYPE) in place of the TCRF reference to the binder’s compendium: the compendium’s TYPE container is put where the TCRF leaf was and the outer length is updated. Observed · Elden Ring The character’s position does not follow the changed root bone. Observed · Elden Ring

The player’s Havok skeleton splits at RootPos: Master → RootPos → Pelvis (the legs), and RootPos → RootRotY → RootRotXZ → Spine → Spine1 → Spine2 → Neck (the upper body). In the rest pose Master is turned −90° about Y, RootPos +90°, RootRotY −90° and RootRotXZ not at all. Observed · Elden Ring

The Uchigatana’s first light attack, a029_030000, tracks 42 of the 150 bones (no finger, twist or mantle bones) at 60 frames a second, 139 frames. Master, RootPos and RootRotY carry one yaw with alternating signs, so the legs get no net yaw while the upper body turns by the yaw less 90°: +18° at 0 s, +52° at 0.1 s, 0° at 0.3 s and −88° at 0.53 s; RootRotXZ pitches the upper body forward by up to 35° from 0.5 to 0.63 s. Two independent decoders agree to 0.0001° on all 42 bones every 1/30 s from 0 to 0.8 s. Observed · Elden Ring · one clip The clip is held only by c0000_a2x.anibnd (the a2x compendium), not by the expansion binders or any other c0000 binder, and its TAE record only by c0000.anibnd’s a29.tae, which gives it a blend event (type 16) over 0 to 0.2 s and an Enable Twist Modifier event (type 700) naming the behaviour graph’s twist 100 (behaviour graphs). Observed · Elden Ring

In the game, with no lock-on and no stick input, the attack from the idle turns the whole figure (hips, back, head and sword together) 40 to 50° further to the character’s left than the clip alone, from 3 to 6 frames in and mostly by 0.2 s, and it ends facing where it started; the physics module’s yaw (+0x50) stays constant throughout. So the swing is not a change of facing. Observed · Elden Ring · one run, matched-camera renders at 15° steps Which graph variable carries it was not measured.

The standing forward jump plays Jump_F (a000_202020) at rate 1 from the start of the crouch: the pelvis-area anchor bone dips 0.26 m, peaks 1.26 m up about 0.47 s after the clip starts and is back at standing height about 0.86 s after it (the clip lasts 0.8 s), then the landing crouch (−0.26 m) follows, and Jump_Loop (a000_202040) gets no visible time. The clip’s own root has a similar arc (crouch −0.32 m, peak 1.165 m at 0.467 s) but is still 0.46 m up at its end, so the game’s vertical arc is not the clip’s root alone. Observed · Elden Ring · one jump, 639 recorded steps

only in Elden Ring Character animation can be split into divisions. For example, c2010.anibnd contains the skeleton and .blf markers naming c2010_div00.anibnd and c2010_div01.anibnd. Player companion markers can instead use .txt. Observed · Elden Ring

Elden Ring’s 293 character animation binders hold 5,846 animations, all Havok 2018.1: 5,845 hkaSplineCompressedAnimation and one hkaInterleavedUncompressedAnimation, with 612,478 transform tracks, no float tracks, and 3,233 animations with extracted motion. Observed · Elden Ring

Elden Ring’s c3000 FLVER has 368 joints, 265 parentless; its Spine (75 joints) and Pelvis (30) chains are separate roots there but share an animation hierarchy in Havok, where Spine is under Pelvis. The clips move 26 of the 265 parentless joints; the other 239 never move. Its Havok skeleton has 129 joints, and 128 of them store a rest scale that differs from 1 by up to 1.19e-6, float noise in the reference pose. Observed · Elden Ring