Skip to content

Planted feet that stay planted, and a sitter that rests on a round seat - #832

Merged
nicolas-maman merged 3 commits into
mainfrom
feat/motion-feet-exact
Oct 20, 2026
Merged

nicolas-maman merged 3 commits into
mainfrom
feat/motion-feet-exact

Conversation

@nicolas-maman

@nicolas-maman nicolas-maman commented Oct 20, 2026 •

Copy link
Copy Markdown
Collaborator

A planted foot now stays where it was set. Going to a spot five ways (tests/test_go_to.ae, the box man on ae3d.feet), no toe slides in any plant, before or after arriving:

worst plant on main now
straight ahead 4.1 mm under 0.001 mm
ahead, then turned a quarter 5.0 mm under 0.001 mm
to its side 7.7 mm under 0.001 mm
behind it 8.4 mm under 0.001 mm
ahead at a run 15.6 mm under 0.001 mm

test_go_to now holds every way to #825's 5 mm. On main the turns (#827) and braking a run (#828) were held to what they slid.

There were four causes, each found by tracing a plant frame by frame. Each has a check that fails without its fix.

core.quat_from_to took turns under 0.08 degrees for none. It returned the identity for a dot over 0.999999.

  • The two-bone solve ends by aiming the limb at its target, and near the target that aim is such a turn.
  • A running leg was aimed up to 1.2 mm off its target every other frame. Its locked ankle moved that much, and the toe slid 8.6 mm a step at a steady run.
  • The half-way form it already uses is exact for small turns, and gives the identity on its own for the same direction.
  • test_gmath: a 0.001 rad turn takes one direction onto the other.

ik.solve_two_bone measured the knee's bend without its side.

  • A limb all but straight keeps its own bend plane (solve_two_bone turns a nearly straight limb half round about its own line by the sign of a millimetre's bend #781). So a knee the clip overstraightens a few degrees behind the hip-ankle line stayed behind it.
  • The law-of-cosines turn was made as if the knee were on the pole's side. It bent the knee further backwards, and left the ankle short of a target just under the leg's reach.
  • Now a knee on the far side is turned through the line by its bend there plus the bend wanted.
  • test_ik: a leg 3 cm overstraightened, solved to 0.08 mm under its reach, ends on the target with its knee toward the pole. On main the knee ends behind the line.

ae3d.feet lowered the pelvis only for the ground's height.

  • A foot held where it was set while the body goes on past it is drawn out past the leg's reach. Braking from a run, the locked foot was 4 to 8.6 mm out of reach for eight frames: the solve left the leg straight and pointing, and the toe slid 7 mm.
  • The pelvis now also comes down until each held foot is within its leg's full length at its level distance from the hip (reach_drop), as foot-IK systems lower the pelvis for the farthest planted foot (Unreal's leg IK pelvis adjustment, Final IK's grounder).
  • It comes down by REACH_DROP (5 cm) at most. Past that the foot gives, as before (LOCK_REACH).

ae3d.feet's own steps followed the clip's place down.

A sitter rests on a round seat (#833, reported by Siltreach). The seated key was set down so the lowest drawn flesh of the pelvis and thighs near the seat's point was at the seat's one height.

  • On a round log that lowest flesh is the thighs over the log's sides, where the wood is lower, so the buttocks over its top stayed in the air: 6.6 and 8.5 cm on Siltreach's people.
  • Now the seat's surface is sampled once a sit, 15 by 15 rays down onto the static world (seat_surface). The key is set down by the nearest gap between each flesh point and the surface under it (seat_gap), through the new skin.skeleton_bone_points_near and physics.ragdoll_flesh_points.
  • On a flat seat the two agree, and flesh past a seat's edge no longer counts.
  • test_sit now also sits the box man on a round log, its top 0.6 m up, high enough that his thighs slope down to his knees. Both seats are held to a millimetre: the round one rests 0.26 mm into the wood, and without the fix it is 2.1 mm over and fails.
  • Its pop check is held at 8 degrees on that high seat, where main turns a body 7.6 degrees in a step. That is filed as sit: on a seat over 0.45 m high a body turns 7.6 to 10 degrees in a step (pop) #834 and is the same with or without this change.

Stopping on its feet. With planted feet held where they land, the box man on ae3d.feet stops a stride apart and steps to its stance. The step lands 1.08 s after the stop, and he stands on through three seconds. On main the planted foot gave as the body braked over it: the toe drifted 3.8 mm stopping, and he stood at a second. test_locomotion now checks the stance a second and a half on. Walking straight, its toe drift is 0 (main 4.9 mm); turning round, 2.26% of the body's way (main 2.90%).

Also: inflate's huffman_block ended with an unreachable return true after a while true that only leaves by returning. The next Aether's W1002 finds it (aether#3026).

Tested locally: on Aether 0.834.0 and aephysics f0bd6d6, the motion gate (34 suites) plus test_go_to, test_sit, test_lie, test_locomotion, test_characters_meet, test_physics, test_ik and test_gmath all pass, 42 of 42, with no warnings.

Plaza scorecard against main (988affa): 20, 24 and 28 walkers, 60 s each, on Aether 0.834 and aephysics f0bd6d6. Every run started and finished.

main, seeds 1 to 4 branch main, seeds 5 to 8 branch
toes skating, cm per walker-second 0.547 0.365 0.548 0.370
knees backwards 0.17 s 0 s 0.08 s 0.22 s
legs splayed 6.50 s 4.38 s 3.37 s 5.63 s
figures inside each other 0.92 s 1.03 s 3.33 s 8.23 s
sunk in the ground 0.60 s 0.62 s 0.53 s 0.53 s
in the car 2.53 s 1.30 s 1.53 s 1.40 s
heads spinning 4.98 s 5.55 s 3.05 s 3.78 s
bodies walked through 1.53 s 1.05 s 0.52 s 0.48 s
  • Toe skating is a third lower in all 24 pairs.
  • The rises in seeds 5 to 8 are struck figures': figures inside each other with one struck, and legs splayed struck.
    • Three runs hold most of the inside-each-other time. Traced, the biggest (28 walkers, seed 8: 2.1 s of 2.85) is two knocked figures getting up side by side through each other, a defect main has too. Filed as get-up: two knocked figures getting up side by side are drawn inside each other for up to 2 s #835.
    • Walking figures' splay over seeds 5 to 8 is 1.33 s on the branch against 2.19 s on main.
    • Which figures the car strikes moves with the walkers' paths: 477 strikes on the branch against 507 on main over the 24 pairs.

Dependencies: held. CI stays on Aether 0.834.0 and aephysics f0bd6d6, as on main. A ci.yml line now names why:

  • 0.835.0 needs aephysics b37fae2, whose AVX2 code is a GCC internal compiler error at -O0 on Win64 (aether#3023, fixed in Aether PR #3019).
  • aether-ui 6890549f warns -Wformat-truncation (aether-ui#220).

Closes #833. Part of #827, #828, #825 and #790.

…he pelvis for reach, steps set down on their place (#827, #828)

Four causes of a toe sliding on the ground in a plant, found going to a
spot five ways (tests/test_go_to.ae), each with a check that failed
without its fix:

- core.quat_from_to took turns under 0.08 degrees for none (a dot over
  0.999999). The leg solve's last aim is such a turn: a running leg was
  aimed up to 1.2 mm off its target every other frame, and its locked
  foot slid 8.6 mm a step. The half-way form it uses is exact for small
  turns (test_gmath).
- ik.solve_two_bone measured the knee's bend without its side. A knee
  the clip overstraightens behind the hip-ankle line was turned as if on
  the pole's side, bent further backwards, and left its ankle short of a
  target just under the leg's reach (test_ik).
- ae3d.feet lowered the pelvis only for the ground's height. A foot held
  where it was set while the body went on past it, braking from a run
  most, was out of the leg's reach by 4 to 8.6 mm; now the pelvis comes
  down for that too (reach_drop), by REACH_DROP at most.
- ae3d.feet's own steps followed the clip's place down, and that place
  goes on with the body turning on the spot: the foot came down going
  7.5 mm a frame. Over its place it now comes straight down there, and
  it is set down on its last frame, not a frame late from its seconds'
  round-off.

test_go_to now holds every way to #825's 5 mm. CI stays on Aether 0.834.0
(a ci.yml line names aether#3023 and aether-ui#220).
…height (closes #833)

The seated key was set down so the lowest drawn flesh of the pelvis and
thighs within half a thigh of the seat's point was at the seat's height.
On a round log that flesh is the thighs over the log's sides, where the
wood is lower, and the buttocks over its top stayed in the air: 6.6 and
8.5 cm on Siltreach's people, 2.1 mm on the box man on a round log with
its top 0.6 m up.

Now the seat's surface is sampled once a sit, 15 by 15 rays down onto the
static world over the flesh looked for on it (seat_surface), and the key
is set down by the nearest gap between each point of the pelvis's and
thighs' flesh and the surface under it (seat_gap), through
skin.skeleton_bone_points_near and physics.ragdoll_flesh_points. On a flat
seat the two agree; flesh past a seat's edge no longer counts.

test_sit sits the box man on a squared log 0.4 m high and on a round one,
both held to a millimetre: the round one rests 0.26 mm into it, and fails
without the fix. Its pop check is held at 8 degrees on that high seat,
where main turns a body 7.6 in a step (#834).
…n; inflate's dead return

Its planted feet held where they landed now (the pelvis lowered for their
reach, #828), the box man stops with its feet a stride apart and steps to
its stance, landing 1.08 s after the stop and standing on through three
seconds. On main the planted foot gave as the body braked over it, its
toe drifting 3.8 mm stopping, and it stood at a second.

inflate's huffman_block ended with a `return true` after a `while true`
that only leaves by returning: unreachable, as the next Aether's W1002
finds (aether#3026).
@nicolas-maman nicolas-maman changed the title Planted feet that stay planted: exact small turns, the knee's side, the pelvis for reach, steps set down on their place Planted feet that stay planted, and a sitter that rests on a round seat Oct 20, 2026
@nicolas-maman
nicolas-maman merged commit 8e4f260 into main Oct 20, 2026
18 of 20 checks passed
@nicolas-maman
nicolas-maman deleted the feat/motion-feet-exact branch October 20, 2026 18:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

sit: on a round log the buttocks stay up to 8.5 cm in the air (set down against one height, not the seat's surface)

1 participant