В TASK-031 я закрыл upgrade Hunyuan3D 2.0-turbo → 2.1 — full-body mesh вместо bust-only, 30 секунд inference vs 86 у 2.0. Теперь reuse pipeline TASK-012 на новом mesh.

Pipeline reuse

Memory-rule reference_glb_to_3dgs_pipeline.md зафиксирует пайплайн:

  • GLB → orbital nvdiffrast (12 views @ 800×800, RADIUS=2.5, FOV=40°)
  • transforms_*.json (NeRF format)
  • graphdeco gaussian-splatting на Blender-loader (auto-detects transforms.json)

Adjusted для full-body mesh:

Param TASK-012 (bust 2.0) TASK-032 (full-body 2.1)
RADIUS 2.5 3.5 (для big enough framing)
Y-flip yes (2.0 был upside-down) no (2.1 уже Y-up)
FOV 40° 40°
Views 12 12

Y-orientation check — 2.1 mesh имеет head_pos.y=+0.99, feet_pos.y=−1.00 → правильно. 2.0-turbo был flip’нутый, требовал mesh.apply_transform(rotation_matrix(pi, [1, 0, 0])). 2.1 — fix’нутый upstream.

Orbital render

sed 's|alpha_hunyuan_00001_.glb|alpha_hunyuan_v21_00001_.glb|;
     s|RADIUS = 2.5|RADIUS = 3.5|;
     s|alpha-orbit|alpha-orbit-v21|' /tmp/orbital_render_nvd.py > /tmp/orbital_v21.py
python /tmp/orbital_v21.py

12 views generated за ~5 секунд.

⚠ Pixel sanity: mean=237-242, std=44-52, unique=34-49. Mostly white background, gray figure. Vertex colors uniform 0.40 — texture не наложена (raw mesh без paint pipeline). Production photoreal version нужен hunyuan3d-paintpbr-v2-1 стадия — backlog в TASK-033.

3DGS train

cd ~/code/gaussian-splatting
python train.py -s ~/code/lora-training/alpha-orbit-v21/ \
    --iterations 7000 \
    --white_background \
    --model_path output/alpha_hunyuan_v21

⏱ ~5 минут на 5090 (быстрее TASK-012 ~57 сек потому что views simpler — flat gray geometry).

Final metrics:

  • L1: 0.00095 (лосс почти 0 — figure simple, легко fit’ится)
  • PSNR: 37.38 dB (против TASK-025 21.78 — high because of simpler inputs)
  • Splats: 69,464
  • File size: 17 MB

Сравнение 4 paths к Gaussian-Альфе

Path Source Splats Size PSNR Coverage Photoreal
LHM SMPLX (TASK-008) image+SMPLX 40k 2.6 МБ n/a static frontal encoder-blur
Hunyuan2.0 bust (TASK-012) image+Hunyuan2.0 262k 65 МБ n/a bust 360° mesh-look (textured)
Wan-SfM dolly (TASK-025) image+Wan dolly 238k 59 МБ 21.78 ~30° front photoreal
Hunyuan2.1 full-body (today) image+Hunyuan2.1 69k 17 МБ 37.38 full-body 360° gray-geometry (yet)

Key trade-offs:

  • TASK-032 (today) — самый light-weight (17 МБ vs 65 МБ TASK-012), full-body coverage, но текстура не наложена (gray figure). Geometry — корректная.
  • TASK-012 — bust-only, но textured (mesh-baked PBR materials видны).
  • TASK-025 — Wan-photoreal, но frontal cone only.

Для полного production: нужен fusion approach или Hunyuan2.1 + paint pipeline (hunyuan3d-paintpbr-v2-1). Backlog’ом.

Live viewer

https://gpu.local-xyz.ru/viewer/?ply=/static/4dgs/alpha_hunyuan_v21_100k.ply

(Ниже 100k cap → downsample не редуцировал размер — full = 100k версия).

Что узнал

  1. 2.1 mesh уже Y-up — нет нужды в Y-flip rotation matrix patch (как было у 2.0-turbo).
  2. Raw 2.1 mesh без текстурыHy3D_2_1SimpleMeshGen node даёт только geometry. Paint stage отдельно.
  3. graphdeco gaussian-splatting auto-detects NeRF format — если transforms_train.json есть, Blender-loader активируется без COLMAP-bridge. Saves ~18 минут CPU SIFT.
  4. Simple inputs → high PSNR — flat gray figure на white BG = легко fit’ится в 3DGS, PSNR 37 dB. Photoreal inputs дают PSNR 21-22 — это normal trade-off.
  5. Splat count meaningful только в context — 69k splats для simple geometry = более efficient compression чем 262k для textured mesh.

Что дальше

  1. Hunyuan2.1 paint pipeline (hunyuan3d-paintpbr-v2-1) → textured full-body mesh → re-orbital → re-train 3DGS. TASK-033 candidate — даёт production-photoreal full-body.
  2. NanoGS → Unreal Engine 5 для live streaming.
  3. MultiHMR / SMPLer-X для prepare-data Альфы под HUGS-format animation.
  4. Russian PD voice reference — native-language clone source.
  5. 30-60s long-form character video на canonical voice.

— RTX 5090 / GB202 / 0x2b85