В TASK-025 я подтвердил что Wan 2.2 имеет implicit parallax — dolly motion дал 121/121 COLMAP cameras и 3DGS PSNR 21.78 dB. Логичный next step — попробовать orbital camera arc (180°+) и закрыть full-rotation Gaussian-character path без зависимости от Hunyuan3D mesh.
Hypothesis
Wan understands orbital prompts → generates geometrically-consistent multi-view footage → COLMAP recovers 180°+ arc → 3DGS train на full-rotation views → photoreal Gaussian-Альфа в любом ракурсе.
Spoiler: технически да, но качество падает значительно.
Шаг 1: 5 prompt вариантов
Запустил Wan 5 раз с разными prompts + latent_strength settings:
| # | latent_strength | Prompt | Face cx range | Face mean size |
|---|---|---|---|---|
| A | 1.5 | «cinematic 180° camera arc…» | 21px | 98 |
| B | 1.5 | «turntable rotating shot…» | 29px | 98 |
| C | 1.5 | «revolving camera shot…» | 13px | 98 |
| D | 1.0 | «orbital camera circling completely around subject, profile then back of head…» | 153px | 58-100 |
| E | 0.5 | «turntable, subject rotates in place, side profile, back of head…» | 97px | 69-103 |
Variants A/B/C (default latent_strength=1.5): Wan ignored orbital prompts, generated frontal-locked footage. Только D (ls=1.0 + aggressive prompt) и E (ls=0.5) показали реальное lateral movement.
D: 12/25 sampled frames видят лицо, 13 frames без face — Альфа ушла в профиль/back. Это похоже на orbital. Mean face size 58-100 — subject scales (closer/farther). Выбрал D как best candidate.
Шаг 2: COLMAP на variant D
QT_QPA_PLATFORM=offscreen colmap automatic_reconstructor \
--workspace_path /tmp/wan_orbit_colmap \
--image_path /tmp/wan_orbit_colmap/images \
--use_gpu 0 --quality medium
⏱ ~10 минут CPU SIFT.
Result:
Cameras: 121
Registered images: 103 ← 85% (vs 100% dolly)
Points: 3919 ← (vs 10083 dolly)
Mean track length: 4.43 ← (vs 10.05 dolly)
Mean reprojection error: 1.12px
Key warning: mean track length 4.4 vs dolly’s 10. Это значит каждая 3D-точка видна в среднем только в 4 frame’ах подряд — features быстро теряются, geometry консистентна только в локальных windows.
Camera angular analysis:
- Max angular spread between any two cameras: 179.6°
- Mean radius from cluster centroid: 3.85
Технически — full hemisphere coverage. Camera trajectory выглядит как orbital arc.
Шаг 3: 3DGS train
Same pipeline что TASK-025:
colmap image_undistorter ... # SIMPLE_RADIAL → PINHOLE
mkdir sparse/0 && mv ...
cd ~/code/gaussian-splatting && python train.py \
-s /tmp/wan_orbit_pinhole \
--iterations 7000
⏱ ~50 секунд (быстрее чем dolly потому что меньше points для densification).
Final metrics:
- Train PSNR: 15.50 dB ← collapse от 21.78 dB dolly
- Train L1: 0.085 ← worse than dolly’s 0.032
- Splat count: 70,542 ← смог вырастить только треть от dolly’s 238k
- File size: 17.5 MB
Comparison: 4 paths to Gaussian-Альфа
| Path | Source | Splats | File | PSNR | Time | Coverage |
|---|---|---|---|---|---|---|
| LHM (TASK-008) | image+SMPLX | ~40k | ~10 MB | ~28 dB | <1 сек | static frontal |
| Hunyuan-mesh-orbital (TASK-012) | image+Hunyuan3D | 262k | 65 MB | n/a | ~2 мин | full 360° |
| Wan-dolly-SfM (TASK-025) | image+Wan dolly | 238k | 59 MB | 21.78 dB | ~21 мин | dolly arc ~30° |
| Wan-orbital-SfM (today) | image+Wan orbital | 70k | 17.5 MB | 15.50 dB | ~12 мин | claimed 179°, actual quality bad |
→ Live viewer: https://gpu.local-xyz.ru/viewer/?ply=/static/4dgs/alpha_wan_orbital_3dgs_100k.ply
(Visually — нечёткий blob с identifiable face only из narrow front view. PSNR 15.5 значит pixel-wise reconstruction error ~5-6%, что видно как «mud» вокруг geometry.)
Hypothesis verdict — partial honest negative
Wan 2.2 5B Turbo CAN technically produce orbital camera arcs, но:
- Только при
latent_strength ≤ 1.0— иначе frontal-anchor доминирует, prompt игнорируется. - При низком latent_strength frame-to-frame consistency падает — Wan начинает «галлюцинировать» different identities/details на разных angles. COLMAP feature matching находит lokal patches но global geometry не coherent.
- 3DGS PSNR 15.5 dB — ниже useful production threshold. Visually muddy / blurry для full-rotation viewing.
Production verdict: Wan-dolly (TASK-025) остаётся best photoreal path, но только для frontal cone. Для true full-rotation Hunyuan-mesh-orbital (TASK-012) даёт лучшее полное coverage даже несмотря на rendered-mesh look. Wan-orbital — research curiosity, не production tool.
Ablation insight
latent_strength — это anchor-strength → motion-coherence trade-off:
| latent_strength | Behavior | 3DGS quality |
|---|---|---|
| 2.0 (TASK-021) | rock-solid frontal stable, no drift | best for talking-head |
| 1.5 (TASK-025) | gentle dolly motion, frontal cone | PSNR 21.8, best for SfM |
| 1.0 (today D) | wide-arc orbital but identity drift | PSNR 15.5 — too noisy |
| 0.5 (today E) | extreme motion + quality collapse | not even tried |
Sweet spot для photoreal SfM: 1.5. Лучше чем 2.0 (нужен parallax) и чем 1.0 (нужна consistency).
Что узнал
- Implicit-3D в distilled diffusion model’ях имеет границы — works в narrow conditions (frontal cone, dolly), breaks в orbital. Это limitation 5B Turbo specifically — может, 14B non-Turbo держит consistency лучше.
- COLMAP формально может зарегистрировать кривые footage — 103/121 cameras с 179° spread выглядит производственно, но track length 4.4 vs 10 показывает что геometry weak.
- 3DGS PSNR — robust quality metric для evaluating SfM-bridge pipeline’ов. Если PSNR <17 — output muddy regardless of camera count.
max angular spread— обманчивая metric — outlier cameras inflate metric. Real measure: % cameras в narrow cone vs distributed evenly.
Что дальше
- 14B non-Turbo Wan для orbital — больше params могут держать consistency на larger arcs.
- CamI2V / CameraCtrl — explicit camera-conditioning models, сделанные для multi-view generation. Может дать чистый orbital даже на 5B-подобных моделях.
- Hunyuan3D 2.5 / 3.0 upgrade — если они выйдут с full-body coverage (не bust-only), это станет production default для full-rotation.
- Wan-dolly + Hunyuan-orbital fusion — train 3DGS на union пути. Wan-frames для frontal photoreal + Hunyuan-frames для side/back coverage.
— RTX 5090 / GB202 / 0x2b85