4.Parameter registry (normative)
The registry is the authoritative list of every dimension. Each row is one dimension
(sided dimensions exist as an _l/_r pair sharing the listed definition). Defaults are
the neutral, normalized value.
| Column | Meaning |
|---|---|
id | Stable machine identifier (e.g. a_hand_x). Sided ids append _l/_r. MUST NOT be reused or redefined within the same paradigm version (X, §8). |
side | L/R (paired) or none (centerline). |
definition | One-sentence human-readable meaning. |
−1 … +1 | Semantics of the two poles (real-unit max in parentheses). |
dof | Degrees of freedom. |
affect | Whether the dimension accepts an expression delta (h b f m only). |
default | Neutral normalized value. |
4.1.arm
Hand position in the neck-centric frame, with a separate calibrated length scale
for each axis, plus elbow spread. All bipolar except a_spread (unipolar).
| Axis | Calibrated reference distance d |
|---|---|
| X | wrist_r to middle_tip_r: wrist to middle fingertip, hand in its open bind pose |
| Y | neck to navel: neck to navel, body in its bind pose |
| Z | shoulder_r to wrist_r: shoulder to wrist with the arm fully extended, preserving its native wrist orientation |

Legend: each drawn segment is the reference distance d of one axis — X wrist_r → middle_tip_r (hand open, bind pose) · Y neck → navel (bind pose) · Z shoulder_r → wrist_r (arm fully extended, native wrist orientation). The axis unit is L = 2 · r · d, not the drawn length itself; a normalized value n moves the hand n × max × L along that body-frame axis. The right side defines the units for both arms; distances are never remeasured from the animated pose.
Distances MUST be measured between calibrated Body sites, including their bone-local offsets, in fixed reference poses. They MUST NOT be remeasured from the animated posture: bending the elbow, curling a finger or turning the body must not change the units. The right-side reference defines the common units for both arms; left/right position signs still follow §3.2. A change to calibrated sites or effective hand geometry requires recomputing the affected reference distances.
For each axis, the physical unit is , where d is the calibrated
reference distance above and r is a fixed per-axis reference ratio defined by the
official reference avatar (based); it retains the established numeric scale. Thus the
X unit is 2 · r · hand length (wrist → middle fingertip), the Y unit is 2 · r · torso
length (neck → navel) and the Z unit is 2 · r · arm length (shoulder → wrist, extended);
no unit is the bare length itself. A normalized arm coordinate
n produces a displacement along its body-frame axis, before
anchor/contact corrections. Equivalently, a consumer using shoulder-width units
multiplies that axis by . Thus shoulder width alone no
longer defines arm placement across avatars. The registry ids, maxima and defaults
below remain unchanged.
A consumer lacking a valid reference measurement SHOULD use its legacy shoulder-width unit for that axis and report the missing calibration. Such a fallback does not establish calibrated-axis conformance for that avatar.
| id | side | definition | −1 … +1 | dof | default |
|---|---|---|---|---|---|
a_hand_x | L/R | Hand sideways position, in units of L_X = 2 · r · calibrated hand length (wrist → middle fingertip) | −1 = across to far side · +1 = out past own shoulder (max 1.5) | 1 | 0.333 |
a_hand_y | L/R | Hand height, in units of L_Y = 2 · r · calibrated torso length (neck → navel) | −1 = low/by hip · +1 = high overhead (max 1.5) | 1 | −0.933 |
a_hand_z | L/R | Hand forward reach, in units of L_Z = 2 · r · calibrated arm length (shoulder → wrist, extended) | −1 = tucked to body · +1 = fully forward (max 1.5) | 1 | 0.35 |
a_spread | L/R | Elbow spread | 0 = tucked to ribs · +1 = elbow out (unipolar, max 1) | 1 | 0.4 |
4.2.palm facing
Wrist orientation as the vector part of a body-frame global unit quaternion (w
reconstructed on decode); gimbal-free. Identity (0,0,0) = palm to front, fingers up.
The right hand mirrors across the sagittal plane. Defaults encode "hand hangs following
the forearm, palm toward body".

Legend: identity (0,0,0) = palm toward the viewer (+z), fingers up (+y), shown on the right hand (thumb on the viewer's left). w_qx rotates about x (pitch), w_qy about y (pronate), w_qz about z (roll); axes as in Figure 2.
A consumer MUST reconstruct the scalar part from the unit-length constraint:
If the squared norm of the vector part exceeds 1, the consumer MUST rescale the vector
part to length at most 1 before reconstructing, and SHOULD clamp it slightly below 1
(e.g. 0.98) to avoid the singularity near w = 0. Taking w ≥ 0 always also makes the
representation unambiguous (q and −q are the same rotation).
| id | side | definition | −1 … +1 | dof | default |
|---|---|---|---|---|---|
w_qx | L/R | Quaternion x (pitch axis) | −1 … +1 (max 1) | 1 | 0.885 |
w_qy | L/R | Quaternion y (pronate axis) | −1 … +1 (max 1) | 1 | −0.093 |
w_qz | L/R | Quaternion z (roll axis) | −1 … +1 (max 1) | 1 | −0.429 |
4.3.fingers
Per finger curl / fold / side on both hands; the thumb adds a 4th DOF (roll).
The thumb is bound ~90° rotated, so its fold = opposition (across the palm) and side
= abduction (in/out of the palm plane). g_thumb_roll is frequently unobservable from
2D pose; a producer that cannot estimate it MUST emit the default (0). All bipolar,
max 1, default 0.

Legend: columns −1 · 0 · +1. Curl (top row; joints marked): −1 = the finger curves backward along its middle and tip joints · 0 = straight · +1 = hooked toward the palm. Fold (middle row; base-knuckle pivot marked): the whole straight finger rotates about the base knuckle — −1 = raised backward · 0 = straight · +1 = folded down toward the palm (≈ 90°). Side (bottom row, index finger highlighted): −1 = toward the thumb · +1 = toward the pinky.

Legend: right hand, palm toward the viewer; columns −1 · 0 · +1. Thumb fold = opposition (top row): −1 = swung away from the palm · +1 = across the palm toward the pinky base. Thumb side = abduction (bottom row): −1 = in, pressed to the palm · +1 = out of the palm plane, toward the viewer. Thumb roll is not drawn.
| id | side | definition | −1 … +1 | dof | default |
|---|---|---|---|---|---|
g_{thumb,index,middle,ring,pinky}_curl | L/R | Finger curl (PIP/DIP toward palm) | −1 = bent back (hyperextended) · 0 = straight · +1 = fully curled | 1 | 0 |
g_{index,middle,ring,pinky}_fold | L/R | MCP base-knuckle fold | −1 = folded backward · 0 = straight · +1 = folded toward palm | 1 | 0 |
g_thumb_fold | L/R | Thumb opposition (sweep across palm to pinky base) | −1 = away · +1 = across palm | 1 | 0 |
g_{index,middle,ring,pinky}_side | L/R | Finger spread | −1 = toward thumb · +1 = toward pinky | 1 | 0 |
g_thumb_side | L/R | Thumb abduction (in/out of palm plane) | −1 = in · +1 = out | 1 | 0 |
g_thumb_roll | L/R | Thumb roll/pronation | −1 = pad out of palm facing · +1 = pad in | 1 | 0 |
4.4.head (affect-capable)
Head Euler angles (stored bipolar, degrees). Affect-capable.
| id | side | definition | −1 … +1 | dof | affect | default |
|---|---|---|---|---|---|---|
h_yaw | none | Turn left/right | ±80° (max 80) | 1 | yes | 0 |
h_pitch | none | Nod up/down | ±60° (max 60) | 1 | yes | 0 |
h_roll | none | Tilt head | ±50° (max 50) | 1 | yes | 0 |
4.5.body (affect-capable)
Torso motion distributed along the spine (degrees). Affect-capable.
| id | side | definition | −1 … +1 | dof | affect | default |
|---|---|---|---|---|---|---|
b_twist | none | Twist torso left/right | ±60° (max 60) | 1 | yes | 0 |
b_bend | none | Bend forward/back | ±50° (max 50) | 1 | yes | 0 |
b_lean | none | Lean sideways | ±40° (max 40) | 1 | yes | 0 |
4.6.face (affect-capable)
Bipolar expression dims; each drives one or more ARKit-named morph channels per direction. All max 1, default 0. Affect-capable.
| id | side | definition | −1 … +1 | dof | affect | default |
|---|---|---|---|---|---|---|
f_brow_inner | none | Inner brow | −1 = furrow (angry) · +1 = raise | 1 | yes | 0 |
f_brow | L/R | Outer brow | −1 = down · +1 = up | 1 | yes | 0 |
f_eye | L/R | Eyelid | −1 = blink-shut · +1 = wide | 1 | yes | 0 |
f_squint | L/R | Eye squint | 0 = neutral · +1 = squeezed (plus-only) | 1 | yes | 0 |
f_nose | none | Nose wrinkle / sneer | 0 = neutral · +1 = wrinkled (plus-only) | 1 | yes | 0 |
4.7.mouth (affect-capable)
Bipolar mouth/oral shapes; each recruits several ARKit morphs per direction so the extremes reach strong shapes (yawn, kiss, bared teeth). Cheeks, tongue, and teeth are oral articulators grouped here. All max 1, default 0. Affect-capable.
| id | side | definition | −1 … +1 | dof | affect | default |
|---|---|---|---|---|---|---|
m_mouth | L/R | Mouth corner | −1 = frown · +1 = smile | 1 | yes | 0 |
m_jaw | none | Jaw | −1 = clench · +1 = open (to yawn) | 1 | yes | 0 |
m_lips | none | Lip rounding | −1 = funnel · +1 = pucker | 1 | yes | 0 |
m_wide | none | Mouth width | −1 = narrow (/u/) · +1 = wide (signed) | 1 | yes | 0 |
m_roll | none | Lip roll | −1 = lower over upper · +1 = upper over lower | 1 | yes | 0 |
m_press | none | Lip press | −1 = relaxed-parted · +1 = pressed/tensed (signed) | 1 | yes | 0 |
m_fwd | none | Mouth/jaw thrust | 0 = neutral · +1 = forward (plus-only) | 1 | yes | 0 |
m_cheek | none | Cheek | −1 = suck in · +1 = puff out (signed) | 1 | yes | 0 |
m_tongue | none | Tongue out | 0 = in · +1 = out/lick (plus-only, best-effort) | 1 | yes | 0 |
m_teeth | none | Teeth bared (lips retracted) | 0 = neutral · +1 = bared (plus-only) | 1 | yes | 0 |
When mouthing is active, the artist viseme_* morph remains the primary shape and
m_* is a bounded delta from that shape. The normalized viseme mix supplies a
share-weighted implied baseline b; decode sends only
through the ARKit mouth channels. Therefore an
authored zero leaves the artist viseme untouched, a same-direction adjustment uses
only the remaining range, and an opposing adjustment can cancel it. The conservative
seed table is viseme_aa → m_jaw +0.7 and
viseme_PP → m_jaw −0.7, m_press +0.7; other pairs imply zero until tuned.
4.8.hyper conditions
Discrete/conditional channels carried alongside the continuous vector — see §3.4. (Section renamed from "4.cat categorical channels" in pre-release drafts; ids unchanged.)
| id | domain | owner group | stage | definition |
|---|---|---|---|---|
eye_lookat | enum | face | decode | Gaze target (front / left hand / right hand / glance left, right, up, down). |
viseme | sparse map viseme_* → 0…1 | mouth | decode | Mouthing: a sparse map of viseme_* shape ids to their share, e.g. {viseme_PP: 0.7, viseme_aa: 0.3} — an absent id is 0, {} is no mouthing, and the shares sum to at most 1. SEVERAL shapes may be active at once (each id is its own morph channel, so decode assigns each share directly), and because the value is continuous two mouth keys crossfade on interpolation instead of snapping. A map that arrives over budget is clamped per entry then scaled back onto 1. |
contact | mover site → target site | arm (mover side) | post-processing | The mover body site connects to the target site on the fully decoded body; target never moves (§3.4). |
anchor | body site per arm side | arm (per side) | post-processing | An anchored arm's position is measured from its site instead of the neck; an arm with no anchored keys never moves; contact wins on its mover side (§3.4). |