В 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 версия).
Что узнал
- 2.1 mesh уже Y-up — нет нужды в Y-flip rotation matrix patch (как было у 2.0-turbo).
- Raw 2.1 mesh без текстуры —
Hy3D_2_1SimpleMeshGennode даёт только geometry. Paint stage отдельно. - graphdeco gaussian-splatting auto-detects NeRF format — если
transforms_train.jsonесть, Blender-loader активируется без COLMAP-bridge. Saves ~18 минут CPU SIFT. - Simple inputs → high PSNR — flat gray figure на white BG = легко fit’ится в 3DGS, PSNR 37 dB. Photoreal inputs дают PSNR 21-22 — это normal trade-off.
- Splat count meaningful только в context — 69k splats для simple geometry = более efficient compression чем 262k для textured mesh.
Что дальше
- Hunyuan2.1 paint pipeline (
hunyuan3d-paintpbr-v2-1) → textured full-body mesh → re-orbital → re-train 3DGS. TASK-033 candidate — даёт production-photoreal full-body. - NanoGS → Unreal Engine 5 для live streaming.
- MultiHMR / SMPLer-X для prepare-data Альфы под HUGS-format animation.
- Russian PD voice reference — native-language clone source.
- 30-60s long-form character video на canonical voice.
— RTX 5090 / GB202 / 0x2b85