ModelTranslator: UV 质量门拆分并校准——翻转 2% / 重叠 8%(well1500 seam 不再误回退)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
ud18010
2026-07-16 12:21:27 +08:00
co-authored by Claude Opus 4.8
parent 88424f24e0
commit 0ba883b8d0
3 changed files with 5 additions and 4 deletions
+1 -1
View File
@@ -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 资源) 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% 打警告 - **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`,正好命中转换器的纯网格贴图命名约定 - 输出命名 `<名>_color/normal/metallic/roughness/ao.png`,正好命中转换器的纯网格贴图命名约定
+3 -2
View File
@@ -24,7 +24,8 @@ def within_tolerance(target, actual, tol=TOLERANCE):
return abs(actual - target) <= target * tol 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): def count_islands(n_faces, adjacent_pairs):
@@ -199,7 +200,7 @@ def _do_unwrap(obj, mode, warnings):
_unwrap_seam(obj, warnings) _unwrap_seam(obj, warnings)
m = _collect_uv_metrics(obj) m = _collect_uv_metrics(obj)
overlap = m["overlap"] or 0.0 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" m["mode"] = "seam"
return m return m
warnings.append("seam 展开质量不达标(翻转 %.1f%% 重叠 %s),回退 smart_project" warnings.append("seam 展开质量不达标(翻转 %.1f%% 重叠 %s),回退 smart_project"
@@ -16,7 +16,7 @@
4. **质量门**:封闭平滑曲面若无一条 seam 会展开重叠/翻转。展开后检测: 4. **质量门**:封闭平滑曲面若无一条 seam 会展开重叠/翻转。展开后检测:
- 重叠:`bpy.ops.uv.select_overlap()` 后经 bmesh 统计选中面占比 - 重叠:`bpy.ops.uv.select_overlap()` 后经 bmesh 统计选中面占比
- 翻转:UV 面签名面积为负的占比(纯数学,不依赖 ops) - 翻转: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 打印 5. **指标上报**`MT_SUMMARY` 增加 `uv` 字段 `{mode, islands, fill, overlap, flipped}`——岛数(bmesh 提取"UV 连续边"邻接 + 纯逻辑 union-find)、UV 空间利用率(UV 面积和)、重叠/翻转占比。CLI 打印
## 接口变更 ## 接口变更