From 428a915b293c1ad6442d2e3ff016f695169b7498 Mon Sep 17 00:00:00 2001 From: ud18010 Date: Tue, 21 Jul 2026 11:27:11 +0800 Subject: [PATCH] =?UTF-8?q?ModelTranslator:=20=5Fdo=5Funwrap=20=E6=94=B9?= =?UTF-8?q?=E8=A7=92=E5=BA=A6=E6=89=AB=E6=8F=8F=E5=88=86=E7=BA=A7=E6=8A=A2?= =?UTF-8?q?=E6=95=91,=E5=8F=96=E8=BF=87=E9=97=A8=E4=B8=94=E5=B2=9B?= =?UTF-8?q?=E6=9C=80=E5=B0=91=E8=80=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.8 (1M context) --- Tools/ModelTranslator/bl_decimate.py | 32 +++++++++++++++++++--------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/Tools/ModelTranslator/bl_decimate.py b/Tools/ModelTranslator/bl_decimate.py index 5ec82626..c5dacf1b 100644 --- a/Tools/ModelTranslator/bl_decimate.py +++ b/Tools/ModelTranslator/bl_decimate.py @@ -289,18 +289,30 @@ def _uvpm_repack(obj, warnings): def _do_unwrap(obj, mode, warnings): - """按模式展开(排布默认 UVPM4 增强,失败保底内置 pack); - seam 质量不达标自动回退 smart。返回 uv 指标 dict(含 mode)。""" + """按模式展开:seam 首选 66° 过门即用;否则扫 SEAM_ANGLE_SWEEP, + 取过门且岛数最少者(重跑恢复其 UV);全失败退 smart。排布 UVPM4 增强, + 只在最终 UV 上跑一次,失败保底内置 pack。返回 uv 指标 dict(含 mode)。""" if mode == "seam": - _unwrap_seam(obj, warnings) - uvpm = _uvpm_repack(obj, warnings) - m = _collect_uv_metrics(obj) - if uv_gate_ok(m["flipped"], m["overlap"]): - m["mode"] = uvpm_mode_label("seam", uvpm) + angles = [SEAM_ANGLE_DEG] + list(SEAM_ANGLE_SWEEP) + candidates = [] + for ang in angles: + _unwrap_seam(obj, warnings, seam_angle_deg=ang) + m = _collect_uv_metrics(obj) + m["angle"] = ang + candidates.append(m) + if uv_gate_ok(m["flipped"], m["overlap"]): + break # 该档已过门;更低角度只会更碎,无需再试 + best = pick_best_candidate(candidates) + if best is not None: + if best["angle"] != candidates[-1]["angle"]: + # 选中档不是最后跑的那档,重跑恢复其 UV(_unwrap_seam 会覆盖) + _unwrap_seam(obj, warnings, seam_angle_deg=best["angle"]) + uvpm = _uvpm_repack(obj, warnings) + m = _collect_uv_metrics(obj) + m["mode"] = uvpm_mode_label("seam@%d" % int(best["angle"]), uvpm) return m - warnings.append("seam 展开质量不达标(翻转 %.1f%% 重叠 %s),回退 smart_project" - % (m["flipped"] * 100, - "%.1f%%" % (m["overlap"] * 100) if m["overlap"] is not None else "未知")) + warnings.append("所有 seam 角度(%s)均未过质量门,回退 smart_project" + % "、".join("%d°" % int(a) for a in angles)) mode = "smart_fallback" _unwrap_smart(obj) uvpm = _uvpm_repack(obj, warnings)