HELIX Docs
CLI & AI toolsCommand reference

helix character

Character asset tools — convert biped GLBs and retarget GLB/FBX animations

CLI version 0.1.27-helix3.551. Run helix character --help for the text your installed build prints.

helix character

Character asset tools — convert biped GLBs and retarget GLB/FBX animations

helix character <command>

helix character import

Convert a Meshy/Mixamo-style biped GLB into a helix-humanoid@1 character: conform onto the canonical skeleton, generate LODs, encode KTX2

helix character import [options] <body>
ArgumentRequiredDescription
bodyyessource biped character GLB (skinned body)
OptionDescription
--map <json>bone map JSON file (default: the bundled Meshy->helix map)
--canonical <glb>canonical helix body GLB (default: the world's installed humanoid-character pack when present, else the embedded helix-humanoid@1 skeleton)
--anim <glb>also retarget this animation GLB (same source rig) -> <out>/anims/<clipName>.glb
--clip-name <name>clip name for --anim (default "locomotion.warriorWalk")
-o, --output <dir>output directory (default "./character-out")
--name <base>output basename -> <base>.web.glb (default: derived from the input file name)
--provenance <json>source/license JSON; emits a pinned <name>.avatar-import.json receipt
--face-map <json>explicit helix/avatar-face@1 semantic mapping (default: conservative known-name detection; avatars with no face channels remain valid)
--fit <mode>rest fit: 'source' preserves the model; 'canonical' aligns joints/proportions to the pinned HELIX rest (garment fit still requires visual proof) (default "source")
--lod-tris <a,b,c>triangle target per LOD level, high->low (default "10000,5000,1500")
--tex-size <n>texture longest-edge cap; the rebake route halves it per LOD level (default "1024")
--ktx-mode <m[,m2..]>KTX2 codec per LOD level, etc1s or uastc; shorter lists repeat the last entry (default uastc,etc1s — UASTC up close, ETC1S far)
--ktx-quality <n>etc1s qlevel 1..255 / uastc level 0..4
--no-ktx2keep the source png/jpeg textures instead of encoding KTX2 (for pipelines that scan or re-encode textures downstream)
--simplify-error <e>meshopt error budget (imports resist collapse; raise if LODs miss target) (default "0.02")
--lock-borderpreserve UV-seam/material-boundary verts during decimation (OFF by default for imports)
--bakeforce the weld+unwrap+rebake LOD path (default: AUTO on micro-chart atlases)
--no-bakedisable the weld+unwrap+rebake LOD path
--no-weldalso disable the (non-bake) seam-weld fallback for floored far LODs
--no-split-facekeep each LOD as one mesh (default: head geometry is sliced into a 'FaceMesh' node so first-person mode can hide it)
--no-face-detailrebake route: decimate and unwrap area-blind (default: the face keeps 20% of each LOD's triangles and ~2.25x texel density)
--limb-bridges <mode>arm<->leg bridge geometry (a hand fused to the thigh): repair cuts it and re-weights each side, report only measures and logs what repair would change, off skips it (default "repair")
--rest-pose <mode>joints far off the standard skeleton (foot, ball, calf, clavicle) moved onto it, spine/leg rests made canonical, and the skeleton lifted so the soles clear the floor: repair, report (measure only) or off (default "repair")
--arm-bind <mode>re-bind arms bound below the platform A-pose (and lift a hanging head) so clips move them like Base Female: repair, report or off (default "repair")
--sleeve-allowance <deg>extra outward arm angle over the A-pose, or 'auto' (from the measured sleeve thickness) (default "auto")
--head-pitch <deg>head lift (positive = chin up), or 'auto' (from the measured face profile); 0 = off (default "auto")
--static-weights <mode>hair and loose cloth skinned static to the body (no arm/clavicle weight in back hair): repair, report or off (default "repair")

helix character fit

Pose-aware poke-through fit for a packaged character add-on GLB: push garment geometry clear of the posed base body across the canonical pose set, gated so the result is kept only if the poke-through check is strictly better

helix character fit [options] <garment>
ArgumentRequiredDescription
garmentyespackaged add-on GLB (every LOD level is fitted)
OptionDescription
--body <glb>the base body GLB the add-on is worn on (Base Male / Base Female) (required)
-o, --output <glb>output GLB: the fitted mesh when improved, otherwise a byte-identical copy of the input (required)
--slot-type <slotType>scope the fit and its gate to this slot type's granted hide regions (e.g. character.top@1)
--hidden-regions <globs>explicit region scope, comma-separated (e.g. body_torso,body_upperarm_l), or 'none' for unscoped; overrides --slot-type
--clearance-mm <mm>target clearance: body ends at least this far behind the garment surface (default 3)
--threshold-mm <mm>gate violation floor, as pokethrough-check --threshold (default 0.5)
--ceiling-mm <mm>deeper than this is not a coverage defect, as pokethrough-check --ceiling (default 10)
--proximity-mm <mm>body points farther than this from the garment are not under it, as pokethrough-check --proximity (default 50)
--max-push-mm <mm>largest total move for an interior garment vertex (default 8)
--hem-max-push-mm <mm>largest total move on a hem/cuff/collar boundary (default 4)
--hem-band-mm <mm>surface distance over which the hem cap ramps back to --max-push-mm (default 20)
--smooth-radius-mm <mm>falloff radius of the smoothing membrane (default 20)
--iterations <n>measure→push iterations (default 6)
--poses <list>pose subset, comma-separated (default: idle,crouch,walk-stride,run-stride,arms-raised)
--ear-clearancealso clear the base body's ears (automatic with --slot-type headwear/mask/hair/eyewear)
--no-ear-clearanceskip the ear-clearance stage
--report <json>also write the full report JSON here
--jsonprint the report JSON on stdout instead of progress lines

helix character ear-clearance

Check (and by default fix) whether the base body's ears poke through a head-zone add-on (headwear, mask, hair, eyewear): measures the clearance between the ear surface and the OUTERMOST garment layer around it, per LOD, and pushes the garment smoothly clear when a wrapped ear has < 1.5 mm. Kept only when no ear pokes afterwards

helix character ear-clearance [options] <garment>
ArgumentRequiredDescription
garmentyespackaged add-on GLB (every LOD level is measured)
OptionDescription
--body <glb>the base body GLB the add-on is worn on (Base Male / Base Female) (required)
-o, --output <glb>output GLB: the fixed mesh when improved, otherwise a byte-identical copy of the input (omit with --check)
--checkmeasure only — write nothing; exit 3 when an ear pokes through
--target-mm <mm>clearance the fix aims for (default 4)
--trigger-mm <mm>a wrapped ear sample with less clearance than this is a poke-through (default 1.5)
--max-push-mm <mm>largest total move for any garment vertex (default 18)
--sigma-mm <mm>falloff radius of the push (default 22)
--report <json>also write the full report JSON here
--jsonprint the report JSON on stdout

helix character derive-hide

Measure which body regions a packaged character add-on GLB fully occludes and print the hide ops that follow (a granted region is hidden only when >= 98% of its vertices have garment in front of them within 60 mm along the normal, bind pose). Include the ops in a new sealed Package Version

helix character derive-hide [options] <garment>
ArgumentRequiredDescription
garmentyespackaged add-on GLB (every LOD level is measured; the least-covered LOD decides)
OptionDescription
--body <glb>the base body GLB the add-on is worn on, in bind pose, with the baked _REGION attribute (Base Male / Base Female) (required)
--slot-type <slotType>the add-on's slot type, e.g. character.bottom@1 — bounds the result to that slot's platform hide grant (required)
--threshold <percent>occluded share a region needs before it is hidden (default 98)
--standoff-mm <mm>how far in front of the skin a garment surface may be and still occlude it (default 60)
--ops-out <file>also write the ops array JSON here for a new sealed Package Version
--jsonprint the full result (coverage per region, hidden/visible sets, ops) as JSON

helix character fix-rig

Fix an imported character's rig in place of hand scripts (the importer's own stages, in its order): a hand fused to the thigh cut free (judged under the arm re-bind), arm weight on geometry that is not the arm (a coat skirt weighted to the hands) moved to the body it hangs from, the arms re-bound onto the platform A-pose (+ an allowance for thick sleeves) and a hanging head lifted, a shoe skinned to the other foot's bones given back to its own foot, then hair and cloth on the back skinned STATIC to the spine/neck/head — identically on every LOD

helix character fix-rig [options] <glb>
ArgumentRequiredDescription
glbyesimported HELIX character GLB (helix-humanoid@1 skeleton)
OptionDescription
-o, --output <glb>output GLB (required)
--rest-pose <mode>joints far off the standard skeleton (foot, ball, calf, clavicle) moved onto it, spine/leg rests made canonical, and the skeleton lifted so the soles clear the floor: repair, report (measure only) or off (default "repair")
--arm-bind <mode>arm/head bind normalisation: repair, report (measure only) or off (default "repair")
--sleeve-allowance <deg>extra outward arm angle over the A-pose, or 'auto' (from the measured sleeve thickness) (default "auto")
--head-pitch <deg>head correction (positive = chin up), or 'auto' (from the measured face pitch vs Base Female); 0 = off (default "auto")
--no-fused-banddo not feather arm weight across a sleeve fused to the torso before the re-bind
--static-weights <mode>arm reach (non-arm geometry off the arms) and hair/back-cloth weight cleanup: repair, report or off (default "repair")
--limb-bridges <mode>arm<->leg (hand fused to the thigh) bridge repair before the re-bind, judged under it: repair, report or off (default "repair")
--jsonprint the report as JSON

helix character repair-lod-skeletons

Repair a packaged multi-LOD add-on whose LOD scenes share one skeleton (helix-creator-cli #219's output, which three.js loads with undefined bones): give every LOD scene its own copy, changing only the node/skin graph

helix character repair-lod-skeletons [options] <glb>
ArgumentRequiredDescription
glbyespackaged add-on GLB
OptionDescription
-o, --output <glb>output GLB: the repaired file, or a byte-identical copy when nothing is shared (required)
--jsonprint the result as JSON

helix character check

Check an avatar GLB BEFORE it is published: walk it, run it and stand it still on the production Marketplace viewer (the candidate is swapped in locally, nothing is uploaded), judge it with the hosted gate's own avatar@3 math plus offline stage-1 and run/idle asserts, and write a tool-owned fixed inspection set (sheets beside Base Female). Free, local, headless.

helix character check [options] <glb>
ArgumentRequiredDescription
glbyesthe avatar GLB (a conformed helix-humanoid@1 character, e.g. the output of helix character import)
OptionDescription
--out <dir>output directory: inspection/ (sheets + index.json), numbers.json, check.json, frames/ (default: <glb dir>/<name>.check)
--jsonprint the full result as JSON instead of the report
--no-inspectionnumbers only: skip the inspection sheets (quick iteration; a run without them is not an inspection)
--no-control-cacherender the Base Female control again instead of using the cached one
--host-item <id>published avatar whose Marketplace page hosts the candidate (default: the smallest that can carry it)
--control-item <id>published avatar drawn beside the candidate as the control (default Base Female)
--chrome <path>Chromium executable (default: the pinned headless Chrome for Testing; the macOS system Chrome is refused)
--api-url <url>platform API base URL
--web-url <url>website base URL (default: the site that serves --api-url)
--dump <dir>calibration: also write what the page read (rest + 16 posed meshes per clip) here

helix character reframe-skeleton

Re-frame a packaged add-on's skeleton onto its host's: re-create the host's root_offset wrapper (Base Female: 0,-0.0331,-0.0049 m) above the part's skeleton and rewrite its inverse-bind matrices, so the engine (host bones x PART inverse binds) draws the part where its mesh was authored instead of 33 mm low. Only the node graph and the IBMs change

helix character reframe-skeleton [options] <glb>
ArgumentRequiredDescription
glbyespackaged add-on GLB (LOD scenes with their own skeletons; run repair-lod-skeletons first if they share one)
OptionDescription
--host <glb>the host body GLB the add-on rides (Base Female) (required)
-o, --output <glb>output GLB: the re-framed file, or a byte-identical copy when nothing to do (required)
--jsonprint the result as JSON

helix character retarget-animation

Retarget one raw Meshy/Mixamo FBX or GLB directly to a helix-humanoid@1 animation clip

helix character retarget-animation [options] <animation>
ArgumentRequiredDescription
animationyessource animation FBX or GLB
OptionDescription
--map <json>bone map JSON file (default: detected Mixamo/Meshy map)
--canonical <glb>canonical helix body GLB (default: the world's installed pack or embedded helix-humanoid@1 skeleton)
--clip-name <name>output clip name (default "locomotion.imported")
--loopmark the imported clip as looping
-o, --output <glb>output GLB path (default ./character-out/anims/<clipName>.glb)

On this page