【3D AICG 系列-8】PartUV 流程图详解

系列文章目录


文章目录

  • 系列文章目录
  • [PartUV 流程图详解](#PartUV 流程图详解)
    • [1. 系统整体架构图](#1. 系统整体架构图)
    • [2. 递归展开详细流程](#2. 递归展开详细流程)
    • [3. 合并展开算法流程](#3. 合并展开算法流程)
    • [4. 部件边界平滑流程](#4. 部件边界平滑流程)
    • [5. 数据流图](#5. 数据流图)
    • [6. 并行处理流程](#6. 并行处理流程)
    • [7. 打包流程](#7. 打包流程)
    • [8. 关键决策点](#8. 关键决策点)
    • [9. 失真评估流程](#9. 失真评估流程)
    • [10. 完整调用链](#10. 完整调用链)

PartUV 流程图详解

1. 系统整体架构图

输出层
打包层 (Python)
核心展开层 (C++)
预处理层 (Python)
输入层


3D网格文件

.obj/.glb
加载网格
修复网格

合并顶点/修复非2流形
PartField推理

生成层次树
保存预处理结果
加载层次树
递归处理树节点
提取子网格
尝试多种展开方法
评估失真
失真 < 阈值?
保存为部件
继续分割
选择打包方法
Blender打包
UVPackMaster打包
最终网格

带UV坐标

2. 递归展开详细流程

展开方法
失真 < 阈值
失真 >= 阈值




开始处理节点
提取节点对应的面
提取子网格 Vc, Fc
尝试多种展开方法
unwrap_aligning_merge

合并展开
unwrap_aligning_plane

平面对齐
unwrap_aligning_BB

包围盒对齐
unwrap_aligning_one

单面展开
评估失真和图表数
评估失真和图表数
评估失真和图表数
评估失真和图表数
选择最佳候选
检查失真
首次达到阈值?
必须分割
保存为部件

设置图表限制
图表限制 > 2?
尝试优化分割
获取左右子节点
平滑部件边界
递归处理左子树
递归处理右子树
合并左右结果
比较并选择最佳
获取左右子节点
平滑部件边界
递归处理左子树
递归处理右子树
合并左右结果
返回结果
结束

3. 合并展开算法流程





输入网格 V, F
计算面法向量
基于OBB对齐分割

初始部件
构建部件邻接图
按大小排序部件
还有可合并的部件?
选择最小部件
找到最佳合并目标
尝试合并
合并成功?
更新邻接图
跳过该部件
输出最终部件列表
对每个部件进行UV展开
计算失真
返回结果

4. 部件边界平滑流程







输入部件列表和面邻接关系
遍历所有面
当前面在部件边界?
获取相邻面
统计相邻面所属部件
至少2个邻居

属于同一其他部件?
重新分配该面
更新部件列表
还有边界面?
返回平滑后的部件

5. 数据流图

输出数据
展开数据
预处理数据
输入数据
网格文件
顶点 V: N×3
面 F: M×3
修复后的网格
部件树 Tree
节点记录 NodeRecord
子网格 Vc, Fc
部件列表 Components
UV坐标 UV: N×2
失真值 Distortion
UVParts
Component列表
最终网格 + UV

6. 并行处理流程

串行分支
并行分支


开始处理根节点
递归深度 < parallelDepth?
并行处理
串行处理
线程1: 处理左子树
线程2: 处理右子树
等待完成
合并结果
处理左子树
处理右子树
返回最终结果

7. 打包流程

blender
uvpackmaster
part-based
multi-atlas
展开完成
加载 final_components.obj
选择打包方法
使用 bpy 调用 Blender
使用 BlenderProc
加载网格
调用 Blender 打包API
保存 final_packed.obj
加载 UVPackMaster 插件
打包模式?
部件感知打包

同一部件的图表在一起
多图集打包

根据部件树分配
保存 final_packed.obj
输出最终结果

8. 关键决策点













处理节点
节点面数 <= 1?
单面展开
提取子网格
尝试展开
展开成功?
返回空结果
失真 < 阈值?
必须分割
首次达到阈值?
创建部件

设置图表限制
图表限制 > 2?
尝试优化分割
分割结果更好?
使用分割结果
递归分割
返回结果

9. 失真评估流程

渲染错误: Mermaid 渲染失败: Parse error on line 7: ... F --> G[失真 = max(3D/2D, 2D/3D)] -----------------------^ Expecting 'SQE', 'DOUBLECIRCLEEND', 'PE', '-)', 'STADIUMEND', 'SUBROUTINEEND', 'PIPE', 'CYLINDEREND', 'DIAMOND_STOP', 'TAGEND', 'TRAPEND', 'INVTRAPEND', 'UNICODE_TEXT', 'TEXT', 'TAGSTART', got 'PS'

10. 完整调用链

复制代码
main()
  └─> partuv_pipeline()
       ├─> preprocess()
       │    ├─> load_mesh_and_merge()
       │    ├─> fix_mesh_trimesh()
       │    └─> PF_pipeline()
       │         └─> PFInferenceModel.process_face()
       │
       ├─> pipeline_numpy() / pipeline()
       │    └─> pipeline() [C++]
       │         ├─> load_mesh_with_validation()
       │         ├─> Tree() [加载部件树]
       │         ├─> computeFaceAdjacency()
       │         └─> pipeline_helper() [递归]
       │              ├─> ExtractSubmesh()
       │              ├─> get_uv_wrapper()
       │              │    └─> get_uv()
       │              │         └─> unwrap_aligning_merge()
       │              │              ├─> prepareOBBData()
       │              │              ├─> merge_components()
       │              │              └─> unwrap_component()
       │              │
       │              ├─> get_best_part()
       │              ├─> compare_new_parts()
       │              └─> smoothComponentEdge()
       │
       └─> save_results()
            └─> pack_mesh() [可选]
                 ├─> pack_with_blender()
                 └─> pack_with_uvpackmaster()

这些流程图帮助理解 PartUV 的完整工作流程和关键决策点。

相关推荐
EasyGBS21 小时前
GB35114+GB28181:EasyGBS视频融合平台如何构建视频监控 “联网+安全” 双重保障体系
网络·人工智能·国标gb28181·gb35114
仰泳的熊猫21 小时前
题目2194:蓝桥杯2018年第九届真题-递增三元组
数据结构·c++·算法
只说证事21 小时前
中专计算机专业必考的证书清单有哪些?
人工智能
Tisfy21 小时前
LeetCode 1888.使二进制字符串字符交替的最少反转次数:前缀和O(1)
算法·leetcode·字符串·题解
臭东西的学习笔记21 小时前
论文学习——通过蛋白质片段-环境比对实现自我监督口袋预训练
人工智能
滴滴答滴答答1 天前
机考刷题之 9 LeetCode 503 下一个更大元素 II
算法·leetcode·职场和发展
飞Link1 天前
梯度下降的优化算法中,动量算法和指数加权平均的区别对比
人工智能·深度学习·算法
1941s1 天前
02-LangChain 框架入门:模型抽象与 Prompt 模板
人工智能·langchain·prompt
猫咪老师19951 天前
Claude Code从零开始不敲代码使用若依java框架开发-第1节部署篇
人工智能·claude code
冬奇Lab1 天前
OpenClaw 实战:SKILL安装极简指南,让你的 Agent 真正干活
人工智能·aigc