ModelTranslator: 移除 RizomUV 实现计划

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
ud18010
2026-07-20 14:18:30 +08:00
co-authored by Claude Opus 4.8
parent 02d5754e7b
commit 8ea3951973
@@ -0,0 +1,242 @@
# 移除 RizomUV 流程实现计划
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** 从 ModelTranslator 彻底删除 RizomUV 链路,减面默认走 seam 展开 + UVPM4 排布。
**Architecture:** 纯删除/简化,无新功能:删 4 个只服务 rizom 的文件;`model_decimate.py` 去掉三步编排只留单次 Blender 调用;`bl_decimate.py` 去掉 none 展开模式;README 与记忆同步清理。UVPM4 集成(commit d5b777b)不动。spec`docs/superpowers/specs/2026-07-20-remove-rizomuv-design.md`
**Tech Stack:** Python 3、Blender 5.0 headless`D:\tools\blender-5.0.0-windows-x64\blender.exe`)。仓库路径含 `#`,bash 中所有路径必须加引号。工作目录 `D:/UD/AI/AIC#Project/Tools/ModelTranslator`
---
## 文件结构
| 文件 | 操作 |
|---|---|
| `Tools/ModelTranslator/rizom_unwrap.py` | 删除 |
| `Tools/ModelTranslator/bl_uvgate.py` | 删除 |
| `Tools/ModelTranslator/tests/test_rizom_unwrap.py` | 删除 |
| `Tools/ModelTranslator/tests/test_bl_uvgate.py` | 删除 |
| `Tools/ModelTranslator/model_decimate.py` | 简化(删 rizom 分支/--rizom,默认 seam |
| `Tools/ModelTranslator/bl_decimate.py` | 删 none 模式分支 + docstring |
| `Tools/ModelTranslator/README.md` | 删 RizomUV 依赖行,重写减面条目 |
---
### Task 1: 删除 rizom 文件 + 简化 model_decimate.py(一个逻辑变更,一次提交)
**Files:**
- Delete: `Tools/ModelTranslator/rizom_unwrap.py``Tools/ModelTranslator/bl_uvgate.py``Tools/ModelTranslator/tests/test_rizom_unwrap.py``Tools/ModelTranslator/tests/test_bl_uvgate.py`
- Modify: `Tools/ModelTranslator/model_decimate.py`(整文件替换)
- [ ] **Step 1: git rm 四个文件**
```bash
cd "D:/UD/AI/AIC#Project"
git rm Tools/ModelTranslator/rizom_unwrap.py Tools/ModelTranslator/bl_uvgate.py Tools/ModelTranslator/tests/test_rizom_unwrap.py Tools/ModelTranslator/tests/test_bl_uvgate.py
```
- [ ] **Step 2: `model_decimate.py` 整文件替换为**
```python
"""FBX 减面 CLI:减到指定三角面数并重展 UV(seam 展开 + UVPM4 排布),输出 <名>_low.fbx。
用法:python model_decimate.py src/well1500.fbx --tris 5000 [-o dir]
[--unwrap seam|smart] [--blender exe]"""
import argparse
import os
from mt_run import find_blender, run_blender_script
def main():
ap = argparse.ArgumentParser(description=__doc__)
ap.add_argument("input", help="FBX 文件")
ap.add_argument("--tris", type=int, required=True, help="目标三角面数")
ap.add_argument("-o", "--out", default=None, help="输出目录(默认源文件同目录)")
ap.add_argument("--unwrap", choices=("seam", "smart"), default="seam",
help="UV 展开:seam=锐边接缝整岛展开(默认),smart=Smart UV Project")
ap.add_argument("--blender", default=None)
args = ap.parse_args()
if args.tris <= 0:
ap.error("--tris 必须为正整数")
blender = find_blender(args.blender)
name = os.path.splitext(os.path.basename(args.input))[0]
outdir = args.out or os.path.dirname(os.path.abspath(args.input))
out_fbx = os.path.join(outdir, name + "_low.fbx")
s = run_blender_script(blender, "bl_decimate.py",
[args.input, out_fbx, str(args.tris), args.unwrap])
print("== %s: %d -> %d 面(目标 %d-> %s" %
(s["src"], s["tris_before"], s["tris_after"], s["target"], out_fbx))
u = s["uv"]
overlap = "%.1f%%" % (u["overlap"] * 100) if u["overlap"] is not None else "n/a"
print(" UV: 模式=%s 岛数=%d 利用率=%.1f%% 翻转=%.1f%% 重叠=%s" %
(u["mode"], u["islands"], u["fill"] * 100, u["flipped"] * 100, overlap))
for w in s["warnings"]:
print(" [警告] %s" % w)
if __name__ == "__main__":
main()
```
(相对原文件:docstring 更新;`--unwrap` choices 去掉 rizom、默认改 seam、help 去掉 rizom 描述;删 `--rizom` 参数;删 `if args.unwrap == "rizom":` 三步编排分支及 else 缩进——打印逻辑逐字保留。)
- [ ] **Step 3: 验证残留引用与单测**
```bash
cd "D:/UD/AI/AIC#Project" && grep -rin rizom Tools/ModelTranslator --include="*.py" ; echo "grep_done"
cd "D:/UD/AI/AIC#Project/Tools/ModelTranslator" && python -m unittest discover tests 2>&1 | tail -3
```
Expected: grep 无输出(只打印 grep_done);单测 OK(此时剩 test_bl_decimate/test_bl_bake/test_bl_convert/test_unity_assets)。若 `__pycache__` 命中 grep 属编译缓存,可 `rm -rf Tools/ModelTranslator/__pycache__ Tools/ModelTranslator/tests/__pycache__` 后重验。
- [ ] **Step 4: 提交**
```bash
cd "D:/UD/AI/AIC#Project" && git add Tools/ModelTranslator/model_decimate.py && git commit -m "ModelTranslator: 移除 RizomUV 链路——减面默认 seam+UVPM4 排布"
```
---
### Task 2: bl_decimate.py 删 none 模式
**Files:**
- Modify: `Tools/ModelTranslator/bl_decimate.py`
- [ ] **Step 1: docstring 更新**
第 2 行:
```python
调用blender -b --factory-startup --python bl_decimate.py -- <src.fbx> <out.fbx> <target_tris> [seam|smart|none]
```
改为:
```python
调用blender -b --factory-startup --python bl_decimate.py -- <src.fbx> <out.fbx> <target_tris> [seam|smart]
```
- [ ] **Step 2: main() 删 none 分支**
现有:
```python
if unwrap_mode == "none":
# rizom 管线:跳过展开,UV 由后续 RizomUV 步骤生成
_clear_uv_layers(obj.data)
uv_info = {"mode": "none", "islands": 0, "fill": 0.0,
"flipped": 0.0, "overlap": None}
else:
uv_info = _do_unwrap(obj, unwrap_mode, warnings)
```
替换为:
```python
uv_info = _do_unwrap(obj, unwrap_mode, warnings)
```
`_clear_uv_layers` 仍被 `_unwrap_seam`/`_unwrap_smart` 使用,保留。)
- [ ] **Step 3: 回归单测**
```bash
cd "D:/UD/AI/AIC#Project/Tools/ModelTranslator" && python -m unittest discover tests 2>&1 | tail -3
```
Expected: OK
- [ ] **Step 4: 提交**
```bash
cd "D:/UD/AI/AIC#Project" && git add Tools/ModelTranslator/bl_decimate.py && git commit -m "ModelTranslator: bl_decimate 删 none 展开模式——随 rizom 链退役"
```
---
### Task 3: README 清理
**Files:**
- Modify: `Tools/ModelTranslator/README.md`
- [ ] **Step 1: 依赖节删 RizomUV 行**
删除整行:
```markdown
- RizomUV 2025+(可选,UV 展开质量更好;默认路径 `C:\Program Files\RizomUV2025\rizomuv.exe`,也可用 `--rizom` 参数或环境变量 `RIZOMUV_EXE` 指定;未安装或未授权自动回退 Blender 展开)
```
- [ ] **Step 2: 重写 model_decimate.py 条目**
现有 `- **model_decimate.py**...` 整条替换为:
```markdown
- **model_decimate.py**:多 mesh 自动 join;三角化后 Decimate(collapse) 减到 `--tris`(±3%,最多 2 轮修正);旧 UV 全删后重展——默认锐边 seam 整岛展开,质量门不达标(翻转 >2% 或重叠 >8%)自动回退 Smart UV Project`--unwrap smart` 可直接选投影式展开;排布默认用 UVPackmaster 4 重排(利用率显著提升,日志模式带 `+uvpm` 后缀,4px@2048 像素边距与烘焙 padding 同口径),UVPM4 不可用自动沿用内置 pack_islands 布局;输出 `<名>_low.fbx``-o` 改目录),日志报 UV 岛数/利用率
```
- [ ] **Step 3: 全文残留检查**
```bash
grep -in rizom "D:/UD/AI/AIC#Project/Tools/ModelTranslator/README.md" ; echo "grep_done"
```
Expected: 无输出(只打印 grep_done
- [ ] **Step 4: 提交**
```bash
cd "D:/UD/AI/AIC#Project" && git add Tools/ModelTranslator/README.md && git commit -m "ModelTranslator: README 移除 RizomUV 相关说明"
```
---
### Task 4: 冒烟验证(默认路径 + 非法参数)
- [ ] **Step 1: 默认路径冒烟**
```bash
cd "D:/UD/AI/AIC#Project/Tools/ModelTranslator"
PYTHONIOENCODING=utf-8 python model_decimate.py src/store.fbx --tris 3000 -o "$TEMP/mt_norizom_smoke"
```
Expected:
- `UV: 模式=seam+uvpm`(注意:不再是 seam_fallback+uvpm——rizom 链没了)
- 利用率 ~75%
- **无任何 RizomUV 字样输出、无弹窗**、整体耗时明显短于此前默认路径
- [ ] **Step 2: 非法参数报错**
```bash
PYTHONIOENCODING=utf-8 python model_decimate.py src/store.fbx --tris 3000 --unwrap rizom 2>&1 | tail -2
```
Expected: argparse 报错 `invalid choice: 'rizom'`,退出码非 0
- [ ] **Step 3: 清理**
```bash
rm -rf "$TEMP/mt_norizom_smoke"
```
---
### Task 5: 记忆清理(由主会话控制器执行,不派子代理)
- [ ] 删除 `C:\Users\Administrator\.claude\projects\D--UD-AI-AIC-Project\memory\rizomuv-license-blocker.md`
- [ ] 从 MEMORY.md 索引删除对应行
- [ ] 检查其他记忆(hotupdate 等)无 rizom 引用
---
## 完成标准
1. `python -m unittest discover tests` 全绿
2. `grep -rin rizom Tools/ModelTranslator --include="*.py" --include="*.md"` 零命中
3. 冒烟:默认路径 `模式=seam+uvpm``--unwrap rizom` 参数非法
4. 记忆已清理,全部改动已提交