Skip to content

Sit on a seat, stand up, lie down and get up (#825); planted limbs keep their spots through a way's last stage - #826

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

nicolas-maman merged 3 commits into
mainfrom
feat/motion-actions

Conversation

@nicolas-maman

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

Copy link
Copy Markdown
Collaborator

The first slice of #825 (what a game's day asks of a figure): sitting on a seat and standing up, lying down and getting up. Siltreach asked for these first, after walking, so the camp's day can be shown.

The technique. These are actions at an interaction point, as GTA V's scenario points and Unreal's Smart Objects are: a seat or a bedroll, and the way the figure faces there. The way down and back up is keyed and planned on its contacts, as the get-up already is: each key puts the trunk where the planted feet, hands or seat can hold it, and each limb is solved to its contact every step. The bodies follow the keys through the anchors, so a seat holds them. A game with a clip for the action (Siltreach's mocap) can later give the clip instead, warped to the same point.

The API (engine-level, any figure):

  • motion.sit(body, seat, facing) and motion.stand_up(body). The keys follow a person's sit-to-stand (Schenkman et al. 1990, flexion, momentum transfer, extension) run down and back up. The sitter is set down by its own pelvis and thigh capsules on the seat's top. sit_spot(body, seat, facing) says where to stand so the shins come out upright.
  • motion.lie_down(body, head): squat over the feet, sit back on the hands, lie back flat. That is the face-up get-up run the other way. get_up(body) rises from it and ends in the mode it lay down from. lie_spot(body, middle, head) says where to stand over a bedroll.
  • A new mode, ACTING (acting, sitting, seated, lying_down), got to as GETTING_UP is.

Measured on the box man with feet of its own, against #825's numbers (tests/test_sit.ae, tests/test_lie.ae):

measured #825
sat, the drawn pelvis and thighs over the log's top, all the while 0.00 cm 3 cm
toes sliding along the ground, sitting / standing 3.1 / 3.8 mm 5 mm
worst turn of any body in a step, sit and stand 2.9° no pop (6°, as test_get_up)
lying, past the bedroll's edge / the drawn figure's lowest flesh off its top 0 / 0.00 cm 0 / 1 cm
up from lying 3.25 s 4 s
worst turn in a step, lying down and up 5.5° 6°

Resting on what is drawn (after the owner saw a figure sit in the air). A figure acting is drawn from its keys, and the keys were set down by the physics capsules, which are fitted round the bones and thicker than the flesh. The box man's drawn thighs rested 1.35 cm over the log and Siltreach's figures' about 1.2 cm, and a lying figure's heels and hands were drawn 1.36 cm into the bedroll.

  • skin.skeleton_bone_extreme_near (wrapped by physics.ragdoll_flesh_lowest): a bone's flesh farthest along a way, within a radius of a point.
  • sit sets the seated key down by the drawn flesh of the pelvis and thighs over the seat: within half a thigh of its point, so not the knees past its edge, in three passes as the thighs turn about the knees. On Siltreach's drifter the drawn pelvis and thighs end 0.0 to 0.25 mm off the seat.
  • lie_down lifts its whole lying key, limbs and all, by the lowest of its drawn flesh.
  • physics.ragdoll_pass: the pelvis and thighs pass through the seat's body while the figure sits (filter joints). GTA's scenarios and Unreal's Smart Objects drop a sitter's collision with its seat for the same reason: without it the anchors pressed the thicker capsules into the seat, and the feet slid 12 mm sitting down and 21 mm standing up. physics.StaticRayHit names the body it met, and set_mode ends the pass and the planted feet along with the action.

Fixed on the way, for every keyed way (get-ups included):

  • A stage into the animation's pose eased every limb onto its world turns while the trunk was still moving. A planted limb's end left its spot by 65 mm mid-stage. A limb whose end stays on its spot from key to key now takes only what its IK solve at the key is short of the key (3° of swing, up to 3° of twist), in each bone's own frame, so its end stays put. A moving limb (a foot stepped up, an arm swung) is still eased in the world, which carries a stepping foot's facing round. Solved alone, a foot stepped up from kneeling turned its knee through the side, 67° off the hips' facing. A last key planned on contacts isn't eased at all.
  • A planted foot keeps the turn it stands with. Set flat to face the way, a sitter's feet swept 40 mm round their ankles.
  • A planted foot's anchor holds it at 30 Hz (physics.ragdoll_plant, PuppetMaster's pin weight on a planted foot). At the anchors' 5 Hz, standing up pushed the feet 5.3 mm.
  • A lying key's limbs must be ones the body can take. The elbows bent toward the sky were drawn 69° past their hinges, and the feet 90° up at an ankle that bends 35. Both jumped when the get-up began from where the bodies lay.

Tested locally (Windows):

  • on Aether 0.834: all 251 programs ci.sh builds compile without a warning, and the motion gate (34 suites) plus test_sit, test_lie and test_physics all pass, before and after the drawn-flesh change (37 of 37);
  • the plaza scorecard against main (20, 24 and 28 walkers, seeds 1 to 4, 60 s each) is identical to the last digit on all twelve runs. A struck walker's get-up moves its feet from their planted spots to the animation's stance in the last stage, more than the 2 cm a planted limb may, so those limbs keep the world-space ease; the seat pass, the flesh set-down and the planted feet's pin touch only sitting and lying.

CI moves to Aether 0.834.0 (0.833's branch type joins, and a bare ptr given to a string local an error).

Part of #825 and #790.

Actions at an interaction point, as GTA V's scenario points and Unreal's
Smart Objects are, keyed and planned on their contacts as the way up from
the ground is:
- motion.sit(body, seat, facing) and stand_up(body), keyed on a person's
  sit-to-stand (Schenkman et al. 1990), the sitter set down by its own pelvis
  and thigh capsules on the seat; sit_spot says where to stand.
- motion.lie_down(body, head): squat, sit back on the hands, lie back, the
  face-up way up run the other way; get_up rises from it to the mode it lay
  down from; lie_spot says where to stand over a bedroll.
- A new mode ACTING (acting, sitting, seated, lying_down), got to as
  GETTING_UP is.

Found measuring them, and fixed for every keyed way:
- A stage into the animation's pose eased the limbs onto its turns in the
  world while the trunk was still moving: a planted limb's end left its spot
  by 65 mm mid-stage. A planted limb (its end on one spot from key to key)
  now takes what its solve at the key is short of it, in each bone's own
  frame; a moving one is still eased in the world, which carries a stepping
  foot's facing round. A last key planned on contacts is not eased at all.
- A planted foot keeps the turn it stands with (it swept 40 mm round its
  ankle when set flat to face the way), and its anchor is held at 30 Hz
  while planted (physics.ragdoll_plant, PuppetMaster's pin weight).
- A lying key's limbs are ones the body can take: elbows out on the ground,
  not 69 degrees past their hinges toward the sky; feet carried by the lying
  shins, not 90 degrees up at a 35 degree ankle.

physics: ragdoll_plant and ragdoll_pose_bone_lowest.

tests/test_sit.ae (8 checks) and tests/test_lie.ae (6) hold them to the
numbers #825 judges them by: on the seat within 3 cm, toes sliding under
5 mm, no body turning over 6 degrees a step, on the bedroll and no more than
1 cm under it, up within 4 s, upright after.
@nicolas-maman

Copy link
Copy Markdown
Collaborator Author

The owner watched it sit: one figure sits in the air, the other almost on the seat. "Pretty good but not there." The table above measures the bodies (pelvis and thigh capsules within 0.04 cm of the log's top); what has to touch the seat is the figure as drawn. #825's 3 cm is meant for what a player sees: the drawn mesh's lowest point under the pelvis and thighs against the seat's top, both figures, every step from seated until standing up begins. Worth a check of where the gap opens, e.g. capsule radius against the mesh's flesh at the buttocks, the drawn pelvis off its body (the handover's offset), or the seat drawn off its collider.

…rawn flesh (#825)

The owner watched the sitting: one figure sat in the air. The keys were set
down by the physics capsules, fitted round the bones and thicker than the
flesh, and a figure acting is drawn from its keys: the box man's drawn thighs
rested 1.35 cm over the log, Siltreach's people's about 1.2 cm, and a lying
figure's heels and hands, placed by their joints, were drawn 1.36 cm into
the bedroll.

- skin.skeleton_bone_extreme_near: a bone's flesh farthest along a way,
  within a radius of a point (what rests on a support there);
  physics.ragdoll_flesh_lowest wraps it for a ragdoll bone's rig bone.
- sit sets its seated key down by the drawn flesh of the pelvis and thighs
  over the seat (within half a thigh of its point: not the knees past its
  edge), in three passes as the thighs turn about the knees; lie_down lifts
  its whole lying key, limbs and all, by the lowest of its drawn flesh.
- physics.ragdoll_pass: the pelvis and thighs pass through the seat's body
  while the figure sits (filter joints, as GTA's scenarios and Unreal's Smart
  Objects drop a sitter's collision with its seat): the capsules met the seat
  under the drawn flesh, the anchors pressed them in, and the feet slid 12 mm
  sitting down and 21 standing up. physics.StaticRayHit names the body met.
  set_mode ends the pass and the planted feet with the action.

test_sit: the drawn pelvis and thighs within 1 cm of the log all the while
(1.33 cm without the fix); test_lie: the drawn figure's lowest flesh within
1 cm of the bedroll's top (1.36 cm into it without). Drifter, Siltreach's
figure: its drawn pelvis and thighs 0.0 to 0.25 mm off the seat.
@nicolas-maman
nicolas-maman merged commit d2edbdc into main Oct 20, 2026
10 checks passed
@nicolas-maman
nicolas-maman deleted the feat/motion-actions branch October 20, 2026 02:17
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.

1 participant