ModelTranslator: _do_unwrap 透传 overlap_tol,main 解析 argv 第5位
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
b02877a2cf
commit
97995306ac
@@ -289,11 +289,12 @@ def _uvpm_repack(obj, warnings):
|
|||||||
return False
|
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,首个过门者即选并停扫
|
"""按模式展开:seam 从 SEAM_ANGLE_DEG 起降序扫 SEAM_ANGLE_SWEEP,首个过门者即选并停扫
|
||||||
——岛数随角度降单调增,故首个过门者已是过门候选里岛数最少的(pick_best_candidate 据此在
|
——岛数随角度降单调增,故首个过门者已是过门候选里岛数最少的(pick_best_candidate 据此在
|
||||||
候选集取岛数最少者,与早停一致;重跑分支为防御:早停下 best 恒为最后一档,通常不触发);
|
候选集取岛数最少者,与早停一致;重跑分支为防御:早停下 best 恒为最后一档,通常不触发);
|
||||||
全失败退 smart。排布 UVPM4 增强,只在最终 UV 上跑一次,失败保底内置 pack。返回 uv 指标 dict(含 mode)。"""
|
全失败退 smart。overlap_tol 覆盖重叠门限(翻转仍严格)。排布 UVPM4 增强,只在最终 UV
|
||||||
|
上跑一次,失败保底内置 pack。返回 uv 指标 dict(含 mode)。"""
|
||||||
if mode == "seam":
|
if mode == "seam":
|
||||||
angles = [SEAM_ANGLE_DEG] + list(SEAM_ANGLE_SWEEP)
|
angles = [SEAM_ANGLE_DEG] + list(SEAM_ANGLE_SWEEP)
|
||||||
candidates = []
|
candidates = []
|
||||||
@@ -302,9 +303,9 @@ def _do_unwrap(obj, mode, warnings):
|
|||||||
m = _collect_uv_metrics(obj)
|
m = _collect_uv_metrics(obj)
|
||||||
m["angle"] = ang
|
m["angle"] = ang
|
||||||
candidates.append(m)
|
candidates.append(m)
|
||||||
if uv_gate_ok(m["flipped"], m["overlap"]):
|
if uv_gate_ok(m["flipped"], m["overlap"], overlap_tol):
|
||||||
break # 该档已过门;更低角度只会更碎,无需再试
|
break # 该档已过门;更低角度只会更碎,无需再试
|
||||||
best = pick_best_candidate(candidates)
|
best = pick_best_candidate(candidates, overlap_tol)
|
||||||
if best is not None:
|
if best is not None:
|
||||||
if best["angle"] != candidates[-1]["angle"]:
|
if best["angle"] != candidates[-1]["angle"]:
|
||||||
# 选中档不是最后跑的那档,重跑恢复其 UV(_unwrap_seam 会覆盖)
|
# 选中档不是最后跑的那档,重跑恢复其 UV(_unwrap_seam 会覆盖)
|
||||||
@@ -348,6 +349,7 @@ def main():
|
|||||||
argv = sys.argv[sys.argv.index("--") + 1:]
|
argv = sys.argv[sys.argv.index("--") + 1:]
|
||||||
src, out_fbx, target = argv[0], argv[1], int(argv[2])
|
src, out_fbx, target = argv[0], argv[1], int(argv[2])
|
||||||
unwrap_mode = argv[3] if len(argv) > 3 else "seam"
|
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 = []
|
warnings = []
|
||||||
|
|
||||||
bpy.ops.wm.read_factory_settings(use_empty=True)
|
bpy.ops.wm.read_factory_settings(use_empty=True)
|
||||||
@@ -379,7 +381,7 @@ def main():
|
|||||||
if not within_tolerance(target, cur) and cur > target:
|
if not within_tolerance(target, cur) and cur > target:
|
||||||
warnings.append("修正 %d 轮后仍超差:%d 面(目标 %d ±3%%)" % (MAX_RETRY, 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_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_polys_json = os.path.splitext(os.path.abspath(out_fbx))[0] + "_uv.polys.json"
|
||||||
uv_preview = None
|
uv_preview = None
|
||||||
|
|||||||
Reference in New Issue
Block a user