3.Representation model
3.1.Groups
P is partitioned into seven continuous groups (71 dimensions in all):
| Code | Group | Role |
|---|---|---|
a | arm | articulation |
w | palm facing (wrist orientation) | articulation |
g | fingers | articulation |
h | head | articulation + affect |
b | body | articulation + affect |
f | face | articulation + affect |
m | mouth | articulation + affect |
Plus hyper conditions (§3.4): eye look-at, viseme, contact, and anchor — conditional channels riding alongside the vector, not latent dimensions.

Legend: a arm (8: 4 × L/R) · w palm facing (6: 3 × L/R) · g fingers (32: 16 × L/R) · h head (3) · b body (3) · f face (8) · m mouth (11) — 71 dimensions. h b f m also accept the expression delta (§3.3). Hyper conditions (eye look-at, viseme, contact, anchor) are not shown: they ride alongside P, not inside it (§3.4).
Articulation-only groups (
a w g) MUST NOT carry expression deltas — they encode pure form. Affect-capable groups areh b f monly (§3.3).
3.2.Value convention
- Each continuous dimension is normalized to the closed interval [−1, 1].
- Consumers MUST clamp out-of-range inputs to [−1, 1].
- A dimension's real-unit value is recovered by denormalizing with its
maxand mode: bipolar (default); unipolar (uni) for axes with no negative meaning (e.g.a_spread); circular stores degrees directly and wraps atmax. This mapping is a decode convenience — P on the wire is always the normalizedn. - The canonical body frame is neck-centric, right-handed: +x = body-right, +y = up, +z = toward viewer. Arm positions use the calibrated axis units in §4.1; P itself is normalized, not raw distances.
- Handedness is significant. Left/right MUST NOT be swapped silently; mirroring is a
correctness concern, not a cosmetic one. A sided dimension exists as an
_l/_rpair sharing one definition; the same normalized value on both sides is a symmetric pose, and x-like axes are negated for the right side at decode time.

Legend: origin at the base of the neck, on the midline; +x = body-right (the viewer's left, since the avatar faces the viewer), +y = up, +z = toward the viewer. R/L mark the avatar's own right and left. The same normalized value on an _l/_r pair is a symmetric pose; x-like axes are negated for the right side at decode.
3.3.Pose ⊕ Expression
IPL carries two stacked layers:
- pose — the base P across all seven groups.
- expression — an additive delta on affect groups
h b f monly. - α — a per-use gain in [0, 1] scaling the expression layer.
A consumer that ignores expression MUST still render pose correctly. Expression adds
no new dimensions to the registry ordering; it is a parallel delta over the affect
groups.
3.4.Hyper conditions & post-processing
Alongside the continuous vector, IPL carries hyper conditions — named discrete/conditional channels that condition how P is decoded without being latent dimensions. They are designed (not learned), do not occupy registry positions, never interpolate as scalars, and removing them MUST restore the pure decode of P. All other values remain the latent, unchanged.
The full decode order is:
P(pose) ⊕ α·P(expression) ──decode──▶ rig pose ──POST-PROCESSING──▶ rendered body
(latent, §3.3) (eye/viseme applied) (contact/anchor solved)
Four hyper conditions are defined (registry §4.8):
eye_lookat,viseme— decode-time conditions: consumed while decoding P into the rendered face/mouth (gaze aim, mouthing morph). (Reclassified from "categorical channels" in pre-release drafts — same semantics, new grouping.)contact— a post-processing condition:{mover, target}over body sites, meaning "the mover site connects to the target site". It is solved on the fully decoded body — after pose ⊕ expression and the complete rig decode — by moving ONLY the mover-side arm chain so the two site points coincide; the target side and torso MUST NOT move. The latent already places the mover close; contact closes the small residual gap (per-rig proportion differences) so the touch is exact on every rig. Out-of-reach targets clamp to the closest reachable point.anchor— a post-processing condition, per arm side:{l?: {site}, r?: {site}}over body sites, meaning "this arm's position (a_hand_*) is measured from the site instead of the neck". Each entry rides ITS arm's keyframes — an arm whose keyframes carry no anchor is never moved (a resting arm stays neck-origined). Solved on the fully decoded body by translating the anchored arm's target by the world delta site − neck-site on the posed rig (soanchor: neckis exactly a no-op) and re-solving; the torso MUST NOT move. Same P → correct placement on every rig (per-rig site calibration resolves the delta). Allowed sites:forehead,mouth,navel,shoulder_l,shoulder_r(andneck= default/no-op) — hand sites are excluded (circular). Priority:contact>anchor— on a side where a contact fires, the anchor is ignored (contact fully determines that hand); the other side still anchors. A rig with no resolvable site falls back to neck (graceful, never an error).
Body sites. The contact domain is a fixed vocabulary of 32 named reference points
on the decoded body: neck, navel, forehead, mouth, and per side (_l/_r)
shoulder, elbow, wrist, palm, plus {thumb,index,middle,ring,pinky}_{base,tip}.
A site resolves to a world point as primary bone + bone-local offset (+ optional
secondary bones); the offsets are calibrated per rig and are renderer state, not
part of P. Constraints: the mover MUST be a hand site; the target MUST NOT be on
the mover's hand nor be the mover's same-side elbow. At most one contact may be
active per keyframe.