# Optimized character delivery

Ship only these three GLBs from this directory:

| File | Bytes | Render primitives | Triangles | Joints |
|---|---:|---:|---:|---:|
| astronaut-visitor.glb | 1,176,196 | 3 | 38,496 | 17 |
| alien-visitor.glb | 317,776 | 5 | 51,562 | 17 |
| hedgehog.glb | 706,516 | 18 | 99,930 | 6 |

Total: 2,200,488 bytes. These GLBs require Three.js GLTFLoader with MeshoptDecoder. No external textures are needed. The decoded, joined and pose-named GLBs beside them are QA intermediates, not shipping assets.

## Preserved coordinates and materials

All face -Z with +Y up and rest feet at Y=0. Preserve AssetRoot; it carries scale and orientation. Astronaut height 1.72 m; alien 1.65 m. Hedgehog length .32 m, width .162 m, height .130 m. No authored animation clips.

Use SkeletonUtils.clone per avatar, then clone materials for independent tints. Material names remain intact, including SuitFabricAtlas, SuitAccent, VisorGlass, Visitor sage skin and Obsidian eyes. The astronaut atlas retains red trim; multiplication alone cannot turn that trim freely into any saturated color.

Humanoid joints: Root, Spine, Chest, Neck, Head, UpperArm_L, Forearm_L, Hand_L, UpperArm_R, Forearm_R, Hand_R, Thigh_L, Shin_L, Foot_L, Thigh_R, Shin_R, Foot_R.

Hedgehog joints: Body, Head, FrontLeg_L, HindLeg_L, FrontLeg_R, HindLeg_R.

## Skin and runtime verification

Humanoid skin weights were repaired before compression. Astronaut helmet is rigidly attached to Head; hoses, panel and backpack are anchored to Chest. The alien arms are restricted to their anatomical regions with blended shoulders, elbows and wrists. Finger tips belong to their hands. Head and facial details travel together, with a short neck blend.

The Three.js verification loads the actual compressed files with GLTFLoader and MeshoptDecoder, invokes a read-only snapshot of public/visitor-models.js for 120 frames per state, then exports each resulting pose for independent Blender rendering. Tested states: neutral, walk, cinema, sky, wave and laser. The 1.95-radian wave, 1.05 + .30 pointing arm, 1.13/-1.10 seated legs and .14 + .16 sky neck/head were checked. The former torso/hoses stretching and fingertip spikes are corrected. Some shoulder/hip creasing remains in these stylized rigs at large bends; they are not motion-capture character assets.

Named joints, skeleton structure and triangle counts survive optimization. Rest bounding differences from the uncompressed models are below .01 mm. Meshopt and joining reduce hedgehog primitives from 54 to 18 and alien primitives from 10 to 5 without mesh decimation.

The current runtime's container-relative joint-axis conversion is appropriate: retain authored bone quaternions, transform desired container axes into bone coordinates, then apply the delta. Avoid assigning simple Euler rotations to the authored bones directly. Positive container X raises an arm toward forward -Z; positive Z raises the right arm for a wave.

With sit offsets astronaut -.19 and alien -.17, the sampled soles are 2.8 mm and 1.5 mm above the floor. The sampled walk sole minimum is -8 mm for astronaut and +38 mm for alien; support-foot vertical compensation may improve gait contact. This is a runtime gait detail, not compression drift.

Use Hand_R.getWorldPosition() for the laser origin after avatar.update and updateWorldMatrix(true, true). In the settled pointing pose its local-to-avatar coordinates are astronaut [0.4365, 1.1444, -0.4148], alien [0.2795, 1.0327, -0.3559]. For an emitter inside the palm, transform Hand_R-local [0, .05, 0] by its world matrix. Bone local Y runs from wrist toward fingers.

## Review files

- runtime-poses-contact-sheet.jpg: the six actual runtime poses for both humanoids.
- optimized-character-contact-sheet.jpg: all three compressed characters in neutral state.
- astronaut-visitor-thumbnail.webp, alien-visitor-thumbnail.webp, hedgehog-thumbnail.webp: 320px thumbnails made from the compressed-file renders.
- *-front.png and *-side.png: full-size pose renders, including separate sky checks.
- optimization-verification.json: sizes, triangles, joints and numerical bounds checks.
- runtime-pose-audit.json: posed bounds, container Y and all joint positions/quaternions.
- repaired-source/*.blend and repaired-source/*.glb: editable repaired humanoid source assets.

No site files were edited for this delivery. This was numerical and offline visual QA; it was not a browser rendering test.

## Attribution

Astronaut by Poly, licensed under CC BY 2.0. Modified for this project: smoothed, rigged, skin weights repaired, normalized, texture resized, material accents separated and compressed.

Source attribution: https://github.com/google/model-viewer/blob/master/packages/modelviewer.dev/ATTRIBUTIONS.md

Original asset: https://modelviewer.dev/shared-assets/models/Astronaut.glb

License: https://creativecommons.org/licenses/by/2.0/

Alien and hedgehog are original geometry authored for this project, with no third-party model or texture dependency.
