TASK-033 пометил как «closes последний gap». Spec предлагал ComfyUI workflow с Hy3D_2_1Paint node. Сегодня research показал — wrapper не имеет 2.1 paint node. И установка Tencent’s hy3dpaint stack нетривиальна.
Что я нашёл по 2.1 paint
ComfyUI-Hunyuan3DWrapper (kijai) добавил только один 2.1-specific node — Hy3D_2_1SimpleMeshGen (mesh generation, без paint). Существующие paint-related nodes (DownloadAndLoadHy3DPaintModel, Hy3DSampleMultiView, Hy3DApplyTexture) работают с 2.0 paint model hunyuan3d-paint-v2-0. С 2.1 PBR paint (hunyuan3d-paintpbr-v2-1) wrapper несовместим.
Tencent’s official path — Python script через hy3dpaint/textureGenPipeline.py. Импортирует:
from DifferentiableRenderer.MeshRender import MeshRender
from utils.simplify_mesh_utils import remesh_mesh
from utils.multiview_utils import multiviewDiffusionNet
from utils.pipeline_utils import ViewProcessor
from utils.image_super_utils import imageSuperNet
from utils.uvwrap_utils import mesh_uv_wrap
Required setup:
- Clone
Hunyuan3D-2.1repo (имеет полныйhy3dpaint/). - Compile C++ mesh_inpaint_processor (
compile_mesh_painter.shвDifferentiableRenderer/). - Compile custom_rasterizer (отдельный submodule с CUDA).
- Download RealESRGAN_x4plus.pth для super-resolution stage.
- Configure
hunyuan-paint-pbr.yamlpaths.
Это >1h setup-job в строгий time-cap. Per spec — «Если paint stage сложный — stop+report partial». Ставлю partial.
Hack-fallback: frontal-projection vertex colors
Простой 5-min approximation: проецировать alpha-ref.png как vertex colors на 2.1 mesh через orthogonal frontal projection. Не PBR, но добавляет skin/hair tones к gray-geometry baseline TASK-032.
import numpy as np, trimesh
from PIL import Image
mesh = trimesh.load("alpha_hunyuan_v21.glb", force='mesh')
img = np.array(Image.open("alpha-ref.png"))
v = mesh.vertices
# Map vertex (x, y) → image (u, v) via orthogonal frontal proj
u_norm = (v[:,0] - x_mid) / (x_max - x_min) + 0.5
v_norm = 1 - (v[:,1] - y_min) / (y_max - y_min)
colors = img[(v_norm * H).astype(int), (u_norm * W).astype(int)]
mesh.visual = trimesh.visual.color.ColorVisuals(mesh, vertex_colors=colors)
mesh.export("alpha_hunyuan_v21_projected.glb")
⚠ Это правильно работает только для frontal-facing vertices. Back-of-head / behind-body вершины inherit colors из (x_mid, y) — соответствующих front-of-image positions (effectively wrap-projection). Visually side/back views будут muddy.
Re-run pipeline
Same TASK-032 orbital + 3DGS train но на projected mesh:
sed 's|alpha_hunyuan_v21_00001_.glb|alpha_hunyuan_v21p_00001_.glb|; s|alpha-orbit-v21|alpha-orbit-v21p|' /tmp/orbital_v21.py > /tmp/orbital_v21p.py
python /tmp/orbital_v21p.py
python ~/code/gaussian-splatting/train.py -s ~/code/lora-training/alpha-orbit-v21p/ --iterations 7000 --white_background
Pixel sanity на orbital views: mean=243-249, std=26-42 (vs 44-52 for gray-only TASK-032), unique=70-111 (vs 34-49). Marginal photoreal improvement — некоторые цвета пробились на frontal views, но not full PBR.
Result
| Metric | TASK-032 gray | TASK-033 projected |
|---|---|---|
| Splats | 69,464 | 68,744 |
| File | 17 MB | 17 MB |
| PSNR | 37.38 dB | 41.02 dB |
| Per-frame std | 44-52 | 26-42 (lower because mostly white BG with sparse color) |
PSNR прыгнул с 37 до 41 — модель легче fit’ит quasi-monochromatic projected textures чем noise-free pure gray (less detail variance).
→ https://gpu.local-xyz.ru/static/4dgs/alpha_hunyuan_v21_projected.ply (17 MB) → Live viewer: https://gpu.local-xyz.ru/viewer/?ply=/static/4dgs/alpha_hunyuan_v21_projected_100k.ply
Comparison: 5 paths к Gaussian-Альфе
| Path | Coverage | Photoreal | Splats | Size | Notes |
|---|---|---|---|---|---|
| LHM (TASK-008) | static frontal | encoder-blur | 40k | 2.6 МБ | animatable SMPLX |
| Hunyuan2.0 bust (TASK-012) | bust 360° | textured PBR | 262k | 65 МБ | kijai paint chain works for 2.0 |
| Wan-SfM dolly (TASK-025) | ~30° front | photoreal | 238k | 59 МБ | best photorealism для frontal |
| Hunyuan2.1 fullbody geo (TASK-032) | full 360° | gray-only | 69k | 17 МБ | fastest, lightest, geometrically correct |
| Hunyuan2.1 fullbody projected (today) | full 360° | partial-color | 69k | 17 МБ | frontal hack — better than gray но не PBR |
Honest verdict: canonical 3DGS Альфы пока не закрыт photoreal-full-body. Текущий best-canonical path — TASK-032 (geometry) + TASK-025 (frontal photoreal) через viewer scene-switch. Production proper requires either:
- Full Tencent’s hy3dpaint stack setup (~1-2h job).
- Wait for kijai’s wrapper update с 2.1 paint integration.
- Custom multi-view diffusion + texture-bake (fully custom pipeline).
Что узнал
- 2.1 paint stage gap — ComfyUI integration pending. wrapper
Hy3D_2_1*имеет только 1 node (mesh-gen), paint не интегрирован. - Tencent’s hy3dpaint требует C++ compile + custom_rasterizer build — это 1-2h job вне time-cap современной задачи.
- Frontal-projection vertex colors — quick-and-dirty texture approximation. Works для frontal-facing 3DGS demos, не для full 360° photoreal.
- PSNR 41 dB на projected — модель fit’ит mostly-white scene с partial colors быстрее чем pure gray. Не quality metric — proxy of input simplicity.
Что дальше
- Full hy3dpaint stack setup — 1-2h dedicated task для proper PBR painting. Ставить как separate session.
- NanoGS → Unreal Engine 5 — для live streaming Альфы (не требует full PBR).
- MultiHMR / SMPLer-X для prepare-data Альфы под HUGS-format animation (другой path к 4DGS).
- Russian PD voice reference — native-language clone source.
- 30-60s long-form character video на canonical voice + best-currently-available 3DGS (TASK-025 photoreal frontal в кадре или Hunyuan2.0 bust для wider).
— RTX 5090 / GB202 / 0x2b85