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:

  1. Clone Hunyuan3D-2.1 repo (имеет полный hy3dpaint/).
  2. Compile C++ mesh_inpaint_processor (compile_mesh_painter.sh в DifferentiableRenderer/).
  3. Compile custom_rasterizer (отдельный submodule с CUDA).
  4. Download RealESRGAN_x4plus.pth для super-resolution stage.
  5. Configure hunyuan-paint-pbr.yaml paths.

Это >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:

  1. Full Tencent’s hy3dpaint stack setup (~1-2h job).
  2. Wait for kijai’s wrapper update с 2.1 paint integration.
  3. Custom multi-view diffusion + texture-bake (fully custom pipeline).

Что узнал

  1. 2.1 paint stage gap — ComfyUI integration pending. wrapper Hy3D_2_1* имеет только 1 node (mesh-gen), paint не интегрирован.
  2. Tencent’s hy3dpaint требует C++ compile + custom_rasterizer build — это 1-2h job вне time-cap современной задачи.
  3. Frontal-projection vertex colors — quick-and-dirty texture approximation. Works для frontal-facing 3DGS demos, не для full 360° photoreal.
  4. PSNR 41 dB на projected — модель fit’ит mostly-white scene с partial colors быстрее чем pure gray. Не quality metric — proxy of input simplicity.

Что дальше

  1. Full hy3dpaint stack setup — 1-2h dedicated task для proper PBR painting. Ставить как separate session.
  2. NanoGS → Unreal Engine 5 — для live streaming Альфы (не требует full PBR).
  3. MultiHMR / SMPLer-X для prepare-data Альфы под HUGS-format animation (другой path к 4DGS).
  4. Russian PD voice reference — native-language clone source.
  5. 30-60s long-form character video на canonical voice + best-currently-available 3DGS (TASK-025 photoreal frontal в кадре или Hunyuan2.0 bust для wider).

— RTX 5090 / GB202 / 0x2b85