- Introduced the two-times upscale specification detailing requirements for unified output, fixed model presets, arbitrary dimensions, and consistent job behavior. - Added scenarios for existing models, repeated upscale, and handling of alpha preservation. - Created the unified depth plane specification outlining geometry modes, stable interface, and asset evaluation. - Defined scenarios for mode switching, relief and camera preservation, and validation of delivered assets.
6.1 KiB
Context
独立原型验证了 12 个透视视图的 MoGe2 推理、距离融合和 Quad Sphere。正式转换沿用 Image Empty 的异步转换流程。用户明确选择通过现有 Remove Background 预先处理背景,转换消费当前图片和 Alpha。
Goals / Non-Goals
本次范围是静态 2:1 等距柱状全景的菜单转换、正式节点资产和 Split Threshold。沿用原型的 Subdivide、Depth Scale 和单张深度图片约定。
Decisions
入口与对象生命周期
flowchart TD
A[Image Empty 右键 AnyImage] --> B[Convert to Panorama]
B --> C[检查静态图和 2 比 1 尺寸]
C --> D[读取当前 RGBA 和 Preferences]
D --> E[提交全景 Job]
E --> F[加载并打包颜色和深度]
F --> G[创建全景对象和节点修改器]
G --> H[替换源 Empty 并记录撤销]
新增 operators/convert_to_panorama/,operators.py 定义 ConvertToPanorama 与 GeneratePanorama,object.py 创建结果,__init__.py 导出注册清单。公开入口为 anyimage.convert_to_panorama,Job 为 generate-panorama-geometry。复用 common 的输入暂存、材质、深度加载、修改器赋值和对象收尾函数。
模型、推理级别和分析尺寸从 Preferences 读取,Job 参数为普通字典。Blender 数据只在主线程读取输入和处理响应。新对象中心对应原 Empty 原点,继承其世界变换;局部 +Z 为全景上方,U=0 朝向 +X,U 增加沿 +Y 转动。生成成功后替换源对象并激活结果;失败、取消或源对象已失效时清理本次临时资源。图片显示偏移只属于平面预览,球面方向由完整图片 UV 定义。
后端与数据协议
flowchart TD
A[当前 RGBA 全景] --> B[12 个重叠 90 度视图]
B --> C[MoGe2 与已知 FOV 的几何恢复]
C --> D[有效视图的径向距离]
D --> E[横向周期的对数梯度融合]
E --> F[尺度锚定与有限距离场]
A --> G[源 Alpha 对齐到深度尺寸]
F --> H[depth.exr]
G --> H
server/jobs/panorama.py 负责任务调度,server/geometry/panorama.py 负责投影与融合。将已知 FOV 接入已有 ONNX 后处理和模型会话生命周期,普通图片继续使用焦距估计。保留原分辨率颜色;视图分析尺寸遵循输入上限,首版目标视图为 512×512,融合网格最长边上限 512 且保持 2:1。Subdivide 独立控制最终网格密度。
源 Alpha 对齐、黑底模型输入及可见区域排除采用原型已验证的流程。全透明视图跳过推理,部分视图无效时继续融合其余有效观测;全局无有效几何时报错。逐视图及融合前后检查取消,释放模型资源。
| 字段 | 文件 | 内容 |
|---|---|---|
| 颜色文件 | image.0001.png |
当前 RGBA,保留源 Alpha |
depth |
depth.exr |
float32 RGB 重复保存径向距离,A 为融合 Mask × 源 Alpha |
depth_metadata |
depth.json |
projection: equirectangular、image_size、reference_distance |
reference_distance 为满足 Alpha 阈值的有限正径向距离中位数,用于 Split Threshold 的尺度归一化。全景元数据按投影类型单独读取;复用现有 EXR 写入及 Non-Color、CHANNEL_PACKED、Pack 配置。颜色由材质采样,几何节点只有一个深度图片输入。
Quad Sphere 与 Split Threshold
新增资产 O Image Panorama。Quad Sphere 与球面校正子组的构建定义归入本仓库节点构建模块,参考已检查的 O Quad Sphere,运行时从 O_AnyImage.blend 加载。面数为 6 × 4^Subdivide,默认 Subdivide=7;Depth Scale 默认 1,范围 0–1;Validity Threshold 默认 0.9;Split Threshold 默认 0,范围 0–1。深度图片、材质和参考距离作为数据输入。
flowchart TD
A[可调细分 Quad Sphere] --> B[固定单位射线与球面 UV]
B --> C[按深度 EXR Alpha 剔除无效面]
C --> D[相邻面径向距离变化判断]
D --> E[Split Edges 与条带面清理]
E --> F[分离面角沿原射线取所属面距离]
F --> G[Depth Scale 插值到重建表面]
G --> H[材质与临时属性清理]
提取并复用 tools/nodes/common/depth_surface.py 中的相邻面采样、内边判断、Split Edges、面角归属和条带面清理。共用逻辑消费明确的深度字段、基础面中心和归一化比例;Depth Plane 的调用同步适配,保持已有求值结果。
对全景,令相邻面距离为 rA/rB,单位球面上的面中心为 cA/cB,参考距离为 R。沿用现有 2.5 系数,以 abs(rA-rB) / R × Split Threshold > 2.5 × distance(cA,cB) 选择有两个邻面的内边。阈值为 0 时直接保留通过有效性剔除的原网格;阈值增大时选择更多断层边。
选中断层附近的面角使用其所属面的距离,未选中的顶点保持原采样;所有点沿原始球面射线定位。最终半径为 1 + Depth Scale × (目标距离 - 1)。条带面清理遵循当前 Depth Plane 的同一拓扑快照规则。
全景面中心采样由面中心方向重新计算 UV,横向循环采样;材质面角 UV 独立处理经度分支和极点。这样左右接缝与普通内边参与同样的判断。分裂后保留原射线及面角 UV,末尾清理专用临时属性。
验证与交付
正式模块从原型迁移有效算法及测试,运行时依赖正式模块与打包资产。此次实现运行相关单元测试、完整回归测试和独立 Blender 求值检查。节点资产更新走现有离线资产流程;扩展包及文档构建属于另行发布操作。
Risks / Trade-offs
- 径向距离与平面 Z 深度的比较尺度不同 → 用参考距离归一化,并测试相同形状整体缩放后的分裂选择一致。
- 全景接缝和极点的 UV 有多种等价表示 → 用方向生成采样坐标,并验证接缝两侧的等价深度断层。
- 共享分裂代码近期增加了条带清理 → 保留现有 Depth Plane 回归结果,并覆盖全景分裂后孤立条带、Alpha 边缘和连续斜面。
- 天空及遮挡导致预测缺失 → 以当前源图 Alpha 和融合 Mask 确定有效几何,允许通过现有 Remove Background 预先处理。