| name | balance-and-posture |
| description | Cross-cutting rules that keep any generated pose physically plausible — feet grounded, a sensible center of mass, human joint limits, and symmetric defaults. Use this as a CHECK on every Action, especially for big motions like reaching, leaning, bending, lifting a leg, squatting, or standing on one leg. |
| category | posture |
| disable-model-invocation | true |
balance-and-posture
This is a modifier / sanity skill: apply it on top of the motion skills so the
result looks like a real body that won't tip over or snap a joint. It rarely emits
joints by itself; instead it constrains the numbers the other skills produce.
Core rules
- Keep feet grounded. Unless the command is explicitly a jump, at least one
foot stays on the floor. When you lower the body (squat, crouch, sit, kneel),
drop
root.y so the feet stay near the floor instead of the legs clipping
through it:
- stand:
root.y = 0
- small dip / half-squat:
root.y ≈ -0.25 .. -0.30
- deep squat / sit:
root.y ≈ -0.45
- kneel / crouch low:
root.y ≈ -0.35
- Center of mass over the base of support. When one leg lifts (knee raise,
kick, balance), shift weight over the planted foot: a small torso lean toward
the support side (
Spine/Chest Z ~ ±8–12) and keep that *Foot at rest
[90,0,0].
- Counterbalance big reaches/bends. A deep forward bow (
move-torso X large)
or a long forward reach moves mass forward — add a slight hip/knee counter-flex
(UpLeg/Leg a few degrees) and/or shift root slightly so it doesn't look
like it's falling.
- Respect human joint limits (angles are hard-clamped to [-180,180], but stay
well inside realistic ranges):
- Elbow / knee: flex one way only,
0..150; never hyperextend (no negative).
- Shoulder: ~
|180|; hip flexion ~-30..120, abduction ~45.
- Neck: yaw
|80|, pitch |55|, tilt |35|. Spine: flex |80|, lean |35|,
twist |45|. Fingers: each segment 0..90 (curl), no sideways/backward.
- Ankle: ~
60..120 around the [90,0,0] rest.
- Symmetric defaults. For "both"/whole-body commands, mirror left↔right using
the sign rules (arms: LEFT raises with more-negative Z, RIGHT with more-positive
Z; legs/abduction mirror on Z). Don't leave one side dangling unless asked.
- Return to rest cleanly. "relax", "stand normally", "reset" → emit the rest
pose (
*UpperArm [0,0,±90], *UpLeg:[0,0,180], *Foot:[90,0,0], torso/neck
[0,0,0]) with root.y:0.
Quick checklist before emitting an Action
- Is a foot on the ground (or is
root.y dropped to match a lowered pose)?
- Are both sides handled for "both/whole-body" commands?
- Is every angle inside the human range above?
- Does the center of mass look supported (lean/counterflex for big moves)?
- Only the joints that should change are present (others omitted → stay as-is).
Example: balanced one-leg knee raise
{"durationMs":800,"pose":{"RightUpLeg":[90,0,0],"RightLeg":[90,0,0],"Spine":[0,0,-8],"Chest":[0,0,-6]},"say":"Balancing."}
(right knee up; slight lean over the planted left foot to keep balance.)