Skip to main content

How It Works

For the curious and the skeptical: what the tool actually does to your data.

The core transform​

For every key in the sequence:

  1. The pelvis's component-space transform is computed by accumulating the bone chain from the skeleton root down to the pelvis (bones without tracks contribute their reference pose).
  2. The travel path is extracted from the pelvis's ground-plane position (optionally: vertical position, and yaw as the twist of the pelvis's rotation delta about the up axis - a decomposition that is independent of the bone's local axis conventions).
  3. Depending on the mode, the path (raw or smoothed) is written to the root bone track, or subtracted from the character (in place).
  4. The pelvis local transform is re-solved against the new root: pelvis_local = pelvis_target_cs relative_to (parent_chain x new_root).

Step 4 is the invariant that makes the tool safe: for root-motion outputs the pelvis's component-space trajectory - and therefore the entire visible pose - is bit-identical to the input. Only the split between root and pelvis changes.

Smoothing without artifacts​

Smoothed mode filters the travel path with a zero-phase Gaussian (applied symmetrically, no time lag). Edges are padded by reflecting the series around its endpoint values, which preserves linear trends: a constant-velocity walk smooths to exactly itself. The practical consequence - the root does not lag the pelvis at the clip's boundaries, so blending into and out of the clip produces no capsule/mesh offset.

Yaw is unwrapped (no 2π jumps) before smoothing, then re-applied as a rotation about the up axis.

In place = the same math, inverted​

In-place mode computes the identical (smoothed) travel path, but instead of giving it to the root, applies its inverse to the pelvis target. Because the subtracted path is smoothed, the residual - natural sway and bob - stays in the animation. The path itself is preserved as the speed/distance curves.

Foot plant detection​

The foot bone's component-space height is scanned across the clip. A plant begins when the height enters the lowest fraction (default 25%) of the foot's own vertical range. This is scale- and rig-agnostic: no absolute thresholds, no dependency on the ground plane's world position. Feet that never rise more than 1 cm are treated as "no gait" and skipped.

Height-based detection is invariant to whether the clip has travel, root motion, or neither - so markers land identically on all three outputs of the same take.

Loop blending​

Make Loopable computes, per bone, the delta between the first and last key (position, rotation, scale in bone-local space) and distributes that delta over the final N frames with a smoothstep ramp (zero slope at both ends → no velocity discontinuity where the correction starts, none at the seam). Bones already matching within tolerance are skipped; the root bone is always skipped so accumulated root motion survives the loop point.

Asset plumbing​

  • All track writes go through UE's animation data controller inside a transaction bracket - actions are undoable.
  • New assets are created via the editor's asset tools with automatic unique naming; nothing is ever silently overwritten.
  • Markers use the standard notify/sync-marker APIs on a dedicated FootSync track - rerunning an action replaces the tool's markers instead of stacking duplicates.
  • Retiming uses the asset's Rate Scale (lossless, reversible) rather than resampling keys.