# 国风循环动画：做法调研与实测（LTX-2.5 首尾帧法）

- **日期**：2026-09-21
- **源图**：`guofeng-red-robes-snow-plum-16x9-seed70707-20260921_00001_.png`（2048×1152，Qwen-Image-2.1 生成）
- **成片**：1280×704 / 121 帧 / 24fps / 5.04s（无缝版 5.08s），h264 + AAC
- **结论**：✅ 用「同一张图同时作首帧和尾帧」的 FLF 思路，让模型自己回到起点，生成的就是天然可循环的动画

---

## 一、循环动画有哪几种做法（调研结论）

| 方案 | 原理 | 优点 | 缺点 | 本机可行性 |
|---|---|---|---|---|
| **A. 首尾帧同图（FLF）** | 同一张图分别作为首帧与尾帧条件，模型必须"走出去再走回来" | 真循环、动作自然、一次生成 | 动作幅度受限（大运镜会撕裂） | ✅ **本次采用** |
| B. 专用循环采样器 | `LTXVLoopingSampler`（Lightricks 官方 ComfyUI-LTXVideo 扩展）在采样时把尾部 latent 与首部对齐 | 官方无缝循环，可长视频分块 | 面向 LTXV 0.9.x 的 latent 结构；LTX-2.5 是音视频双流 latent，未适配 | ⚠️ 节点在（本机已装），未用于 2.5 |
| C. 回文/乒乓（palindrome） | 成片正放 + 倒放拼接 | 100% 数学无缝，任何模型都能用 | 动作会"倒带"，观感偏怪 | ✅ 随时可用（ffmpeg 一行） |
| D. 首尾交叉淡化 | 后期把片尾 N 帧与片头 N 帧叠化 | 消除纹理级差异（雪花/颗粒） | 只治标，动作不闭合时救不回 | ✅ 本次用于出"完美版" |
| E. 长视频分块循环 | `LTXVContextWindows` / VideoChunkTools 等按块延展 | 可做几十秒 | 复杂度高，接缝仍需处理 | 本项目不需要 |

**选型逻辑**：源图是一张静态写意画，需要的不是"大动作"而是"活照片"式的细微循环（发丝、红绸、雪花、呼吸）。这类镜头用 A 方案最合适——只要动作幅度小，模型很容易回到起点；再用 D 做一次 0.4s 叠化，把雪花这类"随机纹理"的接缝也抹平。

参考：
- [ComfyUI 官方蓝图 First & Last Frame to Video (LTX-2.5)]（本机 `/home/zyw/ComfyUI/blueprints/`）
- [LTXVAddGuide 节点文档](https://docs.comfy.org/built-in-nodes/LTXVAddGuide)
- [Wan2.2 FLF2V ComfyUI 原生支持](https://blog.comfy.org/p/wan22-flf2v-comfyui-native-support)（同类"首尾帧"思路的另一种模型）
- [LTXV Looping Sampler](https://comfy.icu/node/LTXVLoopingSampler)（B 方案）
- [LTX-2.5 ComfyUI 工作流示例](https://docs.comfy.org/tutorials/video/ltx/ltx-2-5)
- MiniMax H3 FLF2V（本机也装了官方 `Director-fl2v.json`，是 A 方案的另一条实现路径，质量更高但更慢）

---

## 二、实际采用的方案（LTX-2.5 distilled）

**模型（本机已有，无需下载）**

| 文件 | 大小 | 用途 |
|---|---|---|
| `ltx-2.5-22b-distilled-transformer-comfy-int8-convrot.safetensors` | 21.5 GB | 主干（蒸馏版，8 步） |
| `gemma4-12b-with-proj-ltx-2.5-comfy-int8-convrot.safetensors` | 15.4 GB | 文本编码器 |
| `ltx-2.5-video-vae-bf16.safetensors` / `ltx-2.5-audio-vae-bf16.safetensors` | 1.4 G / 348 M | 视频 / 音频 VAE |

**图结构**（从官方蓝图 subgraph 展平而来）

```
UNETLoader ─┬─→ LTXVDualCFGGuider ─→ SamplerCustomAdvanced ─→ LTXVSeparateAVLatent
VAELoader(video) ─→ LTXVAddGuide(frame_idx=0)   ─┐                    ├→ VAEDecodeTiled →┐
VAELoader(audio) ─→ LTXVEmptyLatentAudio ────────┴→ LTXVConcatAVLatent├→ LTXVAudioVAEDecode→ CreateVideo → SaveVideo
LoadImage(源图) → LTXVPreprocess ─→ LTXVAddGuide(frame_idx=-1)         └→ LTXVCropGuides
CLIPLoader → CLIPTextEncode(pos/neg) → LTXVConditioning(frame_rate=24)
ManualSigmas("1.0,0.99375,…,0.0" 8步) + SamplerEulerAncestral + RandomNoise
```

- **首帧和尾帧是同一张图**（两个 `LoadImage` 指向同一文件），分别用 `LTXVAddGuide` 的 `frame_idx=0` 和 `frame_idx=-1` 挂上，`strength=0.7`。
- 音频轨与视频轨在同一个 latent 里一起采样（`LTXVConcatAVLatent`），所以成片自带环境音。
- 因为官方蓝图是 **subgraph**，`/prompt` API 不能直接吃 → 已展平为脚本 `ltx25_loop.py`。

---

## 三、实测数据

| 项 | 测试片 | 正式片 |
|---|---|---|
| 分辨率 | 768×432 → **实出 768×416** | 1280×704 |
| 帧数 / 时长 | 49 帧 / 2.04s | 121 帧 / 5.04s |
| 生成耗时 | 180s（含首次加载 37GB 权重） | **210s**（ComfyUI 内部 187s） |
| 显存峰值 | 15222 MiB | 15562 MiB / 15866 MiB |
| 接缝 PSNR（首帧 vs 尾帧） | 26.1 dB | **24.4 dB**（对比：首帧 vs 第 90 帧 = 23.6 dB） |

接缝 PSNR 与片中任意两帧的差异同量级 → **首尾视觉上已经接得上**，观众看不到跳变；残留差异集中在雪花位置（随机纹理），用 0.4s 叠化即可完全消除。

⚠️ 尺寸注意：LTX 要求宽高是 **32 的倍数**（720 → 704），帧数必须是 **8n+1**。

---

## 四、复现命令（GPU 机 192.168.31.31）

```bash
# 1) 准备源图（缩到 1280×720 放进 ComfyUI/input/）
ffmpeg -y -i /home/zyw/ComfyUI/output/guofeng-red-robes-snow-plum-16x9-seed70707-20260921_00001_.png \
  -vf scale=1280:720 /home/zyw/ComfyUI/input/ltx-src-guofeng-seed70707-1280x720.png

# 2) 生成循环动画（首尾帧同图）
/home/zyw/ComfyUI/venv/bin/python /home/zyw/ltx25_loop.py \
  /home/zyw/prompt_ltx_loop.txt ltx-src-guofeng-seed70707-1280x720.png \
  guofeng-loop-ltx25-red-robes-snow-plum-seed70707 1280 704 121 70707 flf

# 3) 做无缝版（片尾与片头交叉淡化 0.4s）
bash ~/Downloads/dl-hub/48-QwenImage21部署/国风循环动画/make_loop.sh \
  guofeng-loop-..._00001_.mp4 guofeng-loop-ltx25-seamless-5s.mp4 0.4
```

`ltx25_loop.py` 的 `mode` 参数：`flf`（首尾帧同图，循环）/ `i2v`（只挂首帧，普通图生视频）。

---

## 五、踩坑记录

1. **`LTXVAudioVAEDecode` 的输入名是 `audio_vae` 不是 `vae`** —— 用 `vae` 会 400 `required_input_missing`（这个报错默认不打印明细，必须自己把 HTTP 错误体打出来看）。
2. **尺寸/帧数硬约束**：宽高必须 32 的倍数（给 432 出 416、给 720 出 704）；帧数必须 8n+1（121 = 8×15+1）。
3. **官方蓝图里引用了本机没有的模型**：prompt 增强用的 `gemma4_e2b_it_int8_convrot.safetensors`（本机只有 bf16 版）。增强分支默认由 `ComfySwitchNode`（PrimitiveBoolean=true）旁路，直接吃原始提示词，所以不影响；展平时我直接把增强分支删掉了。
4. **16GB 显存 + 32GB 内存跑 21.5GB 主干 + 15.4GB 文本编码器**：必须 `--lowvram`，靠 CPU/磁盘流式换入换出。实测可用（`available` 26GB、swap 71GB），单次 5 秒片约 3.5 分钟，可接受。
5. **`LTXVAddGuide` 会自动把参考图缩放并中心裁剪到 latent 尺寸**，所以源图不必先裁成生成分辨率。
6. 提示词要点：**别写大运镜**（"tracking shot / camera flies" 之类）。循环镜头要写"站立/轻微转头/风拂衣袂/雪花飘落/镜头缓慢推近"，动作幅度小才回得来。

---

## 六、产出文件

| 文件 | 说明 |
|---|---|
| `guofeng-loop-ltx25-red-robes-snow-plum-seed70707_00001_.mp4` | 原始生成版（2.0 MB，含 LTX 环境音） |
| `guofeng-loop-ltx25-seamless-5s.mp4` | 无缝优化版（2.9 MB，片尾↔片头叠化 0.4s） |
| `ltx25_loop.py` | 展平后的 API 工作流脚本（flf / i2v 两种模式） |
| `make_loop.sh` | 交叉淡化做无缝循环的 ffmpeg 脚本 |
| `prompt_ltx_loop.txt` | 本次使用的运动提示词 |
| `sheet.png` | 6 帧动作缩略图（用于快速检查有无变形） |

---

# 七、修订（同日晚）：第一版为什么"人/衣服/头发完全静止"

用户反馈第一版里**人物、衣服、头发完全不动**。分区域量化后确认属实：

| 指标（帧间平均绝对差，0–255） | 第一版（静止） |
|---|---|
| 全画面逐帧差 | 1.55 |
| 人物区逐帧差 | 2.04 |
| 背景边缘逐帧差 | 1.75 |

全片帧间差仅 1.5/255，人物区和背景一样"死"。

## 根因（三个叠加）

1. **提示词是我自己写死的**：原文 `She stands mostly still, breathing gently`（她基本站定、只是呼吸）——模型忠实执行了。
2. **首尾同图 + `strength=0.7` 双端约束**：构图两头都钉在原图，模型最省力的解就是"几乎不动"。
3. 蒸馏 8 步 + `video_cfg=1`（无 CFG 引导），本身运动倾向就弱。

## A/B/C 对照实验

同一源图、同一运动提示词、1280×704 / 121 帧 / seed 70707：

| 版本 | 全画面逐帧差 | 人物区 | 末帧 vs 首帧 | 能否闭环 |
|---|---|---|---|---|
| 第一版（静止提示词 + 首尾同图 0.7） | 1.55 | 2.04 | 4.35 | ✅ 但没运动 |
| **A：首尾同图 strength 0.7 + 运动提示词** | **6.23** | **12.42** | **5.67** | ✅ **既有运动又闭环（采用）** |
| B：首尾同图 strength 0.4 | 9.09 | 14.60 | 37.14 | ❌ 回不到起点 |
| C：仅首帧 i2v | 9.17 | 11.61 | 76.10 | ❌ 完全不闭环 |

**结论：首尾同图（FLF）本身没有任何问题，它就是做循环的正确手法**；错的是提示词。`strength=0.7` 是甜点值——运动量足够（人物区是静止版的 6 倍）且仍能回到起点；降到 0.4 运动更大但收不回来，只能靠后期回文/叠化硬收。

## 收尾方式的修正（重要）

第一版我做了"片尾↔片头 0.4s 交叉淡化"。当**首尾本来就闭合**时这反而有害：叠化把天然结尾替换成"片头第 0.4s 的画面"，实测末帧 vs 首帧差从 **5.67 恶化到 16.04**。

正确做法：首尾已闭合时**直接去掉最后 1 帧**，让 0…N-2 无痕回卷。实测末帧 vs 首帧差 **5.76 ≈ 一个帧步（6.25）**，循环无缝。只有首尾不闭合（B / C 那种）才需要叠化或回文。

## 运动版提示词模板（可直接复用）

```
A strong gusty wind sweeps through the snow-covered red plum grove. The young woman in red silk
robes holds her oil-paper umbrella while her long black hair lifts, streams sideways and whips in
the wind, strand by strand. The translucent red silk sleeves and the long skirt flutter, billow and
ripple continuously, the fabric edges flapping. She slowly turns her head toward the camera and
blinks, her lips parting slightly as she breathes. The red oil-paper umbrella tilts and sways in the
wind. The snow-laden red plum branches all around her sway, bend and bounce in the gust, shaking
snow off; loose red plum petals and blossoms detach and drift, tumbling and swirling through the
air. Snowflakes blow rapidly across the frame. The camera slowly pushes in. Cold soft backlight,
pale winter sky. Ambient sound: strong wind, rustling silk, creaking branches, snow falling.
```

要点：**逐项点名要动的东西**（发丝→衣袖→裙摆→头→伞→梅枝→落瓣→雪），不要写 "stands still"；镜头运动保持"缓慢推近"，别写大运镜。

## 修正后产出

| 文件 | 说明 |
|---|---|
| `guofeng-loop-ltx25-motion-loop-5s.mp4` | ✅ **最终成品**（运动 + 闭环，1280×704 / 120帧 / 5.00s） |
| `运动量对照AB/A-首尾同图-str0.7.mp4` | A 版原始生成（采用方案的未裁剪版） |
| `运动量对照AB/B-首尾同图-str0.4.mp4` | B 版对照 |
| `运动量对照AB/C-仅首帧-i2v.mp4` | C 版对照 |
| `运动量对照AB/A版动作缩略图.png` | A 版 6 帧动作缩略图 |
| `ltx25_loop.py`（已更新） | 新增第 9 个参数：guide strength（默认 0.7） |

---

# 八、二次修订：动作幅度调小（温柔档）

用户对 A/B/C 的反馈与原因定位：

| 反馈 | 原因 |
|---|---|
| A：镜头不动 ✅ 但**人物动作幅度太大** | 提示词写的是"狂风/发丝抽打/雪花横扫 + 转头面向镜头"，模型照做 |
| B：**开场就背身**、首尾不循环 | `strength=0.4` 时**首帧约束太弱，模型第一步就丢掉了源图**（自己重新摆机位、转身），末帧也回不来（37.14） |
| C：镜头动了、不循环 | i2v 只挂首帧，提示词里有 "camera slowly pushes in" → 镜头漂移；且无尾帧约束（76.10） |

**修正思路：保留 A 的骨架（首尾同图 + `strength=0.7`，它保证闭环与不丢源图），只换提示词——把"狂风"降成"微风"，并显式锁死镜头。**

## 幅度三档实测

| 版本 | 提示词 | strength | 人物区运动量 | 全画面 | 末帧 vs 首帧 |
|---|---|---|---|---|---|
| 静止版（第一版） | stands mostly still | 0.7 | 2.04 | 1.55 | 4.35 |
| E | 微风 + 锁镜头 | 0.8 | 2.20 | 1.46 | 4.01 |
| F | 轻风（措辞介于 D/A 之间） | 0.7 | 2.15 | 1.59 | 4.63 |
| **D ✅ 采用** | **微风 + 锁镜头** | **0.7** | **4.33** | **2.05** | **5.11** |
| A（上一版） | 狂风 | 0.7 | 12.42 | 6.23 | 5.67 |

D 的运动量约为 A 的 **1/3**、静止版的 **2 倍**，且始终朝向镜头、不背身。**D 就是"温柔档"的落点。**

⚠️ **重要观察**：E 和 F 本意是"更静一点"和"中间档"，结果都意外偏静（2.2 左右）——**同一 strength、同一 seed 下，提示词措辞带来的波动比预期大得多**。幅度调节实际是"提示词措辞 + strength"两把旋钮，**一次最好出 2 版挑一版**，不要指望单次精准命中。

## 幅度调节清单（可复用）

| 想更静 | 想更动 |
|---|---|
| `light breeze` / `gentle` / `softly` / `slowly` / `trembling softly` | `strong gusty wind` / `whips` / `billow` / `rapidly` |
| `her head turns only very slightly` | `she turns her head toward the camera` |
| strength `0.8` | strength `0.7`（**低于 0.6 会丢源图、闭不上环**） |
| 删掉裙摆/水袖的大幅描写 | 逐项点名：发丝→衣袖→裙摆→伞→梅枝→落瓣→雪 |

**镜头必须显式锁死**：`The camera is completely static and locked off; the framing never moves, no push in, no pan.` 只写"不要动镜头"不够，要正面声明。

## 温柔档提示词（最终采用，D 版）

```
A quiet winter afternoon in a snow-covered red plum grove. The young woman in red silk robes stands
under her red oil-paper umbrella in a gentle breeze. The camera is completely static and locked off;
the framing does not move, no camera push, no pan. Her long black hair sways softly and slowly, a few
strands lifting in the light breeze. The translucent red silk sleeves and the long skirt ripple
gently, the fabric edges trembling softly. She breathes calmly, blinks once, and her head turns only
very slightly. The red oil-paper umbrella sways a little. The snow-laden red plum branches around her
sway gently, and a few loose petals drift slowly down through the air. Light snow falls continuously.
Soft cold backlight, pale winter sky. Ambient sound: light wind, faint rustle of silk.
```

## 二次修订产出

| 文件 | 说明 |
|---|---|
| `guofeng-loop-ltx25-gentle-loop-5s.mp4` | ✅ **最终成品（温柔档）** 1280×704 / 120帧 / 5.00s |
| `动作幅度三档对比/D-温柔档-人物区4.33.mp4` | D 原始生成（未裁帧） |
| `动作幅度三档对比/A-狂风档-人物区12.42.mp4` | A（幅度过大版） |
| `动作幅度三档对比/F-中间档-人物区2.15.mp4` | F（意外偏静） |
| `动作幅度三档对比/D版缩略图.png` / `A版缩略图.png` | 动作缩略图对照 |

---

# 九、2K 直出 与 GIF/动图

## 9.1 2K 直出：可行 ✅

源图本来就是 2048×1152，LTX 要求宽高为 32 的倍数——`2048/32=64`、`1152/32=36`，**正好合法，不需要裁剪或补边**。

同一提示词/同 seed（70707）/同 strength 0.7，只把分辨率从 1280×704 提到 **2048×1152**：

| 项 | 1280×704（D 版） | **2048×1152（2K 版）** |
|---|---|---|
| 生成耗时 | 约 3 分钟 | **15 分 57 秒**（≈5 倍） |
| 显存峰值 | 15.6 GB | ≈15.4 GB（**不 OOM**） |
| 逐帧差（整帧缩放） | 2.05 | 1.24 |
| 逐帧差（中心区·原生分辨率） | 3.46 | **2.34** |
| 首尾回卷差 | 5.11 | 2.71（去掉末 5 帧后 2.71） |

两个结论：

1. **2K 能直出**，显存和 720p 档差不多（weights 靠 `--lowvram` 流式换入，瓶颈是算力不是显存），代价是时间约 5 倍。
2. **分辨率越高，模型越保守**：同样的提示词，2K 下中心区运动量只有 1280 版的约 **2/3**（2.34 vs 3.46）。想让 2K 版动得更多，得把提示词的风力再写强一档。

2K 版最佳回卷点是**去掉末尾 5 帧**（保留 116 帧，回卷差 2.71，比只去掉 1 帧的 2.9+ 更干净）——`bestcut.py` 会自动找出这个点。

## 9.2 GIF / 动图

两条路：

**(a) 后期转换（本次采用，质量/体积可控）**：mp4 → ffmpeg 两遍调色板 + `hqdn3d` 降噪。雪花的噪点最不利于帧间压缩，轻微降噪能把体积砍掉 2/3 而肉眼几乎无损。

| 产物 | 参数 | 体积 |
|---|---|---|
| **轻量 GIF** | 720×396 / 12fps / 192色 | **5.9 MB** |
| GIF | 960×528 / 16fps / 256色 | 17.2 MB |
| GIF（全尺寸） | 1280×704 / 12fps / 256色 | 24.2 MB |
| **动图 WebP** | 1280×704 / 24fps / q62 | **12.1 MB** |
| 动图 WebP（2K） | 2048×1152 / 12fps / q62 | 13.0 MB |

⚠️ **2K 不建议做 GIF**：2048×1152 的 GIF 会到 40–60 MB 且只有 256 色，2K 场景请用 WebP 或直接 mp4。

**(b) ComfyUI 侧"直出"**：本机装了 VideoHelperSuite，`VHS_VideoCombine` 的 `format` 可选 `image/gif`，另有内置 `SaveAnimatedWEBP` 节点——可以在工作流末尾直接出 GIF/WebP，省去转换步骤。但它的调色板与降噪控制不如 ffmpeg 两遍法，体积通常更大；**要"直出"就在 `ltx25_loop.py` 里把 `SaveVideo` 换成 `VHS_VideoCombine(format="image/gif")` 即可**（本次为了体积可控走了 (a) 路线）。

## 9.3 本轮新增产出

| 文件 | 说明 |
|---|---|
| `guofeng-loop-ltx25-gentle-2k-loop.mp4` | ✅ **2K 直出成品** 2048×1152 / 116帧 / 24fps / 4.83s |
| `GIF动图/温柔档-720x396-12fps-轻量版.gif` | 轻量 GIF（5.9 MB） |
| `GIF动图/温柔档-960x528-16fps.gif` | 中等 GIF |
| `GIF动图/温柔档-1280x704-12fps-全尺寸.gif` | 全尺寸 GIF |
| `GIF动图/温柔档-1280x704-24fps.webp` | 动图 WebP（1280） |
| `GIF动图/温柔档-2K-2048x1152-12fps.webp` | 动图 WebP（2K） |
| `动作幅度三档对比/2K版缩略图.png` | 2K 版动作缩略图 |
| `bestcut.py` | 自动寻找最佳回卷点（逐帧比对首帧） |
| `motion2.py` | 分区域运动量量化（原生分辨率中心裁切，比整帧缩放更灵敏） |

---

# 十、三次修订：物理一致性（雪的方向 / 梅枝摇曳）

用户指出 2K 版的物理不自洽：**女主长发已经飘起来了，但雪花仍基本垂直下落，红梅枝丫也不晃。**

## 10.1 根因：风只写在了"人"身上

旧提示词把风的描写全部绑在人物（发丝/衣袖/裙摆），雪花和梅枝只是被当成静态背景顺带提了一句 `Light snow falls continuously` / `branches sway gently`。模型于是把"动"分配给主体，把次要元素保持静止——**这是提示词结构问题，不是模型能力问题**。帧差图可以直接看出来：

- 旧 2K 版帧差图：运动能量几乎全集中在人物头发/红绸，**左侧梅枝区几乎为零**
- 新 2K 版帧差图：左侧梅枝区出现大量运动能量

## 10.2 修正手法：统一风向 + 显式反默认 + 负向词封堵

三件事同时做：

1. **声明一个贯穿全场的风向**，并把每一类元素都绑定到它：
   > A steady breeze blows from the left side of the frame toward the right, **and every element in the scene responds to the same wind.**
2. **显式反默认**——直接写"雪不垂直落"：
   > The falling snow is carried by the same wind: the flakes are blown sideways to the right and **streak diagonally across the frame**, drifting and swirling, **instead of dropping straight down**.
3. **负向提示词封堵默认行为**（雪花垂直落、枝条静止本来就是模型的高频先验）：
   > `snow falling straight down, vertical snowfall, straight vertical snow streaks, motionless tree branches, frozen branches, static foliage, trees that do not move, wind blowing in conflicting directions, moving camera, camera pan, camera zoom`
   
   为此给 `ltx25_loop.py` 增加了第 10 个参数：**负向提示词文件**。

枝条还要写出"可见的后果"，比单说 sway 有效：`bend and sway to the right and then spring back, dipping and lifting; snow crumbles off the twigs as they move, and the blossoms tremble.`

## 10.3 实测对比

| 指标 | 旧 2K 版 | **新 2K 版（统一风向）** | 倍数 |
|---|---|---|---|
| 人物区逐帧差 | 2.03 | **4.87** | 2.4× |
| **背景/梅枝区逐帧差** | 1.25 | **3.47** | **2.8×** |
| 全画面逐帧差 | 1.24 | 3.19 | 2.6× |
| 远景区域运动能量（自相关零延迟） | 58.3 | **306.6** | 5.3× |
| 末帧 vs 首帧 | 2.72 | 2.92（去末 9 帧后） | 仍闭环 |

人物动作量（4.87）仍落在"温柔档"区间（D 版 4.33），**没有变回 A 版那种幅度**，但梅枝/远景真的动起来了。

⚠️ **关于雪花方向的诚实说明**：我试了三种自动测量（位移残差、时空切片、差分图自相关），都无法稳定判定雪花的主导方向（两种方向的相关值始终接近）。**方向这一项请以肉眼为准**；能确认的是落雪所在的远景区域运动能量提升了 5 倍，且提示词/负向词都已明确要求斜向吹雪。

## 10.4 两条 2K 路线（都可用）

| 路线 | 做法 | 人物区 | 梅枝区 | 耗时 | 特点 |
|---|---|---|---|---|---|
| **A. 2K 原生直出** | 直接 2048×1152 采样 | 4.87 | 3.47 | 15 分 57 秒 | 细节原生，动作偏含蓄 |
| B. 1280 生成→升采样 2K | 1280×704 生成后 Lanczos+unsharp 升到 2K | 6.86 | 4.05 | 约 3 分 + 10 秒 | 动作更足，细节为插值 |

**结论：分辨率越高模型越保守**，所以"要动作"就用 B 路线（低分辨率生成后升采样），"要原生细节"就用 A 路线。

## 10.5 本轮产出

| 文件 | 说明 |
|---|---|
| `guofeng-loop-ltx25-wind-2k-loop.mp4` | ✅ **2K 原生 + 统一风向** 2048×1152 / 112帧 / 4.67s |
| `guofeng-loop-ltx25-wind-upscaled-2k-loop.mp4` | 1280 生成后升采样 2K（动作更足） |
| `GIF动图/统一风向-720x396-12fps-轻量版.gif` | 轻量 GIF（6.8 MB） |
| `GIF动图/统一风向-2K-2048x1152-12fps.webp` | 2K 动图 WebP（11.1 MB） |
| `GIF动图/统一风向-1280x704-12fps.webp` | 1280 动图 WebP（6.2 MB） |
| `物理一致性修正/新2K版-帧差图.png` / `旧2K版-帧差图.png` | 帧差图对照（看梅枝区能量） |
| `物理一致性修正/梅枝位移-连续帧放大对比.png` | 连续两帧放大对比，可见枝条位移 |
| `prompt_ltx_wind.txt` / `neg_ltx_wind.txt` | 统一风向提示词 + 负向提示词 |
