Repository navigation
Motion, continued: every open motion issue, in full - #939
Open
nicolas-maman wants to merge 237 commits into
Open
nicolas-maman wants to merge 237 commits into
nicolas-maman wants to merge 237 commits into
Conversation
…er it (#934) The ground under a foot was the first standable surface down from 0.6 m over it, so whatever hung over a foot within that was its ground. A figure stood with its heels 6 cm under a bench's edge (its underside 10 cm up) stood with its heels on the bench, 45 cm up; as a heel rose into the underside walking off, it took the bench's top for its ground and its right leg turned 74 rad/s (29 walking off the open floor). physics.ground_below reads the ground as a foot does: down from just under the underside of whatever is over the point (or from 0.6 m over it), the first surface a foot can stand on. A point that came into a solid from under it (the solid over a gap a foot fits in, 5 cm or more between its underside and the ground under it, and the point nearer that underside than the solid's top: a heel risen into a bench or a log's rounded flank) stands on what is under the solid. One pressed into a solid from over it (a sole a clip has in a ramp or a tread) or inside one resting on the ground (a step's riser a toe comes to, a block set under a foot) stands on its top, as before; read as come in from under it, test_humanoid's soles in its 20 degree ramp, a slab with room under its high end, were drawn 532 mm into it. An underside counts as over a point only with that room under it: a block's bottom flush on the floor over a sole at the floor's top is the block resting there, read from over it (taken as an overhang, test_anim_pipeline's foot over a block set under it read the floor under the block while its soles stood on the block's top, jumped 10 cm onto it in a frame and bent its toes 80 degrees; eased onto it as before, 4.4 degrees a step at the most). ikrig and the meter read the ground through it, and the meter how far a sole is in a solid as the shorter way out, up or down (static_depth): a heel risen 3 mm into the bench's underside read 347 mm, the depth to the bench's top. A point is in a solid only 1 mm or more under its surface (INSIDE_SKIN): one on it reads either way as a ray's rounding falls, and a heel standing on test_humanoid's floor read 600 mm into it. feet_reset forgets the toes' speed and the swing's clearance: read from where a moved figure's toe stood before, its speed raised a clearance and looked ahead for an edge as if it had swung there in a frame. test_feet_overhang: the mannequin standing with its heels under a bench's edge, then walking off: its heels on the floor (9.5 mm), no sole more than 3.0 mm into the bench, its fastest joint 29.4 rad/s as off the open floor. test_ground_queries: under the bench the ground is the floor (0.45 read from over it), risen into it from under it too; inside a step, and at the floor's top under it, the step's top; 1 cm into a ramp's top over room under it, the ramp. test_humanoid's stairs and ramp read as on 61964ad (a planted toe 1.6 and 4.5 mm, no sole into them). Part of #934
Aether 0.880.0 removes contrib.host.lua, which ae3d does not import, and 0.871 reads s[i] on a string as a checked int from 0 to 255 and compiles in time linear in a program's size again (aether#3499). All 311 programs ci.sh builds and the editor (against aether-ui 51d1ae75, AETHER_UI_REF) compile on it without an error or a warning; aephysics ad0cae2, its main, builds on it.
…e9fa15) The editor was checked on 0.880 against 51d1ae75 before main moved AETHER_UI_REF to 58e9fa15 (#924); CI's linux-editor builds it on 0.880 against 58e9fa15, warning-free.
…less slots (#940, #942, #944, #949) Four gaps Siltreach met moving its people onto ae3d.character: - character.physical(c) (#940): the figure's ragdoll (ae3d.physanim) put on it now rather than at its first blow, its bodies following the animation. Put on at the first blow alone, an unhurt person had no bodies, and ae3d.items' edge, which meets only moving bodies, passed through it. test_items: a person standing where a sword's edge passes, unhurt, is not hit (no bodies); made physical, it is hit once on its ragdoll. character.hit puts the bodies on through it as before. - character.pause(c), resume(c, at, facing), paused(c) (#942): held by something else (ae3d.motion's fall and get-up, a cutscene), the character leaves its object, mover and capsule alone and asks for no look or aim; resumed, the object is put where the body was left, the mover settled on it at rest and the feet planted afresh. Stepped on through it, a mover walked its object on at the last speed asked, under the body a fall held. test_character_pause: paused a second while asked to walk on, the object moves 0 mm; resumed 3 m aside facing back, it stands there (0 cm, 0 degrees) and walks 3.1 m in 3 s, a toe skating 2.1 mm. - Takes shared (#944): the gaits make a figure file's 14 takes (the stand, the eight gaits and mirrors, the starts and stops and their mirrors) once, keep them, and every character of that figure shares them (animator.share_take), the first one too. Each character read and retargeted every capture again, a camp of 20 settlers 20 times. test_character_share: 20 mannequins on one set of gaits play the same takes; the first is made in 227 ms, the others in 72 ms each; the first and the twentieth asked alike stay within 6e-8 rad of each other for 3 s, and with the first freed the others walk on alike. The gaits are freed after the characters on them, as every caller already did. - A slot that names no takes (#949) is held as it is reached, facing its way, until the figure leaves; it was refused, so a bedroll with no lie-down takes could not even be claimed and walked to. tests/fixtures/usable/spot.usable; test_use: from eight ways 3 m off, 1.1 cm off the approach point and 9.6 degrees off its way at the most, held until it left, a toe skating 0.57 mm while held. Walking there and turning, a toe skates 11.9 mm, as it does for every slot (#952). Part of #940 Part of #942 Part of #944 Part of #949
character.humanoid and graphed take a `scale` (1 by default): the figure's object is scaled so before its animator, gaits, feet and capsule are made from it, so all of them are at that size. Made at its file's size and scaled after, a figure kept a capsule and gaits for the size it was made at (Siltreach's people, scaled to 1.75 m). The capsule's radius and the room over its head scale with it; the gaits keep a figure file's takes per scale (the same file at another size is another set). physics.character_height and character_radius say a capsule's size. test_character_scale: the UE5 mannequin at 0.9 and 1.1 of its size, walking at 1.2 m/s: its capsule 0.9 and 1.1 of its own, tall and round; its drawn head 0.900 and 1.100 as high; a toe skating 1.6 and 1.9 mm. Part of #943
A slot's take line can name the file it is read from, as an animgraph's `take x Y from file` does: `enter Interact from people/ual1.glb`. Named by name alone, a slot's takes came from the figure's own file or the one character.use_takes gives, so a camp's people could not take UAL1's Sitting and UAL2's Consume both. A take from a file is retargeted onto the figure as use_takes' are, kept by file and name. A slot that names no enter plays its loop where it holds the figure, if it names one (#949). test_use_files: the UE5 mannequin, whose own takes are UAL2's, at a workbench whose Interact and Idle_Loop are read from UAL1's file: its right hand on the tool's grip at the contact (1e-14 cm); at a chopping block naming no enter, its own TreeChopping_Loop played there, held until it leaves, a toe skating 0.28 mm. test_use as before. Part of #950 Part of #949
… comes down on its heading (#953, #954) play_at and the matcher inertialized from the pose drawn last frame, its lift and feet already on it, and the lift was laid on again: the drawn pelvis moved 28.7 cm in a frame at a slot's take switches (Siltreach: 15 to 18 cm on a 0.38 m log). They ease out of the graph's own pose now, kept before the layers, aims, lift and feet go on, as UE5 inertializes ahead of its foot placement: 2.5 cm at the most. A stepping foot came down on the clip's heading after its travel ended, its toe swinging round the held ankle on the floor (9 mm, a fade's 2.5 degrees). It comes down on the heading it got to and is locked on it. test_use: the drawn pelvis never moves 3 cm in a frame sitting on and standing up from each seat.
…s takes listed; a reach from a point (#955, #957) physanim dressed its ragdoll in place, which never weighed it, and a kinematic body reads no mass: the UE5 mannequin's bodies weighed 34.3 kg, Siltreach's people 38.5. attach weighs them as physics.person_mass of the figure's height, character.physical as its standing height's, and physanim.set_mass gives a game's own; ragdoll_mass and ragdoll_set_mass weigh a body by its shapes, kinematic or not (69.7 kg; set to 80, 80). animator.state_count, state_take_count and state_take_at list every take every state plays, and metrics.animator_fastest reads the fastest joint turn over them: 23.9 rad/s over the mannequin's 14 takes, against the 16.3 a game could read off the stand and the first gait. physics.character_reach_from casts the capsule from a point, as a move from there meets the world and the solid characters: within 0 m of the reach stood there from five points four ways (test_character_reach).
…uches (#932, #952) A stop's last step put its take's sole under the floor through the end of its swing, and marked the foot down only 55 ms after it touched: left to the clip till then, the drawn foot overshot and slid back 12 mm into its lock, every walk to a slot (test_use's spot, 10.2 mm) and a seat's landings at a fade's start (4.95 mm). A foot whose take has its sole on the floor it was taken on, drawn within TOUCH of its ground and slowing, lands there and is held until the take has it down or lifts it clear. A take that sets its foot down above its floor lands on its own contact: landed early on its heel, a toe swung 5.3 mm along a 20 degree ramp. test_use: seats 1.18 mm (4.95); the walk to a slot 7.6 mm, its start's creep (#932's second half) now its worst. test_humanoid: as before.
…tay on the haft (#959) A held hand's fingers closed each frame onto the first touch alone: a thumb whose arc ran along a haft opened a quarter of a fist in a frame for 4 mm of the hand's play, an index that could not reach shut to a fist, and the fingers turned 23.5 rad/s through a walk (96 on Siltreach's people). Each now closes from last frame's no faster than the captures' own fingers turn (WRAP_RATE, 9 rad/s), and one out of reach rests where it comes nearest the handle. The handle's line was fitted to the second hand of the heaviest take of a blend: a stopping figure's blend went from its run to its walk, the line jumped, and the hand was 9.9 mm off its grip. It is fitted to the graph's own pose (animator.pose_graph), every take of the blend. test_items: held two-handed through a walk, a run and a stop, a finger turns 7.6 rad/s at most (the takes' own 9.1), the second hand 0 mm off.
… and head (#960) A character aiming looks at its target too, and the look, solved after the trunk's aim, turned the aimed chest by a fifth of the head's remaining turn: the rifleman's barrel went 4.79 degrees off its target as it looked (Siltreach's pistol 4.2). The look's spine share is now what the aim leaves (ikrig.look_spine, 1 less the aim's weight), as UE's look-at goes on the neck and head over an aim offset: 0.15 degrees, as aimed alone.
…it (#932, #952) A locked foot moved its lock from its heel to its toe only when the take planted its ball. A start's foot rolled onto its toe, its heel 3.8 cm up, its plant never said so, and its toe slid 6 mm forward about the heel. It goes onto its toe as well once the clip lifts its heel TOE_FIRST over the toe's tip. test_use: walking to a slot and turning, a toe skates 3.7 mm at most (7.6 before, 10.2 before the landing hold). test_humanoid, test_anim_pipeline, test_crowd_feet: as before.
…tops (#961, #930) The mover braked at the stop take's deceleration from any speed: a walk stop's 0.41 m/s^2 left a figure let go from a 3 m/s run going 1.35 m/s four seconds on. A stop serves the speeds about its own (clips.braking_speed, a quarter over): faster, the springs slow it to them through its gaits first (mover.set_braking_below), and the stop is played from there. tests/test_stop_settle (#930): let go from a walk or a run, at rest within 4 s (1.9 and 2.2); at rest no foot moves 5 mm in a frame; no toe skates 5 mm.
… to its own item (#959) Siltreach's play station sheathed its two-handed axe and drew a pistol in one frame: the second hand flew off the haft at 34 m/s (44.9 in test_items). Two causes: a one-handed item let the other hand go every frame, whoever held it, and a hand was let go toward the world's origin while its weight eased out. An item now moves only the hands it holds, and lets one go eased off where it holds it, its fingers round the handle till it is off: 0.43 m/s. Held through a stop, whose take hangs its arms apart, the haft's line put its second grip 15 cm past the second arm's reach, the hand 7 cm off it. The line now turns about the main grip the least that brings the second grip within reach (SOFT_REACH of the arm): 0 mm. test_items: 13 checks; held two-handed through a walk, a run and a stop, the second hand 0 mm off its grip, a finger 7.6 rad/s at most.
…e capsule (#958) A game played a knock-down, a get-up or any one-off take by pausing the character, turning root motion on, playing a state and resuming it at the object's place, and had to get that order right itself. character.act(c, state, blend) plays a state once, its root motion moving the figure through its capsule (a wall stops it), the mover left alone whatever is asked; at its end, at act_stop or once the graph leaves the state, it takes up its stand where it got to, the mover settled there: as UE's PlayAnimMontage on a Character. acting(c) says whether it still plays. tests/test_character_act: UAL2's Hit_Knockback_RM moves the mannequin its take's 3 m (within 1 cm); a wall behind it stops it at its capsule's radius; knocked down and got up by LayToIdle, it stands, a toe skating 2.8 mm; ended part way, it walks on asked.
…932) A foot held where it touched, ahead of its take's contact, kept the take's sole height: Siltreach's walk to a log's slot stood a sole 95 mm into the floor. Its sole is laid on the ground while it is held (soles and tilts down). test_use, test_humanoid, test_anim_pipeline: as before.
…963) skeleton_clip_limb named the cut's joints by their places in the skeleton passed, on every primitive: a figure whose eyes, brows and hair are skinned apart, each skin's joints in its own order, had its head cut for its left arm (Siltreach's MPFB drifter). It names the places, in the skin the mesh is posed by, of the bone named and every bone below it. tests/test_skin: the elbow's cut through one skin names the elbow and the wrist of a mesh posed by another skin of the same bones in another order.
A knock-down lies for a while before its get-up: a snapshot of where the body fell (animator.snapshot) is a state with no take, and act refused it. It is held now until act_stop or the next act, so knocked down, out and up again are three acts (Siltreach). test_character_act: lying a second held where it fell, then up by LayToIdle.
…932) A foot locked on its toe's tip, its toes bent to the ground, was put back over its lock by one more solve of its leg: the leg solved again turned the foot a little, and a toe rolling off a 20 degree ramp, 3 to 6 cm off its lock after its bend, was left up to 5 mm off it. It is put back until within TIP_HELD (0.5 mm), in at most TIP_PASSES (4) solves. test_humanoid: over the ramp a planted toe slides 2.9 mm at the most (4.5 before); the rest as before.
seal_loop refused a take any of whose joints ended more than LOOP_GAP (10 degrees) off where it began, and left every joint unsealed: five of 100STYLE's six gait loops wrapped with a seam (0.2 to 0.4 rad at an arm, the head, a foot or a toe), and the forward run's hands jumped 5 cm at it. Held two-handed through a run, an axe's second arm turned 77 rad/s there. loop_cut's loops are sealed whatever the gap (crop_sealed, seal_within); other loops keep LOOP_GAP. Spreading a leg's gap over its foot's swing alone, tried for the ramp, moved the swing a matcher searches by and slid a matched walk's toe 124 mm; spread over the loop it does not. test_items: held two-handed through a walk, a run and a stop, no arm joint turns faster than the takes' own fastest (26.1 rad/s, the takes' 30.2). test_anim_pipeline's matcher: the fastest joint 17.8 rad/s (24.9). test_humanoid's ramp 3.8 mm.
…s real time (CLOCK_MOST), as UE5's distance matching clamps its play rate; transition_need kept in the animator's state (#937)
…n off and walked back: within 1.5 times real time, no joint faster than the takes' own plus the easing's need, no toe skating 5 mm (#937)
…tes, each palm within 5 mm of its grip (#931)
… not lifted; the stagger sways again (#1000) The feet drawn off pose_now with every leg body at weight 0 were not a stale animation pose: the calves read back exactly, and the mannequin's 12-body ragdoll has no foot body for capture_animation to keep. pose_rig_from's toe_on_ground turned the drawn ankle up wherever the drawn toe dipped under the ground plus TOE_UP, which a walk's roll-off does, so any physanim drawing (a hit's chain on the trunk) turned the animation's planted foot by up to 0.116 rad and its toe slid 10 mm. ragdoll_show_pose takes per-side toes; physanim lifts a side's toe only where that leg or the pelvis is drawn off its bodies. character.shove sways the struck bodies with STAGGER_SWAY of the blow again; test_balance holds the legs on the animation drawn as the graph has them, toe skating under 5 mm (2.93 mm), and the joints within the gaits' own plus the sway's share and easing.
#999) geometry.mesh_world_bounds returns a mesh's world bounding sphere at a transform and writes nothing but the mesh's own bounds the first time; mesh_local_bounds reads those. The mesh's world fields, mesh_compute_bounds and mesh_bound_x/y/z/radius are gone: written into a mesh every figure on it shares (core.model_share_mesh), two figures bounding on the job pool would each have read the other's. Their callers, core's model_recalculate_bounds and vulkan's figure_reach, keep what it returns. model_share_mesh works the shared mesh's own bounds out as it shares it, local_bounds marks them known only once written, and a clone takes its source's own bounds. Found on the way: mesh_set_pos left the mesh's own bounds where its vertices had been; now they are worked out again. tests/test_shared_bounds: two models on one 60,000-vertex mesh, placed, scaled and turned apart, updated from two jobs at once 2,000 times: 0 bounds not their own transform's to the bit, 0 of 16,000 values differ run to run. test_geometry checks a vertex moved in place.
…es' rifle needed on macOS's leaks
… one call
The plaza's box men on ae3d.locomotion, ae3d.feet, ae3d.lookat and their
POWERED motion ragdolls are now the UE5 mannequin made a character
(character.humanoid on 100STYLE's neutral gaits), its capsule solid, its
bodies on it from the start (character.physical). The car's strike is
test_knockdowns': the character and its animator paused, its physanim
bodies released to ae3d.motion LIMP, the car meeting them; at rest
(motion.down) it gets up with character.get_up(c, m, 0.4), stands 0.4 s
and walks on. The scene, layout, car, lanes, camera and report lines are
kept; the walking crowd is metered by ae3d.metrics as people_plaza is
(toe skate, feet crossing, fastest joint, FOOT_THROW) and the get-ups
against their take's own fastest joint. Retired from the tool: the parked
ragdolls and their waking, the look's own module, motion matching on the
box man, the flat-floor feet and the box man's toe thresholds. A stance
is now a foot locked by ikrig with its pad within metrics.CONTACT, its
toe tip measured; the knee's hinge is taken from the way the figure
faces (the box man faced -z, the mannequin +z).
Seeds 2, 4, 5, 4800 steps at AE3D_TICK=60, before (box men) and after:
stances, toe slid mean / most / over 1 cm:
2: 3667, 0.064 cm / 9.31 / 77 -> 2802, 0.010 cm / 3.16 / 5
4: 3687, 0.074 cm / 10.0 / 86 -> 2812, 0.024 cm / 2.59 / 10
5: 3673, 0.053 cm / 8.56 / 63 -> 2662, 0.016 cm / 2.22 / 8
struck, walking again, s struck to walking:
2: 30, 30, 5.94 -> 8, 8, 3.64
4: 28, 25, 6.44 -> 32, 30, 3.59
5: 26, 25, 6.79 -> 19, 15, 3.61
frame, mean ms: 6.9 -> 9.7, 9.8, 15.7
heads spinning s: 0.32, 0.60, 0.92 -> 0.47, 1.67, 0.78
legs splayed s: 0.40, 0.52, 0.30 -> 0.57, 3.63, 9.90
in the car s: 0.25, 0.75, 0.08 -> 0.15, 0.23, 0.10
sunk s: 0.07, 0.07, 0.07 -> 0, 0, 0
bodies walked through s: 2.02, 0.02, 0 -> 0.17, 0.03, 0
metrics, walking (new only): toe skate 29.7 / 37.9 / 48.1 mm at worst,
feet crossed 263 / 242 / 282 mm, fastest joint 112 / 165 / 121 rad/s
(takes' own 27.9), FOOT_THROW 7.4 / 19.8 / 8.0 m/s.
Part of #860
The scene's ramp was tilted the wrong way and its steps stood in the wrong order: the ramp's high end stood 0.5 m over the floor facing the plaza, and the steps' 0.45 m riser faced it, the 0.15 m one against the deck's 0.6, where the comments have a ramp up to the deck and steps down from its side. Both were walls the crowd walked into (#977). The ramp now rises from under the floor at z -0.6 to 0.5 m at the deck, and the steps rise 0.15 m each to the deck's side. AE3D_TRACE=k prints person k step by step while it walks: its meter's reading, each foot's ikrig target and lock, and the ground under its heel, pad and toe. Seeds 2 / 4 / 5, 4800 steps at AE3D_TICK=60, with the mover and ikrig changes (before: ee1e2116): sole into the ground: 104 / 167 / 128 mm (583 / 600 / 599); feet crossed: 209 / 174 / 163 mm (263 / 242 / 282); fastest joint: 148 / 89 / 132 rad/s (112 / 165 / 121); toe thrown: 5.8 / 7.0 / 6.8 m/s (7.4 / 19.8 / 8.0); toe skate: 14.6 / 100 / 96 mm (29.7 / 37.9 / 48.1); struck, walking again: 6, 5 / 33, 31 / 24, 23. #977's bounds (crossing under 5 mm, throw under 1.5 m/s, sole under 5 mm) are not met yet on the plaza. Part of #977
… over it The plaza's car flew off with a dummy (#982), on seeds 2 and 5 of ten (4,800 steps): 12 m up at 15.7 m/s, 45 m/s level. Traced step by step, both the same: a struck person got up beside or under the car where it stood. Its capsule, stood up into the car's box, was pushed out by the mover 0.85 m (seed 5) and 1.3 m (seed 2) in one step; physanim's kinematic hips and legs, driven onto the rig at the speed that takes, went after it at 48 and 75 m/s with no mass to give, and hit the car's wheels and box. Not aephysics: its contact push-out is capped at 3 m/s; a kinematic body asked to move 1.3 m in a step moves so. - physics: a figure whose kinematic pelvis is farther from its rig than KINEMATIC_TELEPORT (20 m/s) goes in a step was put somewhere, not moved: every body and anchor is put on the rig at once and still (put_on_rig), a limp one carried with the pelvis, as Unreal teleports the bodies on a teleport move. capsule_room: whether a capsule stood at a place is clear of every body that moves but the figures', asked as an overlap at any depth (the mover's planes end once the axis is inside a box). - character: one wait for a get-up, merged with #835's way scoring. A figure told to get up (get_up) lies on by itself while something that moves, not a figure, stands where it would stand up (room_to_rise: its capsule 0.25 m wider on the ground under the pelvis), as it does while its way is not clear: get_up_waiting says so, and it looks again every WAIT_LOOK (up_wait). With no room at all it waits past WAIT_MOST, for as long as the car stands there (up_blocked). The waiting setup is one function (up_wait_set) for both. test_car_over_body (new), the plaza's car (1.2 t on sprung wheels) and the mannequin knocked down LIMP, 8 seeds; before / after: put 1.3 m past a 200 kg crate in a step: the crate 6.1 / 0.004 m/s, a body up 18.4 / 0.84 m/s; run over at 7 m/s and braked over the body: car up 0.74 / 0.74 m/s, a body up 2.8 / 2.8 m/s (no change); got up under it, told once: the car lifted 0.65 / 0.08 m, a body up 12.7 / 4.9 m/s; get_up_waiting holds on 8 of 8 seeds while the car stands, and all 8 are up once it is gone. Part of #982
steer skipped a paused character, so walkers walked through a person lying struck (#979). A character paused with its ragdoll let go to another writer (physanim.released: a fall) is now its bodies on the ground: each body's capsule, its two ends and its middle (physics.ragdoll_bone_segment), a neighbour standing still as wide as the capsule, the body met when any of them is, and the meeting counted once per body. A body lying turns no way, so its meeting is read against the walker's own way (not RVO's 2v - v_mine - v_theirs) and weighs twice a person's share: at a person's share the turn to clear a body lying along the way cost more than the meeting until the walker was already in it, and it walked through the body unturned. test_walk_round_body (new): the mannequin knocked down LIMP 3 m ahead of another asked to walk straight on at 1.2 m/s, 16 seeds; before / after: the walker's capsule kept -0.265 / +0.063 m off the lying bodies' capsules at least (32 seeds after: +0.063); got past it, 1.5 m beyond: 3.28 / 3.59 m at least. Part of #979
- A struck person asked to get up while the car stands over it (character.GET_UP_WAIT) lies on and is asked again the next step; handed over regardless, it was put in RISING with no get-up played. - Measured every step and reported (#982): the car's chassis risen over its ride height and its fastest up, any person's body fastest up and highest, and the seconds get-ups waited. AE3D_LAUNCH=1 prints what goes up faster than the car comes (7 m/s): the car, the people within 3 m of it and the fastest's bodies; AE3D_LAUNCH_AT=n prints steps n to n+30 body by body, with the car's wheels. Seeds 0 to 9, 4,800 steps at AE3D_TICK=60, the car's fastest up and its most over its ride height, before (da0b8a11) / after: seed 2: 15.7 m/s, 11.7 m / 2.65 m/s, 0.46 m; seed 5: 15.8 m/s, 12.2 m / 0.76 m/s, 0.02 m; the other eight: under 1.2 m/s and 0.18 m / under 1.5 m/s and 0.21 m, but seed 0, 2.5 m/s and 1.35 m: a struck body squeezed under the braked car off the plaza's edge lifts it (not a get-up; left open). Struck people sunk in the ground: 0 s on seeds 2, 4, 5 (216 / 100 / 0.05 s before). Get-ups waited 1.2 to 8.5 s a seed for the car. Part of #982
Traced on the plaza (#977, AE3D_FLAG), the worst crossed feet were walkers shouldered by a neighbour's capsule, not struck people: seed 5 person 9 went 0.29 m sideways in one step (17.4 m/s) as a person got up where it stood, and its locked feet crossed 235 mm; seed 4 person 0 was shoved at 4.2 m/s and crossed 325 mm. A solid character's move put each near one as a plane at the gap between them, so one found inside another (put there: a get-up, a teleport) was pushed out of the whole overlap in one move. Now the gap each near one had as the move began is kept (gather_near), and a capsule inside another ends the move no deeper, eased out at CHARACTER_PART (0.5 m/s), as a person shouldered steps aside. test_character_walls: two scenes. walking on while a solid capsule is put 0.29 m inside its own beside it: sideways at 17.03 / 0.16 m/s at most (before / after), feet crossed 206.8 / -28.8 mm, a toe thrown past 1.5 m/s / not; walking into a 0.6 m block 27 degrees off square to its face, as the plaza's walkers came to the deck: -7.8 mm crossing, 1.17 m/s thrown (held on both). Part of #977
…p's own feet AE3D_FLAG=1 prints every walking person's step past a crossing (5 mm), a pop (40 rad/s), a throw (1.5 m/s), a skate or a sole into the ground (5 mm): where, its mover's velocity against how fast its capsule really went, the nearest person, and how long since it set off again after a get-up. The trace (AE3D_TRACE=k) gains the mover's velocity and facing, the graph's state and how far the clip's own foot crosses, which told the causes of #977 apart: a wall or a neighbour holding the capsule, not the get-up. Part of #977
…d its contacts AE3D_TRACE=k now prints where the graph's pose has each ankle (the clip's own feet over the ground), the current state's ground speed and each foot's contact weight: what showed seed 2 person 22's clip foot drifting 29 cm off its lock as the blend swung at the deck's face (#977). Part of #977
…977) - physics.ground_below: a point inside a solid that rests on the ground under it is in that one, whatever hanging solid it is also in; and one nearer a hanging solid's side than its underside came in through the side. A sole in a ramp's end sunk into a deck's side was read as under the ramp and dropped 10 cm into the 13 cm lip. - physics.static_way_out: the shortest way out of the static world for a point inside it, up, down or level, through the solids it comes into. - ikrig.off_walls: a foot whose heel, pad or toe would stand in a solid it cannot stand on, its shortest way out level, is moved out of the face, and a locked foot's lock with it. Toes went 167 to 187 mm into the plaza's deck as walkers strode on against it.
…e face it came in by (#977) - ikrig.off_walls moves a sole out only of a solid that goes on up physics.STEP_HEIGHT over it: a slab's side within that is ground the foot comes onto. Moved out of the plaza ramp's side, a foot walking along its edge was put off it and in it by turns, 29 mm in and a calf at 68 rad/s. - It goes out the way it went out last frame while that comes out within WALL_KEEP of the shortest (physics.static_way_along): out of its shortest way alone, a toe in a deck's corner went out of one face, then the other. - physics.ground_below no longer takes a point nearer a hanging solid's side than its underside as come in through the side: off_walls no longer needs it, and it put a walker's sole 6 mm into the ramp's edge. - test_feet_edges measures a toe thrown past its clip too.
, #977) test_get_up_pair went 7.8 cm past its 0.02 m bound once the figure put is put (KINEMATIC_TELEPORT). Traced (AE3D_PAIR_TRACE, the puts printed): the test stands the second figure beside the first's hips, 3.3 m from where it stood. Swept there, its kinematic bodies went at 200 m/s through the first lying body and threw it 2.5 m: in the layout 0.1 m apart turned a quarter the two lay 0.96 m apart, and the case the test sweeps never came about. Put there, they lie 0.50 m apart, one across the other's hips, and every way up of either figure, as laid and at every turn (0, +-0.5, +-1 rad, and tried to +-2 and a half turn), went 0.10 to 0.27 metre-seconds into the other's body. The least went first and drew its hips 7.8 cm into the other. Now a way still into a body near at every turn is laid off the body (up_shift): 0.15, 0.30 and 0.45 m, eight ways round, its pose's distance paying for the shift, the hand-over easing the body there. test_get_up_pair, 18 runs: inside each other 0.167 / 0 s, deepest 77.7 / 0 mm (before / after); waited 1.65 / 1.3 s at most; planning 1.16 / 1.00 ms mean. The test notes how the stand is put and prints where both lie (AE3D_PAIR_TRACE=1). test_knockdowns, test_get_up, test_get_up_feet and test_car_over_body pass.
…, #909) Three scenes walked from eight starts 0.1 m apart, so the capsule is stopped at every point of the stride; the single start the 27 degree scene had passed (-7.8 mm, 1.17 m/s), stopped where the gait's feet happened to be fine. Their worst, today (held to with AE3D_WALLS_ALL=1, not met yet): into a 0.6 m block 27 degrees off square (the plaza's deck, seed 2 persons 22 and 2): a foot 155.7 mm past the hips' middle, a toe thrown 3.77 m/s, 22.8 rad/s; square into it: 54.4 rad/s (the gaits' own 14.7), a toe thrown 6.86 m/s; into a person standing on its driven bodies (#909's embrace, test_pair PAIR_ONLY=3): a foot 174.6 mm past the middle, 37.3 rad/s, a toe thrown 5.68 m/s. The ramp's calf now reads 32.8 rad/s (gated as before). AE3D_WALLS_EACH=1 prints each start, AE3D_WALLS_START=n walks one. Tried and not kept: the graph told it stops when what is asked goes only into the wall it is held against (mover: asking by the asked less the wall, along_wall): square into the block 37.8 rad/s and 2.31 m/s, the person 37.1 rad/s and 11.3 m/s; not a fix at the root. Part of #977
…n bodies (#977, #909) A walker coming to embrace another (#909's test_pair, PAIR_ONLY=3) was stopped mid-stride by the other's arms while its walk played on, a ball turning 38.6 rad/s. A capsule's moves met every shape but its own figure's ragdoll, so a figure standing on its animation was met twice: by its capsule (character_set_solid) and by its kinematic bodies, which reach past the capsule (arms out to embrace) and which no capsule can push. Now, between solid capsules, a body of another figure's ragdoll driven on its animation (its pelvis kinematic, not let go) whose figure has a capsule is passed by the capsule's casts and planes (driven_figure), as Unreal's capsules meet each other and not the other's physics asset. A figure let go (limp, lying) is still a body walked into and pushed; capsules that are not solid still meet the bodies (two figures getting up side by side, met by neither, went 14 cm into each other: test_get_up_pair). test_character_walls, walking into a person standing (its avoidance off, both capsules solid), eight starts over the stride: a foot 174.6 / 1.0 mm past the hips' middle (before / after; held to now), 37.3 / 54.4 rad/s and a toe thrown 5.68 / 6.80 m/s: now met by the capsule as square at a wall, the root still open (held to with AE3D_WALLS_ALL=1). Part of #977
…le steps out Traced on the plaza (#977, AE3D_TRACE with the clip's own feet): seed 2 person 22, held back by the deck's face while its velocity swung to the side and its gait's blend with it, kept its left foot locked 0.67 s while its body went 26 cm left over it. The clip's own left foot drifted 29 cm off the lock (the blend's weights swinging and the facing turning 0.9 rad/s), just under LOCK_SLIP, so the lock never let go: the foot drawn 179 mm past the hips' middle, the clip's own 100 to 214 mm short of it. Now a locked foot is let go as a slip (lock_crossed) when it is drawn past the hips' middle toward the other foot's side while the body itself goes over it sideways (0.1 m/s or faster, by the figure's place over the ground, Feet.going) and the clip keeps that foot on its own side, 2 cm or more further out than the lock. Judged against the clip's own foot: a catwalk's or a run's own crossing is left to the clip, and a side gait's stance foot, which never comes past the middle drawn, is held as the clip has it. Let go, the foot is drawn no further past the middle than the middle itself, as it is let go and through its step (not_past_middle), its step carries it from its first frame, and once down it is held again at once (left to a blend 93 to 97% down it went along the floor with the clip's drift: a toe skated 77 mm beside a neighbour). Tried and not kept: read 0.1 s ahead at the body's rate, the 2D blend's side steps (drawn and clip stance feet 50 to 60 mm apart by the blend's drift alone) were let go 50 mm out and a toe slid 21 to 55 mm; ahead at the rate the drawn foot nears the middle, a walk's hip sway let straight-walk stance feet go 45 to 117 mm out; a foot set down mid-release caught where drawn (088be2b3) broke the start/stop's 5 mm slide (33 mm), and is left out. Functions changed in ikrig: feet_solve (Feet.going from the place it already tracks, the clip's hips' middle and line across them), lock_foot (the let-go test and the immediate re-hold of a crossing slip), slip_step_at (the step's carry and clamp); new: lock_crossed, not_past_middle, cross_slip_set, cross_slipping. test_character_walls: walking ahead at 0.7 m/s while its capsule is moved 0.45 m/s to its left for a second, its mover not told: crossed 225 / 0.0 mm (before / after), a toe thrown 2.93 / 0.80 m/s. Its other six scenes read the same as before. Plaza (AE3D_TICK=60, 4800 steps), seeds 2/4/5, before / after: crossing 179 / 244 / 169 mm -> 111 / 27 / 14 mm thrown 7.2 / 4.8 / 4.3 m/s -> 7.6 / 7.2 / 7.0 m/s skate 3.4 / 114 / - mm -> 139 / 100 / 87 mm people_plaza seeds 0/1/2 (1800 steps): crossing 0.97 / 2.27 / 3.82 mm and skate 2.99 / 3.01 / 2.98 mm, as before. Part of #977
…o edge ahead the figure cannot step onto (#977) Traced in test_character_walls' swept scenes (#977, #909): a walker stopped square at a wall or a person mid-stride, stood in its idle, stepped its feet 0.3 m together in STEP_TIME (0.28 s), 2.3 m/s past the idle's still feet. Now a standing step takes as long as STEP_GAP_SPEED (0.65 m/s) takes to cover its gap when that is longer than STEP_TIME, as a turning step already does by TURN_TOE_SPEED. A swing's look ahead for an edge (foot_ground) takes one only no more than physics.STEP_HEIGHT over the figure's floor: beside the plaza's steps, one foot on a 0.3 m tread and the capsule on the ground, a swing toward the 0.6 m deck's face read the deck's top ahead and lifted the foot 0.58 m in four frames, a calf at 40 rad/s (test_feet_edges' walk 10, the walker coming to the deck slower). Tried and not kept: a release taking as long as 0.6 m/s takes to cover how far it goes (a trailing foot 0.26 m off its clip eased there in 0.15 s, a toe thrown 3.1 m/s): the swept walls' throws fell from 6.86 to 2.18 m/s, but test_items' second swing from a stand skated 7.2 mm and test_use's sits 6.4 mm, the release still easing along the floor after the clip set the foot down. Part of #977
… pipeline, gets up and walks on (#922) The mannequin running at 3.45 m/s at a 0.2 m kerb set 3.0 to 4.0 m ahead. Its legs drawn on the animation pass through what they meet, so the trip is the moment a drawn foot meets the kerb, answered with character.knock and no blow: physanim lets every body go at the velocity the run gives it, the kerb catches the shins and the body goes on. Down, then the planned get-up. Held to test_get_up_kerb's numbers on all nine: it falls and rises, its trunk 0.006 rad off how it stood once its stand is taken up, it moves 0 cm the second after and stands, walks on 3.1 m in three seconds never falling, and ten seconds on stands at its standing height.
…st the take's own (#994) Seed 40 struck 1.3 times as hard with its side turned 0.5 rad: over the 0.4 s turn the forearm turned 2.7 rad and its upper arm 2.3, and the elbow's and the shoulder's lifts (1 and 0.6 rad, each about its own axis) composed with them turned the forearm against the upper arm at 35 rad/s, the turn alone at 13.8, against LayToIdle's own 26.5. plan_slower plays the planned hand-over back at 60 Hz (the take, the turn, the drop and the lifts, from its first moment as get_up draws it) against the take's own fastest; plan_turn lengthens the turn and the drop by the ratio (5% more, up to EASE_MOST) and plans the lifts again. Seed 40 so: 7.96 rad/s under the take's own.
… the hand-over held to the take's own (#994) Two more landings of each seed, struck 1.3 times as hard with the side turned 0.5 rad either way, and the snapshot-to-clip check held over every landing. 500 of 500 up; the worst joint 0.22 rad/s under LayToIdle's own, under the floor 1.06 cm. The test takes 96 s, 61 before.
…'s leaks found it (physics_free releases only the world's own characters)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Every motion issue still open, implemented in full, in this one pull request, continuing #921 (merged at 61964ad): #853 and its milestones, #903, #907, #909 to #911, #922, #929 to #938, #940 to #974. 32 of them are met here and closed by hand so far (listed at the end).
On this branch so far (to 2026-11-04)
physics.ground_belowreads the ground from under whatever hangs over a foot with room for one under it; a foot come into a solid from under it (a heel risen into a bench or a log's rounded flank) stands on what is under it, one pressed into a solid from over it or inside one resting on the ground (a ramp, a tread, a block set under a foot) on its top. A figure stood with its heels under a bench's edge stood on the bench, 45 cm up, and its leg turned 74 rad/s walking off; now its heels are on the floor and its fastest joint is 29.4 rad/s, as off the open floor (test_feet_overhang). The meter reads a sole in a solid as the shorter way out.character.physicalputs the bodies on at once, so an unhurt person standing where a sword's edge passes is hit (character: no ragdoll until its first blow, so a sweep cannot hit an unhurt person #940, test_items);character.pause/resumeleave a held figure alone and put it where the body was left (character: no pause and resume while something else holds the body #942, test_character_pause: 0 mm moved while paused); takes are made once per figure file and shared, 20 mannequins in 227 ms then 72 ms each, all walking alike within 6e-8 rad (character: takes are re-read and retargeted for every character of one figure #944, test_character_share); a slot that names no takes is held as it is reached (usable: a slot needs an enter take, so it cannot be only a claim, an approach and a facing #949, test_use). Walking to any slot and turning skates a toe 11.9 mm: character.use: walking to a slot and turning to its way skates a toe 11.9 mm #952.character.humanoid/graphedtake ascale; at 0.9 and 1.1 the capsule is exactly that share of its own, the head that high, a toe skating 1.6 and 1.9 mm (test_character_scale).enter Interact from people/ual1.glb; the UE5 mannequin, whose own takes are UAL2's, lands its hand on a workbench's grip with UAL1's Interact (1e-14 cm) and chops its own take at a block naming no enter (test_use_files).play_atand the matcher inertialized from the pose drawn, its lift and feet already on it, and the lift was laid on again. A seated figure's pelvis moved 28.7 cm in a frame at its loop's start or its exit's (Siltreach: 15 to 18 cm). Eased out of the graph's pose, kept before the layers, aims, lift and feet go on (as UE5 inertializes ahead of its foot placement), it moves 2.5 cm at the most, sitting on and standing up from a log, a stool and a doorstep from eight ways each (test_use). A step comes down on the heading it got to (Feet: a step comes down on the clip's heading, its toe swinging 10 mm round the held ankle on the floor #954): turned with a fading clip as it came down, a foot's toe swung 9 mm round its held ankle on the floor; the stool's eight ways now skate 0 mm. One landing at a fade's start still slides 4.95 mm, pitched about its ankle before its lock moves onto its toe: on Feet: a landing foot still moving at contact slides 7 to 19 mm a stance; a planted foot creeps 24 mm over a start #932.physics.person_massof the figure's height now (69.7 kg), through the character of its standing height;physanim.set_massgives a game's own (set to 80, 80). A 40 N s blow to the chest turns it 20.9 degrees, not 62.6 (test_physanim 17). Every take a graph plays (animator.state_take_count,state_take_at) andmetrics.animator_fastest: 23.9 rad/s over the mannequin's 14 takes, against the 16.3 readable before (test_character_share). A reach from a point (Physics: character_reach_from, the capsule's reach cast from a given point #957):physics.character_reach_frommatches the reach stood there from five points four ways, within 0 m (test_character_reach).animator.pose_graph) within the second arm's reach (0 mm off its grip through a stop), and an item moves only the hands it holds (a sheathe with a draw in one frame flung the second hand at 44.9 m/s, now 0.43). An aimed trunk is the aim's (fd36f06, Look: solved after the trunk's aim, it turns the aimed chest, and a held gun holds 4 degrees off its target #960): looking as it aims, the rifle's barrel holds 0.15 degrees, where it went 4.8 off.character.actplays a one-off take with its root motion through the capsule and holds a pose state until the next act (Character: act(c, state), a one-off take played with its root motion through the capsule, back to the stand at its end #958; test_character_act: a knock-down moves 3 m, a wall stops it at the capsule, lying held, up by LayToIdle). Five of 100STYLE's six gait loops wrapped unsealed; loop cuts are sealed whatever their gap, and a held axe's second arm turns 26 rad/s at most, not 77 (Items: holding a two-handed item through a run, the off arm pops 77 rad/s at one phase of each cycle (the graph's palms jump 8 cm) #962). A toe-locked foot is put back over its lock in up to four solves: the ramp's planted toe 2.9 mm (4.5). A limb's cut names its own skin's joints (Skin: a limb's cut names the first skin's joint places on a mesh posed by another skin, and cuts the head for the arm #963, test_skin). A landed foot's sole is laid on the ground.items.swing_stop). What a hit does is the game's.character.swingplays an item's swing as an act, so its step-in moves the figure by the take's root motion (0.8245 m, within 6e-8 cm), the hand on its grip;items.swing_readyarms a swing for whoever plays it.physics.box_touches, a broadphase test once a step; a swing's sweep 125 to 70 microseconds unoptimised. Stops braked from a walk and a run on either foot (4eda20e, Stops: the foot that is down is dragged along the ground as a stop begins (383 to 586 mm) #929): the hand-built graph's halt read by the meter, 0.12 mm and 0.006 mm at worst. A contact that flickers for a frame keeps its lock (84a6b4c, Stops: a foot jumps 63 mm in one frame at the stop take's last settle step #930): the stop's last settle step jumped a foot 36 mm in a frame, now 3.4 mm at most. Aether 0.884.0 pinned (6a9fe8a). Aether 0.885.0 pinned (2ff6de4). A transition's offset and seconds (b4dea28):animator.transition_offsetandtransition_seconds, what a check allows the easing; the graph's starts measured within the takes' own plus the easing's. Distance matching: a clocked start races up to 25x real time, and its switch inertializes from the race (57.7 rad/s) #937's race (34.3 rad/s on the character's walk-off) is still open: four fixes tried and measured, none kept, the findings on the issue. A figure on a database turns, sits and walks on within its takes (a5b0693, Motion matching: turns on the spot and facing a seat pop 72 to 128 rad/s; its hand-backs sink a sole 55 cm #935): the feet's contacts ease from what they were given, only through a state's transition; walking on from a seat a thigh turned 34.7 rad/s, now 15.2 (the takes' own 22.1). One set of bodies through a fall on ae3d.motion (5315951, physanim and motion: two ragdolls on one figure; motion should act on physanim's until #859 #941):physanim.releaseandretake, motion acting on physanim's ragdoll; one ragdoll in the world throughout a knock-down and get-up, the weights as before. Solid characters steer round each other (b7c4016, Character: solid characters walking at each other stop head on; steer round each other (reciprocal avoidance) #956): reciprocal avoidance inae3d.character(sampled velocities scored by turn and time to meeting, each taking half),character.set_avoidance; two head on and four crossing pass 330 and 249 mm apart, within 2 s of walking alone, a toe 1.9 mm.Since 2026-11-05 (pushed, CI green unless said)
Feet that do not skate or stick (Feet skate and stick in the people plaza: walk/run mix, pelvis root sway, lock throws the foot #970, closed). Traced foot by foot on the people plaza:
Walkers that curve and face where they go (4d5da7d, c6a1097, character: a sharp turn to a new goal mid-walk crosses the feet up to 169 mm; setting off pops a joint at 75 rad/s #969): the way stays within 10 degrees of the facing, and turning in place finishes its turn.
Avoidance on the paths bodies really take (cf45f12, Character: solid characters walking at each other stop head on; steer round each other (reciprocal avoidance) #956): each choice is scored on the mover's own curve, each neighbour on its own. People plaza: from 156 to 211 steps where two people touched, down to 0 on every seed.
metrics.FOOT_THROW(3f0b174, metrics: a foot thrown faster than its clip has it reads as nothing (FOOT_THROW) #972): a toe drawn faster over the ground than its clip has it. It reads what the skate measure missed.A blend's own scratch pose (532ec67, Distance matching: a clocked start races up to 25x real time, and its switch inertializes from the race (57.7 rad/s) #937): a transition's look one frame ahead shared scratch with a blend's sampling. That made the 57.7 rad/s pop setting off.
A toe hold that ends when the tip moves (b657edc, metrics: a foot thrown faster than its clip has it reads as nothing (FOOT_THROW) #972): the steady-gait throw halved, 3.6 to 1.8 m/s.
An act begun mid-stop (b012c40, feet: an act begun while a stop still brakes slides the stop's stepping foot 27.6 mm #967, closed): a foot slowed out of its swing lands at this frame's clearance. 27.8 to 0.31 mm.
A fall come down in a heap has landed (3b751d7, motion: a knocked-down figure lies 1.45 s longer before rising since 2a6eaf91 (likely) #951, closed): over 48 knockdowns, time heaped 0.50 to 0.24 s mean, 2.47 to 0.67 s worst.
static_depth under an underside (7d2e7d3): a heel just under a bench read 351 mm "in" it.
A flickered lock keeps its heading (dd4979f): a planted toe slid 14.4 mm without a step.
A bowl in both hands through a sit, a stand and a walk (72c67d0, Hand-backs between motion and the animator pop joints, sink a sole and slide the feet #933, closed): the second palm 145 to 0.098 mm off its grip; fingers ease onto a handle.
100 seeded knockdowns against M5 ragdoll and get-up from a pose snapshot into a matched clip (L5) #859's bounds (8cd93eb), and the look and the feet let go as the trunk lies (1eda974): a head thrown 186 rad/s and a foot 127 rad/s for a frame at the get-up, gone.
The people plaza (41e31fc, e1c641d): twelve mannequins on the new pipeline. It reports goals reached, the slowest errand and anyone off the floor.
Aether v0.888.0 to v0.891.0 pinned as each released.
Reverted: a7bed32 (the start race's first fix) broke three tests its gate did not run, and was reverted in bfbf2ef. It returned in e808208 with them passing.
Starts that keep their pace (e808208, 66feb37, 60b2904, Distance matching: a clocked start races up to 25x real time, and its switch inertializes from the race (57.7 rad/s) #937): a start counts from its move-off and ends at its first footfall once up to pace, and the figure goes no faster than 1.25 times the take. People plaza:
With it: a toe on the ground to the last digit is not in it, and test_physanim reads the walk's own fastest over the frames it eases back in. A sweep of 61 strike phases showed the old reading failing at some phases on the base too.
character.get_up(c, m, blend)(49f0c26, e0def06, 6e181f2, f7bed87, M5 ragdoll and get-up from a pose snapshot into a matched clip (L5) #859): one call from ragdoll to standing. The get-up's root taken from its pelvis keeps the capsule within 2.7 mm of the body (was 239 mm). The clip is chosen by how the body lies, and no foot lands while the trunk lies (worst joint at the change 96 rad/s over the clip's own -> 2 under).Aether v0.902.0 (966d08b). 26 of 26 of the full motion list passed locally before the push; CI 11 of 11 green.
Crowds and animation LOD (0cbba27, 1a268f4, M8 crowds and animation LOD #862):
ae3d.animlodbakes crowd banks from a figure's own graph, updates distant figures 1 in 2, 4 or 8 frames under a budget ranked by distance and view, and hands a figure between crowd and full graph by pose snapshot. A full figure costs 27.0 us a frame; 1 in 8, 11.1 us; a crowd instance 201 ns. 100 full figures plus 2,000 in the crowd: 3.1 ms on one thread, against 2 ms planned.One two-bone solve (3dccf75, M3 IK and constraints: two-bone with limits, FABRIK, full-body IK, foot placement, aim, hand IK (L3) #857): motion's private triangle and limits are gone; it calls ikrig's. test_ik_constraints 17 to 22 checks, with a cost bound per solve (a limb 0.3 us, the whole body 12 us at -O2).
A get-up eased in no faster than its own pelvis (576225b, M5 ragdoll and get-up from a pose snapshot into a matched clip (L5) #859): macOS's pelvis check was a real margin of 3 mm/s, not round-off. The ease-in now lengthens until the pelvis stays within the clip's fastest; the capsule stays within 0.08 mm of the pelvis (was 2.8 mm).
The full motion list (32 tests) passed on the crowd LOD commits and 13 combined tests on all four before the push; CI 11 of 11 green.
Morph targets and faces (487dfff, e444397, Faces: blend shapes, blinks, saccades, eyes that look, visemes #910): glTF morph targets imported (POSITION, NORMAL, TANGENT, sparse, names, weights animation; 73,866 offsets and 127 keys checked against the files, 0 differ), drawn on Vulkan (compute) and GL (transform feedback) before skinning (GPU vs CPU 3e-8 m; nothing dispatched at zero weights; about 0.1 ns per vertex per active target), played as pose curves through blends, additives, mirroring and inertialization.
ae3d.facemaps ARKit's 52 shapes by name; procedural blinks at 16.6 a minute, closing 100 ms, opening 180 ms. 46 tests (the motion list plus skinning and render) passed locally before the push. CI read test_morph as failed on two legs because it closed on "all passed", not "all checks passed" (8439f6c).A sole in a solid's side (7f3f364, metrics: a sole beside a 0.6 m deck reads 600 mm into the ground #978):
static_depthlooks for the shortest way out, level ways included; a sole 5 mm into a 0.6 m face read 600 mm, now 5 mm. ikrig takes a top more than STEP_HEIGHT above both the floor and either foot's last ground as a wall, not ground.A walker against a wall walks along it (fc6e3ca, Plaza: walkers by the ramp and steps cross their feet 263 mm and pop joints at 112 to 165 rad/s #977): its capsule slid along a wall at 2 m/s while the gait played the asked run into it, dragging its locked feet. New test_character_walls: into a 0.6 m block or a 0.45 m step at 45 degrees, no crossing, joints 17 rad/s, throw 0.6 m/s. 27 tests passed locally on both.
Aether v0.904.0 (c669ae9): a pointer or struct passed for a string is a type error now; CI 11 of 11 green on it.
Eyes, saccades, blinks in the pose, visemes, a CC0 face (834e998, dddae7f, 97c2dc2, fe3b5b6, Faces: blend shapes, blinks, saccades, eyes that look, visemes #910):
tools/gltf_strip.aefrom 16.3 MB to 1.1 MB, lossless (9.3 million numbers compared).Aether v0.905.0 (3cd001c): base64url; nothing ae3d calls.
test_face frees its animator (35d1985): macOS's leaks found 336 blocks rooted in animator.attach.
A get-up's hand-over planned off the floor (f9896c3, c9483dc, 018b647, 01df68f, get-up: the drawn feet go up to 8.8 cm into the ground; test_get_up holds only the bodies #841): the body rolls before it drops (the trunk lift planned ahead), limbs lifted clear on planned paths, the take's own frames grounded at import, the look off while getting up. Over 100 knockdowns the deepest joint under the floor 0.348 m -> 1.42 cm (now checked at 2 cm); snapshot to clip, joint and pelvis under the take's own; planning 0.76 ms a get-up at -O2.
A character over the network (0b953ac, bc373c3, 858eb8a, Animation over the network: the graph's inputs and events, not poses #911): inputs and events, not poses; 1,212 of 1,212 ticks bit-identical between peers; under 150 ms with jitter and 5% loss, feet and hands within float noise through a run, a turn, a knockdown and a get-up; 538 B/s walking. The anim hash trail joins CI's cross-platform determinism job.
A repeatable people plaza (31d5270, 718a65d, b1d4c90, a77ebd3, people_plaza is not repeatable: the same seed reads throw 1.58 to 1.79 m/s and crossing 1.7 to 3.3 mm run to run #983): on the fixed tick it was already bit-identical run to run; the spread came from wall-clock runs, so a scored run now uses the tick. test_plaza_repeat runs the plaza twice and compares every joint bit for bit.
40 tests passed locally before the push.
Get-ups side by side (ee8fc56, df27530, 9a025e9, get-up: two knocked figures getting up side by side are drawn inside each other for up to 2 s #835): each get-up's way is scored against nearby bodies and other figures' ways up, waiting when every way crosses. 0.55 s inside each other over 9 layouts -> 0 s over 18, both start orders.
Turning on the spot like a person (8ea8c71 to 2a3e41f, Turning on the spot: a standing figure shuffles round in 10 small steps for 180 degrees; a person takes 3 or 4, head first #976): head, chest, then hips. 30 degrees with no step; 90 in 2 steps (1.55 s); 180 in 4 (2.75 s); were 3, 9 and 11 steps. Avoidance predicts the turn within 2.5 degrees.
Crowd animation on the job pool (3a7eb63, 4a7ebdb, 7f9c86f, 5ced9eb, 3de7f69, M8 crowds and animation LOD #862):
Each IK solve's cost as the fastest of five blocks (5b1de2b): linux-3 read a mean that took in the shared runner's other work.
The same math bits on every platform (df3cbfd, Animation over the network: the graph's inputs and events, not poses #911):
ae3d.fdlibm, Sun's fdlibm in Aether, under core's trig and every pose-path call. glibc, Apple's libm and MinGW's differed in the last bit and split the anim trail at tick 0; filed upstream as the proposal aether#3644 (std.math.strict).netanim.flush (4459262, Animation over the network: the graph's inputs and events, not poses #911): the owner's last tick is sent as its figures stop.
Aether v0.906.0 (83ba752). The local toolchain moved from 0.880 to 0.906 as well, so local builds match CI.
56 tests passed locally on v0.906.0 before the push.
The feet's ground reads (829aee5, M8 crowds and animation LOD #862): static shapes gathered once a solve, no allocation a read; 97 -> 53 reads a figure a frame, one figure's feet 24.4 -> 20.7 us, results identical.
AE3D_PERF by behaviour, people_plaza's AE3D_PROFILE (acaf489, Plaza on characters: frame time 6.9 ms to 9.7 to 15.7 ms mean with 24 mannequins #980).
Walkers kept on walkable ground (4e13bbc, 1deab58, 0caea0a, 11e97a2, 1acc8bd, people_plaza: one walker per seed walks off the floor's edge, its joints at about 70 rad/s #981):
physics.character_set_ledges(as UE's bCanWalkOffLedges; kerbs and stairs are steps, not ledges), steering that looks 3 s ahead for edges,character.project_goal. people_plaza 2,400 frames: no one leaves the floor (was 1 to 3 a seed); fastest joint 70 -> 20 to 25 rad/s; throw 15 -> 2.4 to 3.5 m/s. New test_ledges.Poses that follow fixed physics steps at any frame rate (255ab62, 734b10a, 5536277, e378507, 06964e3, At a frame rate that varies, feet skate up to 43 mm: the pose is taken once a frame while physics steps fixed #985): each fixed step the animators run as a batch on the job pool, and the drawn pose is interpolated between the last two steps. At 1/30, 1/45, 1/60, 1/144 s and a jittering mix, place 0 mm off the tick's and toe skate within 0.016 mm (was up to 56 mm and 56 rad/s); the plaza on the wall clock reads exactly as on the tick; pooled poses identical to one thread's; test_net_anim bit-identical.
34 + 12 tests passed locally on v0.906.0 before the push.
Animation memory (f49af06, 5fd2431, b87b9b1, 7d72534, 41f0a47, Animation memory: 59 MB a mannequin; shared takes and error-bounded compression #990): a glTF file's embedded animations read once and shared (they were re-read for every figure, about 51 MB each); takes compressed ACL's way within 0.1 mm at the skin (worst 0.004 mm). A figure's own memory 59.8 -> 1.64 MB; 100 figures 5.9 GB -> 285 MB; sampling a take 383 -> 225 ns; decoding identical on every platform. 34 tests passed locally before the push. Follow-ups: Animation memory, the rest: graph takes and meshes shared across figures, key reduction #992.
Secondary motion (726ec7a, 0aa1cb8, 81508ed, d1d0b45, 879521a, Secondary motion: spring chains and jiggle for hair, tails, straps and held gear #989):
ae3d.springs, spring chains and jiggle held out of body colliders, solved after IK on the fixed step's pool; a VRM's own spring bones imported (VRoid's 8 chains, 6 colliders). A ponytail settles in 0.53 s against its 0.5 s design, never enters a collider, rests within 0.14 mm, same bits run to run; about 140 ns a joint a step.Deaths and partial ragdoll (7de7529, 8e76847, e0cad61, 8ff1596, M5 ragdoll and get-up from a pose snapshot into a matched clip (L5) #859):
character.diecarries the animation's velocities into the ragdoll (within 0.0002%), a short powered fall, never standing again; a hit lets its chain go by share and blends back with the feet planted (0 mm skate). A dying forearm pressed 29.5 mm into the floor for 5 steps is A dying walker's forearm is pressed 29.5 mm into the floor for 5 steps by the world's soft contacts #993.The get-up planner for any landing (df347b0, c40507a, 50416c0, get-up: the drawn feet go up to 8.8 cm into the ground; test_get_up holds only the bodies #841): the plan replayed and its lifts raised where a joint still dips; over a 300-landing sweep the deepest joint under the floor 2.59 -> 0.92 cm, planning 0.73 ms a get-up.
Timing checks read as the fastest of five (45898df): test_items' swing sweep, as test_ik_constraints' solves.
41 + 22 tests passed locally before the push.
Stances and cover (41b8799, 5924175, 9fb3901, Stances and cover: crouch, prone, cover, peek, with stance changes that keep the feet #988): stand, crouch and prone as a graph parameter with the feet kept through each change; the capsule reshaped to the stance (
physics.character_set_shape) with room checked before rising (character_room); a crawl; cover along a wall with peeks. test_stances holds them to numbers.Whole-state snapshots for late joins and drift (692565c to a0c7134, Animation over the network: the graph's inputs and events, not poses #911): the animator, character, physanim, springs, mover, feet, look and aim each written and read whole. A late joiner takes a snapshot, a parted figure resyncs from its owner's, a falling ragdoll is sent every block, a get-up is planned from the body as laid, and foot locks travel in the state. test_net_anim adds deaths, planted feet after drift, late joins at seeded ticks and lying down, relays to a third peer, and ragdolls held through knockdown and death.
Fight takes (39ca28c, 4141f98, 9bd35d6, 3bb95b7, Combat on the pipeline: mocap fight moves as takes, held to numbers #907):
animator.transition_need: the fastest a transition's easing turns a joint.test_springs' cost per joint as the fastest of five blocks (b13baff): linux-2 and macos-2 read the shared runner's load (3,360 ns against about 140).
Aether v0.907.0 (7fd83ef): OpenBSD support only.
41 tests passed locally before the push, 0
warning[.Timing suites built optimised in CI (ab6e0c5): CI builds suites at -O0 unless they are marked
// ci: optimised(CI costs 90 runner-minutes a push: tiers per runner, showcase scenes off the runners, compile the engine once #511). The springs' solve read 987 ns a joint a step at -O0 against 139 at -O2 (2,046 and 2,116 on linux-3 and macos-3, bound 1 us); macos-2 read the FABRIK spine at 203.5 us against 200 (18.9 at -O2). Bounds unchanged.Knockdowns and staggers on physical animation (d765210, f0249b0, d6e8602, 953aebd, M7 behaviours on physical animation, optional (L6) #861):
physanim.knockkeeps the figure powered until it lands, with the knees buckling, then limp;retakebrings it back onto the animation. No ae3d.motion in a knockdown.character.shovestaggers through the gaits' own steps up to 1.5 m/s: 0 of 24 shoves fall (the plain ragdoll: 24 of 24), toe skate 2.93 mm (the gaits at the same velocity: 2.93).character.knock: 100 seeds and 300 swept landings, every bound held.Shared figure memory (d684fc0 to 4dd0bcc, Animation memory, the rest: graph takes and meshes shared across figures, key reduction #992):
Fight takes, round 3 (d677320 to bdde2ff, Combat on the pipeline: mocap fight moves as takes, held to numbers #907):
items.aim: a rifle aimed stood, walking and running within 0.1 degrees, palms within 0.002 mm of their grips.60 tests passed locally before the push, 0
warning[. CI: 10 of 11; macos-2's leak check found the rifle test's gait set unfreed, fixed in the next push.Gait sets freed (971a8e9, d3e6fe1): test_combat_takes' rifle and test_start_clock released their
character.gaits(macOS's leaks: 259 leaks rooted incharacter_gaits). No other suite leaves one.Feet drawn as animated when a leg is not driven (5938d70, physanim: drawn feet up to 0.116 rad off pose_now with leg weights 0 after a hit on a walker; the toe skates 10 mm #1000): physics'
toe_on_groundturned an animated leg's ankle up whenever the walk's toe dipped, so a hit on the trunk moved the feet 0.116 rad and skated a toe 10 mm. Now the stagger sways the struck body again: toe skate 2.93 mm, legs equal to the graph's within 5.2e-8 rad.World bounds on the model, not the shared mesh (7683d54, Shared meshes: world bounds written into the mesh would race once bounds run on the job pool #999):
geometry.mesh_world_boundswrites nothing shared; a mesh keeps only its local bounds.mesh_set_posnow resets them. test_shared_bounds: two figures on one 60,000-vertex mesh, updated from two jobs for 2,000 rounds, every bound its own transform's to the bit, the same run to run.Starts no faster than 1.5 times real time (13fdf05, d0d10b7, Distance matching: a clocked start races up to 25x real time, and its switch inertializes from the race (57.7 rad/s) #937): a start played by distance clamps its rate as UE5's distance matching does. Run-off at 92.6% of the takes' own plus the easing, toe skate 3.0 mm. Taking up the lag is left to stride warping (on Distance matching: a clocked start races up to 25x real time, and its switch inertializes from the race (57.7 rad/s) #937).
UAL2's sword strike and block (3f62a7b, Combat on the pipeline: mocap fight moves as takes, held to numbers #907): onto the female mannequin with the feet kept, bones within 0.0002 degrees, planted toes still to 1e-12 mm.
A bowl in both hands on the UE5 mannequin (c7ddb6e, Palm hold never engages on a UE5-named rig without metacarpals (palms 10.8 cm off a held bowl) #931): test_eat, three bites, each palm within 3.63 mm of its grip.
Aether v0.908.0 (e994239): os.run_stdio and ipc.stdio_channel, nothing ae3d calls. 64 suites passed locally on v0.906 and the key 8 again on v0.908. CI: 11 of 11 green.
Aether v0.912.0 (8c80490): 0.910 moves a local read once inside a loop only after the loop, and returns an optional owning a string safely; 0.909, 0.911 and 0.912 add what ae3d does not call. All 64 suites passed locally on v0.912. CI: 11 of 11 green.
The plaza (8c80490..6cff61c, Plaza: walkers by the ramp and steps cross their feet 263 mm and pop joints at 112 to 165 rad/s #977):
AE3D_FLAG=1names every step past a bound.Knockdowns (Get-up: a figure tripped at a run on a kerb rises for 6 s, falls again and never stands #922, Get-up: a hard blow from the side (strength 1.3, turned 0.5 rad) pops a forearm 8.4 rad/s past the clip's own at the hand-over #994): a trip at a run on a kerb on
character.knock, 9 kerb distances, each up to within 0.006 rad of its stand and walking on (test_trip_kerb_character). The get-up planner plays its plan back and lengthens a turn where a joint would outrun the take: seed 40's side blow 35 -> 7.96 rad/s under the take's own; 500 of 500 swept landings up.78 suites passed locally on v0.912 before the push, the drawing ones hidden. CI: 10 of 11; macos-2's leak check found test_character_walls' shove-scene capsule unfreed (the test's own, which physics_free does not release), fixed in dbfe94b.
Done locally, landing next (each after the full list)
metrics.SKATEreads a pivoting foot at its ball. Lands after its plaza comparison with base.asked_velocity); people_plaza's feet crossing 2 mm -> 0. A ragdoll's whole state in a late join's snapshot; netanim's knock oncharacter.knock. A join at a death reads 0.96 degrees (was 2.008, bound 2). Waits on A limp ragdoll stands on its 8 Hz joint springs (kept after release) and never lies down; test_knockdowns seed 60 from the gaits' walk pose #1002.In progress (one agent each, in its own worktree)
Order of work from here
The full plan is in #853, section "Road to the merge and to Siltreach".
Every motion issue, in full
#854 M0, ground truth
#855 M1, skeleton, pose, clips, retargeting, root motion
#857 M3, IK and constraints
rig; motion's private copy gone (3dccf75)chain_solve, a cone per joint; no tail rig to test yet)body_new/body_set)look_solve,aim_chain)#858 M4, physics asset and physical animation
physanim: each body kinematic, motor-driven toward the pose, or simulated, with a weight per body and named profiles (233c69c, test_physanim 15)character.hit(b4e0884, test_physanim)#859 M5, ragdoll and get-up
#860 M6, migration
#861 M7, behaviours on physical animation
#862 M8, crowds and animation LOD
#907 the generic pieces fighting is built on (rescoped: the moves, their order, timing and damage are the game's)
#903 the character component
ae3d.animgraph(test_animgraph)#909 the generic pieces two figures need (rescoped: the scenes themselves are the game's)
#910 faces
#911 animation over the network
#922 the get-up after a trip at a run
Part of
Closed by hand once met on this branch (the PR says Part of, never Closes):
Part of Epic: a AAA animation system any game can use (pose pipeline, clips, blending, IK, physical animation, ragdoll transitions) #853
Part of M0 ground truth: a real human in CI (Quaternius mannequins, UAL clips), motion metrics, a viewer #854
Part of M1 skeleton, pose, clips, retargeting and root motion (L0, L1) #855
Part of M3 IK and constraints: two-bone with limits, FABRIK, full-body IK, foot placement, aim, hand IK (L3) #857
Part of M4 physics asset and physical animation with per-body weights (L4) #858
Part of M5 ragdoll and get-up from a pose snapshot into a matched clip (L5) #859
Part of M6 migration onto the animation pipeline; old writers retired #860
Part of M7 behaviours on physical animation, optional (L6) #861
Part of M8 crowds and animation LOD #862 (closed)
Part of A character component: a moving, aiming, reacting person in a few lines #903
Part of Combat on the pipeline: mocap fight moves as takes, held to numbers #907 (closed)
Part of Two-person scenes: handing over, carrying, grappling, talking #909
Part of Faces: blend shapes, blinks, saccades, eyes that look, visemes #910
Part of Animation over the network: the graph's inputs and events, not poses #911
Part of Get-up: a figure tripped at a run on a kerb rises for 6 s, falls again and never stands #922
Part of Stops: the foot that is down is dragged along the ground as a stop begins (383 to 586 mm) #929 (closed)
Part of Stops: a foot jumps 63 mm in one frame at the stop take's last settle step #930 (closed)
Part of Palm hold never engages on a UE5-named rig without metacarpals (palms 10.8 cm off a held bowl) #931
Part of Feet: a landing foot still moving at contact slides 7 to 19 mm a stance; a planted foot creeps 24 mm over a start #932 (closed)
Part of Hand-backs between motion and the animator pop joints, sink a sole and slide the feet #933 (closed)
Part of Feet: the ground ray reads a seat's flank, planting a foot 15 to 21 cm up beside it #934 (closed)
Part of Motion matching: turns on the spot and facing a seat pop 72 to 128 rad/s; its hand-backs sink a sole 55 cm #935 (closed)
Part of physanim: anchored arm bodies trail the animated pose 24 to 48 mm at a walk, whatever the anchor's strength #936
Part of Distance matching: a clocked start races up to 25x real time, and its switch inertializes from the race (57.7 rad/s) #937
Part of POWERED: a figure standing on a walk is turned 174 degrees in two seconds by its own legs #938
Part of character: no ragdoll until its first blow, so a sweep cannot hit an unhurt person #940 (closed)
Part of physanim and motion: two ragdolls on one figure; motion should act on physanim's until #859 #941 (closed)
Part of character: no pause and resume while something else holds the body #942 (closed)
Part of character: humanoid takes no scale; a scaled figure gets the authored size's capsule and gaits #943 (closed)
Part of character: takes are re-read and retargeted for every character of one figure #944 (closed)
Part of items: a swing plays a whole state; no upper-body swing over a walk, one rate per item, a step-in against the mover #945 (closed)
Part of items: a hit carries no bone, edge speed, way or depth, and misses the world and other weapons #946 (closed)
Part of animator: a state played backward (rate below 0) is held to nothing #947 (closed)
Part of animgraph: a capture is a whole BVH with no crop, events, rate or ASF/AMC; takes named by path #948 (closed)
Part of usable: a slot needs an enter take, so it cannot be only a claim, an approach and a facing #949
Part of usable: a slot's takes can only come from the one file character.use_takes gives #950 (closed)
Part of motion: a knocked-down figure lies 1.45 s longer before rising since 2a6eaf91 (likely) #951 (closed)
Part of character.use: walking to a slot and turning to its way skates a toe 11.9 mm #952
Part of Animator: a transition out of a lifted state lifts the pelvis twice, 15 to 28.7 cm in a frame at a slot's take switches #953 (closed)
Part of Feet: a step comes down on the clip's heading, its toe swinging 10 mm round the held ankle on the floor #954 (closed)
Part of Physanim: a figure's ragdoll weighs half a person (38.5 kg); dressed in place, it is never weighed #955 (closed)
Part of Character: solid characters walking at each other stop head on; steer round each other (reciprocal avoidance) #956 (closed)
Part of Physics: character_reach_from, the capsule's reach cast from a given point #957 (closed)
Part of Character: act(c, state), a one-off take played with its root motion through the capsule, back to the stand at its end #958 (closed)
Part of Items: a two-handed hold's off-hand fingers flip at 96 rad/s through every step #959 (closed)
Part of Look: solved after the trunk's aim, it turns the aimed chest, and a held gun holds 4 degrees off its target #960 (closed)
Part of Character: let go from a run it does not stop, braked at its walk stop's 0.41 m/s^2 from any speed #961 (closed)
Part of Items: holding a two-handed item through a run, the off arm pops 77 rad/s at one phase of each cycle (the graph's palms jump 8 cm) #962 (closed)
Part of Skin: a limb's cut names the first skin's joint places on a mesh posed by another skin, and cuts the head for the arm #963 (closed)
Part of Character: asked to walk off to its side, it plays its forward start while turning, and its feet cross 110 mm #964 (closed)
Part of CI: the macOS leak shard runs out its 54 minutes; split the leak tier over three runners #965
Part of feet: an act from a stand after a walk skates a toe 117 mm at push-off; the same act again 11 mm #966 (closed)
Part of feet: an act begun while a stop still brakes slides the stop's stepping foot 27.6 mm #967 (closed)
Part of motion: a POWERED figure playing a walk in place falls within a second #968
Part of character: a sharp turn to a new goal mid-walk crosses the feet up to 169 mm; setting off pops a joint at 75 rad/s #969
Part of Feet skate and stick in the people plaza: walk/run mix, pelvis root sway, lock throws the foot #970 (closed)
Part of animator: orientation warping for figures that face freely (lower body to the velocity, chest to the facing) #971
Part of metrics: a foot thrown faster than its clip has it reads as nothing (FOOT_THROW) #972
Part of mover: a runner asked to a goal inside its turning circle orbits it and never arrives (one ran off the plaza) #973
Part of character: walk and run as separate gaits with a timed change between them, not mixed by weight across a speed band #974
Part of Turning on the spot: a standing figure shuffles round in 10 small steps for 180 degrees; a person takes 3 or 4, head first #976 (closed)
Part of Plaza: walkers by the ramp and steps cross their feet 263 mm and pop joints at 112 to 165 rad/s #977
Part of metrics: a sole beside a 0.6 m deck reads 600 mm into the ground #978
Part of Avoidance does not see a person lying struck: walkers walk through the body #979
Part of Plaza on characters: frame time 6.9 ms to 9.7 to 15.7 ms mean with 24 mannequins #980
Part of people_plaza: one walker per seed walks off the floor's edge, its joints at about 70 rad/s #981 (closed)
Part of Plaza: when the car ends up above a dummy, both fly off into space #982
Part of people_plaza is not repeatable: the same seed reads throw 1.58 to 1.79 m/s and crossing 1.7 to 3.3 mm run to run #983 (closed)
Part of Turning on the spot is slow: 180 degrees in 3.2 s (people about 2 s), held back by a throw measure that reads a turning step against a still clip #984
Part of At a frame rate that varies, feet skate up to 43 mm: the pose is taken once a frame while physics steps fixed #985 (closed)
Part of Traversal: jump, fall and land, vault, mantle, ledges and ladders #986
Part of Motion warping: a take's root bent onto a target point and facing #987
Part of Stances and cover: crouch, prone, cover, peek, with stance changes that keep the feet #988
Part of Secondary motion: spring chains and jiggle for hair, tails, straps and held gear #989
Part of Animation memory: 59 MB a mannequin; shared takes and error-bounded compression #990
Part of Crowd instances stepped on the GPU: a million figures with the CPU's share near zero #991
Part of Animation memory, the rest: graph takes and meshes shared across figures, key reduction #992
Part of Shared meshes: world bounds written into the mesh would race once bounds run on the job pool #999
Part of physanim: drawn feet up to 0.116 rad off pose_now with leg weights 0 after a hit on a walker; the toe skates 10 mm #1000
Part of Get-up: an arm the protective reach leaves overhead is swept through the floor at the hand-over (seed 26: a finger 25.8 cm under); blocks the reach as default #1001
Part of A limp ragdoll stands on its 8 Hz joint springs (kept after release) and never lies down; test_knockdowns seed 60 from the gaits' walk pose #1002
Part of Get-up: a hard blow from the side (strength 1.3, turned 0.5 rad) pops a forearm 8.4 rad/s past the clip's own at the hand-over #994
Part of Motion matching: trajectory features read backwards near a looping take's end (root_delta) #998
Part of Network: after a knockdown facing the other way, a no-latency client's get-up parts from the host's (hands 149 mm, 24 degrees) #1003