Files
AIC-Project/docs/superpowers/specs/2026-07-16-decimate-uv-seam-unwrap-design.md

2.7 KiB
Raw Permalink Blame History

减面工具 UV 展开优化(锐边 seam + 常规展开)设计

日期:2026-07-16。前置:2026-07-16-model-decimate-bake-design.md(工具1 model_decimate.py)。

问题

bl_decimate.py_smart_unwrap 用 Smart UV Projectangle_limit 66°)按面朝向分组投影;减面后的纯三角网格面法线抖动大,UV 被切成大量碎岛——烘焙接缝多、贴图空间浪费、mipmap 下接缝更明显。

方案(已定:方案A

锐边标 seam + 常规展开 + 质量检测回退:

  1. 标 seamEDIT 模式 edges_select_sharp(sharpness=66°)mark_seam。接缝只落在硬边处,平滑区域保持为整岛
  2. 展开uv.unwrap(method='MINIMUM_STRETCH')Blender 4.3+ SLIM,质量最好);该枚举不可用时回退 ANGLE_BASED
  3. 打包uv.pack_islands(rotate=True, margin=0.002)(≈2048 图 4px,与原 smart_project 的 island_margin 一致)
  4. 质量门:封闭平滑曲面若无一条 seam 会展开重叠/翻转。展开后检测:
    • 重叠:bpy.ops.uv.select_overlap() 后经 bmesh 统计选中面占比
    • 翻转:UV 面签名面积为负的占比(纯数学,不依赖 ops)
    • 翻转占比 > 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 打印

接口变更

  • model_decimate.py 新增 --unwrap {seam,smart},默认 seamsmart 即原行为(也是质量门的回退路径)
  • bl_decimate.py argv 追加第 4 参 unwrap_mode
  • 其余接口/产物命名不变;model_bake.py 不受影响(只消费低模 UV

可单测纯逻辑(TDD

  • count_islands(n_faces, adjacent_pairs)union-find 数 UV 岛
  • flipped_fraction(signed_areas):负面积占比
  • fill_ratio(abs_areas):面积和(截断到 1.0

bmesh 提取邻接/面积的胶水代码走冒烟验证。

验证

  • 单测:上述纯逻辑
  • 冒烟:well1500.fbx --tris 5000 分别跑 --unwrap seam--unwrap smart,对比 islands/fill——要求 seam 模式岛数显著下降(数量级)、fill 不低于 smart、overlap/flipped ≈ 0;随后用新低模重跑一次烘焙确认贴图正常
  • Unity 手动验证由用户完成

局限

  • seam 位置由几何硬边决定,全平滑无硬边模型会触发回退(此时 smart_project 本来就是合理选择)
  • 不做手工 seam 编辑入口;要精细控制请在 DCC 里做好 UV 再直接喂 model_bake.py(工具2 不动 UV