From 0ba883b8d00c7ab29aa98d2b3ac4045f2cee15b5 Mon Sep 17 00:00:00 2001 From: ud18010 Date: Thu, 16 Jul 2026 12:21:27 +0800 Subject: [PATCH] =?UTF-8?q?ModelTranslator:=20UV=20=E8=B4=A8=E9=87=8F?= =?UTF-8?q?=E9=97=A8=E6=8B=86=E5=88=86=E5=B9=B6=E6=A0=A1=E5=87=86=E2=80=94?= =?UTF-8?q?=E2=80=94=E7=BF=BB=E8=BD=AC=202%=20/=20=E9=87=8D=E5=8F=A0=208%?= =?UTF-8?q?=EF=BC=88well1500=20seam=20=E4=B8=8D=E5=86=8D=E8=AF=AF=E5=9B=9E?= =?UTF-8?q?=E9=80=80=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.8 --- Tools/ModelTranslator/README.md | 2 +- Tools/ModelTranslator/bl_decimate.py | 5 +++-- .../specs/2026-07-16-decimate-uv-seam-unwrap-design.md | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Tools/ModelTranslator/README.md b/Tools/ModelTranslator/README.md index 501313f9..e6d9f343 100644 --- a/Tools/ModelTranslator/README.md +++ b/Tools/ModelTranslator/README.md @@ -45,7 +45,7 @@ python model_bake.py src/well1500.fbx src/well1500_low.fbx # -> out_bake/well1 python model_translator.py out_bake/well1500/well1500.fbx # -> out/well1500/(Unity 资源) ``` -- **model_decimate.py**:多 mesh 自动 join;三角化后 Decimate(collapse) 减到 `--tris`(±3%,最多 2 轮修正);旧 UV 全删后重展——默认锐边标 seam + MINIMUM_STRETCH 整岛展开(碎岛少、接缝落在硬边),质量不达标(翻转/重叠 >2%)自动回退 Smart UV Project,`--unwrap smart` 可强制旧行为;输出 `<名>_low.fbx`(`-o` 改目录),日志报 UV 岛数/利用率 +- **model_decimate.py**:多 mesh 自动 join;三角化后 Decimate(collapse) 减到 `--tris`(±3%,最多 2 轮修正);旧 UV 全删后重展——默认锐边标 seam + MINIMUM_STRETCH 整岛展开(碎岛少、接缝落在硬边),质量不达标(翻转 >2% 或重叠 >8%)自动回退 Smart UV Project,`--unwrap smart` 可强制旧行为;输出 `<名>_low.fbx`(`-o` 改目录),日志报 UV 岛数/利用率 - **model_bake.py**:Cycles selected-to-active 烘焙。normal(切线空间 OpenGL +Y)/ao 直接烘;color/metallic/roughness 把高模 Principled 对应输入接 Emission 烘 EMIT。`--size` 默认 2048,`--samples` AO 采样默认 64,射线距离默认低模包围盒对角线 2%(`--ray-distance` 覆盖);低模无 UV 会报错,高低模包围盒差超 10% 打警告 - 输出命名 `<名>_color/normal/metallic/roughness/ao.png`,正好命中转换器的纯网格贴图命名约定 diff --git a/Tools/ModelTranslator/bl_decimate.py b/Tools/ModelTranslator/bl_decimate.py index e4fbf806..11b8e753 100644 --- a/Tools/ModelTranslator/bl_decimate.py +++ b/Tools/ModelTranslator/bl_decimate.py @@ -24,7 +24,8 @@ def within_tolerance(target, actual, tol=TOLERANCE): return abs(actual - target) <= target * tol -UV_BAD_TOL = 0.02 # 质量门:UV 翻转/重叠面占比超此值则回退 smart_project +UV_FLIP_TOL = 0.02 # 质量门:UV 翻转面占比超此值回退 smart_project +UV_OVERLAP_TOL = 0.08 # 质量门:UV 重叠面占比阈值(手工 UV 同口径约 5%,灾难性失败 >20%) def count_islands(n_faces, adjacent_pairs): @@ -199,7 +200,7 @@ def _do_unwrap(obj, mode, warnings): _unwrap_seam(obj, warnings) m = _collect_uv_metrics(obj) overlap = m["overlap"] or 0.0 - if m["flipped"] <= UV_BAD_TOL and overlap <= UV_BAD_TOL: + if m["flipped"] <= UV_FLIP_TOL and overlap <= UV_OVERLAP_TOL: m["mode"] = "seam" return m warnings.append("seam 展开质量不达标(翻转 %.1f%% 重叠 %s),回退 smart_project" diff --git a/docs/superpowers/specs/2026-07-16-decimate-uv-seam-unwrap-design.md b/docs/superpowers/specs/2026-07-16-decimate-uv-seam-unwrap-design.md index 93c5eaaa..4d0abbf6 100644 --- a/docs/superpowers/specs/2026-07-16-decimate-uv-seam-unwrap-design.md +++ b/docs/superpowers/specs/2026-07-16-decimate-uv-seam-unwrap-design.md @@ -16,7 +16,7 @@ 4. **质量门**:封闭平滑曲面若无一条 seam 会展开重叠/翻转。展开后检测: - 重叠:`bpy.ops.uv.select_overlap()` 后经 bmesh 统计选中面占比 - 翻转:UV 面签名面积为负的占比(纯数学,不依赖 ops) - - 重叠占比 > 2% 或翻转占比 > 2% → 自动回退现有 smart_project 路径并打警告,保证不劣于现状 + - 翻转占比 > 2% 或重叠占比 > 8%(2026-07-16 冒烟后校准:手工 UV 同口径约 5%,原 2% 过严) → 自动回退现有 smart_project 路径并打警告,保证不劣于现状 5. **指标上报**:`MT_SUMMARY` 增加 `uv` 字段 `{mode, islands, fill, overlap, flipped}`——岛数(bmesh 提取"UV 连续边"邻接 + 纯逻辑 union-find)、UV 空间利用率(UV 面积和)、重叠/翻转占比。CLI 打印 ## 接口变更