← Development journal

/ 6 min read

Real motion on Ioma

The characters read as ragdolls on the arrival movie: Meshy's library clips are generic, played in place, the feet floating, the weight nowhere. This round puts real motion capture on her own skeleton. Epic's Game Animation Sample (a free sample project of motion-captured locomotion) and the engine's template Mannequin are now clip sources beside Meshy, retargeted onto her rig by a script, measured by a probe and laid side by side on a board. The board was judged the same day, and she now idles, walks and runs on the sample's cycles; the Meshy clips stay built to compare.

The pipeline

  • Her clips are a list (data/animation/ioma_clips.json): each clip's name, its source (meshy, template, gasp), its kind and whether its root yaw is neutralised. A new clip is one entry. A validator checks the list before the build reads it.
  • The clips step builds what isn't built. Meshy clips import as before. The others go through Unreal's IK Retargeter, headless: auto-generated IK rigs on both skeletons, one retargeter per source skeleton, the batch retarget naming the output A_<Name> on her skeleton. The sample's anims, skeleton, mesh and look are copied in at the content path they were saved under, since a copied asset loads nowhere else. Its project is per machine, in .env as LW_GASP_PROJECT; without it the step says so and skips those clips.
  • A post-pass on every clip. Her rig has no root bone (Hips is the root), so the clips play in place: the pass writes a retargeted clip's Hips at her mesh's scale and takes out its root motion and, where the list says so, the mean root yaw. A Meshy clip is in place already and is left as imported unless its yaw is taken out: its first frame is a hold, and taking out even its 0.01 m/s of drift made the hero measure her run 8% slower (5.33 m/s for 5.77), and her stride is set from that; caught before it shipped. The yaw fix is for her Meshy Idle, which stood 39° turned at the hips: after a dismount she settled twisted to the right and swung back as the walk faded in. That twist is gone.
  • The probe measures every clip as the game plays it: the hips' range, the lowest foot against her standing ref, and the ground speed by the same method the hero uses. An idle, walk or run whose hips leave the ref by 15 cm fails the build.
  • The board (tools/clip_board.sh): she rides in, gets down and plays the clip in place, filmed side-on from a saved vantage 4 m north of where she lands at The Source, one 10 s movie per clip, the three stacked into one, the frame at 5 s and the probe line on a page. Motion blur off, so the feet read.

The board

Each pair is her Meshy clip and the sample's, the frame at 5 s. The prints on the sand are from her landing: they are at her depth, a reference for where the ground is.

Idle, Meshy

Idle, Meshy. A look-around idle: over its 4 s cycle her hips sweep from 51° one way to 42° the other and her head much further, feet planted. The constant twist is gone, the sweep isn't; here she is caught three-quarter to the camera.

Idle, the sample

Idle, the sample (M_Neutral_Stand_Idle_Loop). She stands side-on and still: a little weight shift, a hand by the pouch at her hip.

Walk, Meshy

Walk, Meshy. Upright, a short step and a modest arm swing; the hips ride a few centimetres high and the lowest foot 4 cm over the ref: a stiff, tall stroll.

Walk, the sample

Walk, the sample (M_Neutral_Walk_Loop_F). Arms close, heel-to-toe, a real bob (11 cm at the hips); the most natural walk on the board, and the nearest her walking pace.

Run, Meshy

Run, Meshy (RunFast, her run in play). Side-on it is a lunge: her torso pitched 60-70° forward, head down by the horse's shoulder, four footfalls a second.

Run, the sample

Run, the sample's sprint (M_Neutral_Sprint_Loop_F). A real sprint: a 20° lean, the arms pumping, the knees driven, long flight phases (both feet are off the sand here). Her lowest boot stays visibly above the prints.

The template Mannequin's three are on the board too, as the proof source every machine has: its idle is a calm, slightly stiff stand, its walk a power walk, its jog a crouched easy run.

The numbers

Her standing ref: hips 98.1 cm, lowest foot 12.0 cm. Her sim speeds are a walk of 1.7 m/s and a run of 6.0.

clip hips (cm) lowest foot (cm) ground speed (m/s)
Idle (Meshy) 93–96 11.8 0
GaspIdle 95–96 13.0 0
Walk (Meshy) 100–104 16.3 1.36
GaspWalk 88–99 11.2 1.54
RunFast (Meshy) 100–102 18.4 5.77
GaspRun (the sprint) 87–93 17.1 4.25
MannyWalk (template) 86–94 10.9 2.30
MannyRun (template jog) 84–93 14.6 3.44
  • The sample's walk lands on the sand; its sprint floats about 5 cm. The source's own feet reach the ground in every cycle: the float is the retarget's. It is forward kinematics only, her legs taking the source's joint angles over her own proportions, and the float grows with how bent the legs are. Foot IK at retarget time was tried and wrecked the clips (the auto solver drives her Hips, which is both the retarget root and the skeleton root). Planted feet need foot IK at runtime.
  • The sprint over the run. The sample's run probes 3.28 m/s, its sprint 4.25: the sprint is nearer her 6.0, so it is GaspRun, and it would still play about 1.4× fast. Whether 6.0 m/s is a run any real runner keeps is a question for the user after the board.
  • The template's jog trails her. Its feet sit about 55 cm behind her hips on average and sweep 3.44 m/s where the source's root travelled 6.14 (the walk 2.30 against 3.07): likely the retargeter's pelvis motion scaled by hip height against her legs' stride. Nothing plays it; it is judged on the board before any default.

Open

  • Her root bone at the next Meshy rig run, then the sample's starts, stops and turns with their root motion.
  • Foot IK at runtime against the ground, with the root bone and its own gate.
  • Mixamo for gestures, and acted captures from phone video when a gesture has to be hers.

Lowwater is in development. These notes capture the game at the time of writing; plans and visuals may change.

More from the making of Lowwater.

Follow along ↗