# ModelTranslator 烘焙质量自适应优化设计 日期:2026-07-16 前置设计: - `2026-07-16-model-decimate-bake-design.md` - `2026-07-16-decimate-uv-seam-unwrap-design.md` ## 背景 `well1500.fbx`(约 150 万面)与 `well_uv.fbx`(5000 面)的现有烘焙结果存在明显脏污。诊断排除了模型位置和缩放错位,确认问题由三类因素叠加: 1. 低模保留了不再适配减面后拓扑的自定义平滑法线。低模着色法线与高模表面法线的中位偏差为 31.9 度,约 19.5% 的采样偏差超过 45 度。 2. 自动射线使用包围盒对角线的 2%,本例为 0.0282;高低模 99% 的实际表面距离只有约 0.0041,过宽射线容易命中相邻结构。 3. 低模 UV 检测到约 7.3% 重叠,且 UV 打包间距与 16px 烘焙扩边不匹配。 Blender 5 的无界面实验表明,清除低模自定义法线并按 66 度平滑后,法线偏差中位数可从 31.9 度降到 16.4 度,超过 45 度的采样可从 19.5% 降到 5.3%。UV seam 角度自适应降到 45 度时,当前模型可在保持合理利用率的同时把重叠降到约 1.3%。 ## 目标 - 默认产出可用的 normal、AO、color、metallic、roughness 贴图,不再依赖用户反复试射线参数。 - 修复工具自己生成的低模法线,并能诊断、修复外部低模的异常法线。 - 对 UV 重叠、翻转、padding 不匹配建立烘焙前质量门。 - 保持现有命令和输出命名兼容;高级用户可以保留手工法线、UV 或显式指定射线。 - 在命令输出中给出足够的质量指标,便于定位后续模型特例。 ## 非目标 - 不实现手工 cage 建模或高低模部件名称匹配。 - 不引入 xatlas 等外部依赖。 - 不改变源 FBX;所有自动修复只作用于当前 Blender 会话和最终输出 FBX。 - 不保证 5000 面可以无损表达任意 150 万面场景;工具会报告极端减面风险,但目标面数仍由用户决定。 ## 方案选择 采用“自适应质量管线”:减面阶段生成适合烘焙的法线和 UV,烘焙阶段再次验证外部低模,并根据真实高低模距离计算射线。 未采用的方案: - 仅降低固定射线百分比:改动小,但无法适配不同尺寸和细节密度。 - 强制显式 cage 或分部烘焙:质量上限更高,但需要额外资产约定,超出当前工具的零配置目标。 ## 数据流 ```text 高模 FBX -> model_decimate -> 减面 -> 法线重建 -> 自适应 seam UV + padding -> 低模 FBX 高模 FBX + 任意低模 FBX -> model_bake -> 包围盒/UV/法线诊断 -> 必要时仅在内存中修复低模 -> BVH 表面距离采样 -> 自适应射线 -> 五张贴图 + 包含最终法线/UV 的低模 FBX ``` ## 法线处理 ### 减面输出 Decimate 和最终三角化完成后: 1. 清除导入 FBX 携带的 custom split normals。 2. 调用 Blender 5 的 `shade_smooth_by_angle`,默认角度 66 度并保留已有锐边。 3. UV 展开使用相同或更低的 seam 角度,保证所有法线硬边也是 UV 边界;允许 UV 有额外接缝。 4. 输出法线修复前后的基础指标。 ### 外部低模 烘焙阶段最多均匀采样 10000 个低模面中心,用高模 BVH 最近点及高模插值着色法线计算偏差: - 中位偏差大于 25 度,或 P90 大于 50 度,判为异常。 - 异常时默认执行与减面阶段相同的法线重建。 - `--keep-low-normals` 跳过修复,但保留警告和指标。 该判断只用于决定是否修复,不会拒绝烘焙。源低模文件不会被覆盖,修复结果写入烘焙输出目录中的 FBX。 ## UV 处理 ### 自适应 seam 替换当前单一 66 度 seam 尝试。按 `60, 55, 50, 45, 40, 30` 度从高到低展开,每次收集 islands、fill、flipped、overlap: - overlap 不超过 2%; - flipped 不超过 0.5%; - fill 大于 0。 选择第一个达标结果,以优先减少 UV 岛数。所有候选都失败时回退 Smart UV Project,并报告原因和最终指标。 ### 外部低模质量门 烘焙前复用同一指标: - UV 缺失:保持现有行为,直接报错。 - overlap 超过 2% 或 flipped 超过 0.5%:默认用自适应 seam 重展。 - `--keep-low-uv` 跳过重展,但保留警告。 重展只改变输出 FBX。对唯一贴图烘焙而言,重叠 UV 无法可靠保留,因此自动修复是默认行为。 ### Padding - `model_decimate.py` 新增 `--texture-size`,默认 2048。 - 两个 CLI 都新增 `--padding`,默认 8px。 - UV 打包 margin 由 `padding / texture_size` 计算。 - Blender bake 的 `margin` 使用同一个 padding 值。 当前 16px bake margin 与约 4px UV 间距的组合不再作为默认值。8px 是 2048 贴图在利用率和 mipmap 安全之间的折中,用户可按目标平台覆盖。 ## 自适应射线 烘焙导入高低模并完成低模法线修复后,构建高模世界空间 BVH。最多均匀采样 10000 个低模面中心,统计到高模最近表面的距离。 自动射线计算: ```text base = P99(distance) * 1.5 lower = bbox_diagonal * 0.0005 upper = bbox_diagonal * 0.01 ray = clamp(base, lower, upper) max_ray_distance = ray * 2 ``` - 显式 `--ray-distance` 完全绕过自动估算,保持最高优先级。 - P99 被上限截断时打印警告,提示检查模型对应关系或显式指定射线。 - BVH 无有效采样时停止烘焙并返回明确错误,不回退到原来的 2% 固定值。 对当前 well 模型,预期自动射线约为 0.0062,而不是 0.0282。 ## CLI 与兼容性 `model_decimate.py` 新增: ```text --texture-size 2048 --padding 8 --smooth-angle 66 ``` `model_bake.py` 新增: ```text --padding 8 --smooth-angle 66 --keep-low-normals --keep-low-uv ``` 现有参数、默认输出目录和文件命名不变。内部 Blender 脚本 argv 同步追加对应值;旧 CLI 调用无需修改。 ## 指标与错误处理 `MT_SUMMARY` 增加: - `normal`: `{repaired, before_median, before_p90, after_median, after_p90}` - `uv`: 现有字段外增加 `{repaired, seam_angle, padding}` - `ray`: `{source, distance_p99, value, capped}` CLI 用短行打印这些指标。自动修复、保留异常数据和射线上限截断使用警告;缺少 UV、BVH 无命中、无 mesh 等无法产生可信结果的情况继续返回错误。 ## 测试 所有纯决策逻辑先按 TDD 添加失败测试: - 百分位与射线 clamp; - 法线异常判定; - seam 候选选择; - padding 到 UV margin 的换算; - keep 参数下的决策分支。 Blender 冒烟验证使用 `well1500.fbx + well_uv.fbx`,写入未跟踪的临时输出目录: 1. 减面输出仍为 5000 面(允许现有 3% 容差)。 2. UV overlap 不超过 2%,flipped 不超过 0.5%。 3. 法线修复后的 median 和 P90 均低于修复前,median 不高于 20 度。 4. 自动射线位于 0.004 到 0.010 之间,并报告为 adaptive。 5. 低模 FBX 和五张指定尺寸 PNG 均存在且非空。 6. 查看 normal、AO、color,确认没有大面积跨部件投射或异常空洞。 7. 运行 ModelTranslator 全部现有单元测试,确保转换器行为无回归。 ## 风险与控制 - BVH 会增加一次高模内存占用和数秒分析时间;采样上限控制低模侧开销,相对 Cycles 烘焙可接受。 - `uv.select_overlap` 是 Blender 质量指标,可能对边界接触较敏感;候选选择同时检查翻转和 fill,真实模型冒烟作为最终质量门。 - 自动法线或 UV 修复会改变输出低模的顶点着色表现和 UV,但不会修改源文件,并提供 keep 参数退出自动行为。 - 单一全局射线仍不等价于手工 cage;极密集或多层模型后续可扩展显式 cage,此次不提前增加接口。 ## 验收标准 - 无参数运行现有三步命令仍可完成。 - 当前 well 案例自动触发法线和 UV 修复,射线改为真实距离驱动。 - 自动指标满足测试章节中的数值门槛。 - 输出贴图经视觉检查明显减少彩色法线噪声、UV 串色和跨部件投射。 - README 说明新默认行为、覆盖参数和质量指标。