From 97995306ac3322a236bd95eef8c14fdb2b6c10e9 Mon Sep 17 00:00:00 2001 From: ud18010 Date: Tue, 21 Jul 2026 12:31:52 +0800 Subject: [PATCH] =?UTF-8?q?ModelTranslator:=20=5Fdo=5Funwrap=20=E9=80=8F?= =?UTF-8?q?=E4=BC=A0=20overlap=5Ftol,main=20=E8=A7=A3=E6=9E=90=20argv=20?= =?UTF-8?q?=E7=AC=AC5=E4=BD=8D?= 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 | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/Tools/ModelTranslator/bl_decimate.py b/Tools/ModelTranslator/bl_decimate.py index 3ccb4a93..aa310a72 100644 --- a/Tools/ModelTranslator/bl_decimate.py +++ b/Tools/ModelTranslator/bl_decimate.py @@ -289,11 +289,12 @@ def _uvpm_repack(obj, warnings): return False -def _do_unwrap(obj, mode, warnings): +def _do_unwrap(obj, mode, warnings, overlap_tol=UV_OVERLAP_TOL): """按模式展开:seam 从 SEAM_ANGLE_DEG 起降序扫 SEAM_ANGLE_SWEEP,首个过门者即选并停扫 ——岛数随角度降单调增,故首个过门者已是过门候选里岛数最少的(pick_best_candidate 据此在 候选集取岛数最少者,与早停一致;重跑分支为防御:早停下 best 恒为最后一档,通常不触发); - 全失败退 smart。排布 UVPM4 增强,只在最终 UV 上跑一次,失败保底内置 pack。返回 uv 指标 dict(含 mode)。""" + 全失败退 smart。overlap_tol 覆盖重叠门限(翻转仍严格)。排布 UVPM4 增强,只在最终 UV + 上跑一次,失败保底内置 pack。返回 uv 指标 dict(含 mode)。""" if mode == "seam": angles = [SEAM_ANGLE_DEG] + list(SEAM_ANGLE_SWEEP) candidates = [] @@ -302,9 +303,9 @@ def _do_unwrap(obj, mode, warnings): m = _collect_uv_metrics(obj) m["angle"] = ang candidates.append(m) - if uv_gate_ok(m["flipped"], m["overlap"]): + if uv_gate_ok(m["flipped"], m["overlap"], overlap_tol): break # 该档已过门;更低角度只会更碎,无需再试 - best = pick_best_candidate(candidates) + best = pick_best_candidate(candidates, overlap_tol) if best is not None: if best["angle"] != candidates[-1]["angle"]: # 选中档不是最后跑的那档,重跑恢复其 UV(_unwrap_seam 会覆盖) @@ -348,6 +349,7 @@ def main(): argv = sys.argv[sys.argv.index("--") + 1:] src, out_fbx, target = argv[0], argv[1], int(argv[2]) unwrap_mode = argv[3] if len(argv) > 3 else "seam" + overlap_tol = float(argv[4]) if len(argv) > 4 and argv[4] else UV_OVERLAP_TOL warnings = [] bpy.ops.wm.read_factory_settings(use_empty=True) @@ -379,7 +381,7 @@ def main(): if not within_tolerance(target, cur) and cur > target: warnings.append("修正 %d 轮后仍超差:%d 面(目标 %d ±3%%)" % (MAX_RETRY, cur, target)) - uv_info = _do_unwrap(obj, unwrap_mode, warnings) + uv_info = _do_unwrap(obj, unwrap_mode, warnings, overlap_tol) uv_png = os.path.splitext(os.path.abspath(out_fbx))[0] + "_uv.png" uv_polys_json = os.path.splitext(os.path.abspath(out_fbx))[0] + "_uv.polys.json" uv_preview = None