2.7 KiB
2.7 KiB
减面工具 UV 展开优化(锐边 seam + 常规展开)设计
日期:2026-07-16。前置:2026-07-16-model-decimate-bake-design.md(工具1 model_decimate.py)。
问题
bl_decimate.py 的 _smart_unwrap 用 Smart UV Project(angle_limit 66°)按面朝向分组投影;减面后的纯三角网格面法线抖动大,UV 被切成大量碎岛——烘焙接缝多、贴图空间浪费、mipmap 下接缝更明显。
方案(已定:方案A)
锐边标 seam + 常规展开 + 质量检测回退:
- 标 seam:EDIT 模式
edges_select_sharp(sharpness=66°)→mark_seam。接缝只落在硬边处,平滑区域保持为整岛 - 展开:
uv.unwrap(method='MINIMUM_STRETCH')(Blender 4.3+ SLIM,质量最好);该枚举不可用时回退ANGLE_BASED - 打包:
uv.pack_islands(rotate=True, margin=0.002)(≈2048 图 4px,与原 smart_project 的 island_margin 一致) - 质量门:封闭平滑曲面若无一条 seam 会展开重叠/翻转。展开后检测:
- 重叠:
bpy.ops.uv.select_overlap()后经 bmesh 统计选中面占比 - 翻转:UV 面签名面积为负的占比(纯数学,不依赖 ops)
- 重叠占比 > 2% 或翻转占比 > 2% → 自动回退现有 smart_project 路径并打警告,保证不劣于现状
- 重叠:
- 指标上报:
MT_SUMMARY增加uv字段{mode, islands, fill, overlap, flipped}——岛数(bmesh 提取"UV 连续边"邻接 + 纯逻辑 union-find)、UV 空间利用率(UV 面积和)、重叠/翻转占比。CLI 打印
接口变更
model_decimate.py新增--unwrap {seam,smart},默认seam;smart即原行为(也是质量门的回退路径)bl_decimate.pyargv 追加第 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)