- Introduced tests for boundary smoothing in `test_boundary_smoothing.py`, verifying that smoothing reduces stair-step artifacts while preserving boundary integrity. - Added tests for cutout boundary behavior in `test_cutout_boundary.py`, ensuring proper handling of boundary triangles and normal blending. - Created `test_temporary_attributes.py` to check the cleanup of temporary attributes across depth modifier branches, ensuring no warnings are raised. - Implemented point culling functionality in `test_validity.py`, confirming that invalid points are removed without affecting adjacent geometry. - Developed boundary smoothing logic in `boundary_smoothing.py`, allowing for depth smoothing while maintaining edge integrity. - Added cutout boundary management in `cutout_boundary.py`, including functions for removing boundary triangles and tapering thickness profiles. - Implemented validity checks in `validity.py` to ensure proper deletion of invalid vertices and associated wire edges.
5.5 KiB
Context
当前三个深度表面均在投影后执行 Boundary Smooth。Depth Cutout 保护原 Alpha 轮廓的三维位置,Depth Plane 平滑有效性剔除形成的新边界,Depth Panorama 平滑球面的实际开口。
独立实验复用了猫、幼虫和人物的已有深度数据。Cutout 的六个网格在 4、12 次深度 Blur 后明显减少尖刺;Depth Plane 在 Subdivide 4、6 和 Boundary Smooth 5、12 下也有改善。两轮实验均验证关闭还原、拓扑保持和厚度/Split 组合。全景尚需专项验证。
实验文件位于本机临时目录 anyimage-boundary-depth-trial:boundary-smooth-comparison.blend、convert-boundary-comparison.blend 及对应指标 JSON。正式回归测试使用可重建的合成数据;实图用于人工验收。
Goals
- 三个已有 Boundary Smooth 的深度表面使用同一标量平滑规则和参数语义。
- 在边界窄带降低采样深度突变,保留内部数据及对应投影方向。
- 通过现有公共节点构建模块复用实现,并更新可直接加载的节点资产。
Decisions
求值顺序
flowchart TD
A[基础网格与深度采样] --> B[有效性剔除]
B --> C[Split 与切口深度处理]
C --> D[在当前连通网格上 Blur 深度标量]
D --> E[按边界两圈影响权重混合]
E --> F[沿原投影方向置换]
F --> G[现有 Boundary Smooth 网格平滑]
G --> H[厚度与后续形状处理]
共享实现位于 tools/nodes/common/boundary_smoothing.py,输入深度标量和边界保护字段,输出平滑后的标量。字段在剔除和 Split 后、置换前的 Point 域求值,使已删区域及已分离表面按当前拓扑隔离。各组负责把标量接入自身的投影表达式。
参数与影响范围
Boundary Smooth 同时给深度 Blur 和现有网格平滑提供迭代数,默认 5、范围 0–20,保持已有 socket 标识。实验中的独立 Boundary Depth Blur 输入收敛为现有控制项。
深度 Blur 使用 FLOAT、固定 Weight 0.5。令 B 为可处理的边界点字段,P 为保护字段:
- 在当前网格上对
B执行 2 次、Weight1的 Blur。 - 应用权重为
max(B, blurred_B) * (1 - P),外边界完全应用,邻近两圈逐渐减弱。 - 原深度与平滑深度按该权重混合。
- 迭代数为
0或权重为0时直接返回原采样值,保证关闭及影响范围外的精确保持。
深度计算和影响权重使用共享字段连接。Smooth Weight 延续现有网格平滑职责,深度 Blur 的固定 Weight 与独立实验一致。
三个节点组的边界与投影
| 节点组 | 深度 Blur 影响边界 | 标量与重建方式 |
|---|---|---|
| O Image Depth Cutout | 原 Alpha 轮廓及 Split 后的新边界 | 平滑相机 Z;按新旧 Z 比例缩放原相机点,再进入现有投影 |
| O Image Depth Plane | 有效性剔除及 Split 后的新边界;保护 UV 原矩形外框 | 平滑相机 Z;按原相机射线重建点,再进入现有投影 |
| O Image Depth Panorama | 球面有效性剔除及 Split 后产生的实际开口 | 平滑有效径向距离;保持球面方向,再进入 Depth Scale 的半径表达式 |
Cutout 原轮廓的深度可以变化,后续网格平滑继续使用现有原轮廓保护字段。这样保留图像投影轮廓,同时允许轮廓深度变平顺。Depth Plane 的矩形外框保护同时约束影响起点和最终权重。
Panorama 的经度接缝和极点依照真实球面拓扑求值;UV 接缝本身不形成平滑边界。有效距离平滑在 Invalid Distance 替代分支之前接入,保留区域的无效距离继续由该参数决定。无效区域与有效区域之间沿现有剔除逻辑断开混合面,验证其不会参与有效边界的平均。
相机 Z 重建必须处理零值及不可用于比例计算的采样,直接保留对应原点值,保证结果有限。投影方向保持的断言放在深度平滑/置换阶段;后续网格平滑仍按既有规则移动顶点。
节点与资产组织
公共函数以标量字段为复用边界,三个消费组分别完成相机与球面重建。使用显式域转换及明确源几何采样,所有几何组与嵌套组保持 Capture Attribute 为零。直接连接可复用字段;必要的现有临时命名协议在最后消费者后清理,保留用户属性。
实施时读取当前工作区基线,保留其他修改。完成源码与测试后运行 uv run node-group build,更新 O_AnyImage.blend 并独立加载验证接口、求值和节点布局。
三个消费组的资产版本统一设为 12,运行时通过 load_node_group(..., asset_revision=12) 请求。加载器保留当前文件中旧组及其现有使用者,为新建对象读取新版本;对应 Operator 回归覆盖旧组存在时的行为。
Risks / Trade-offs
- 稀疏网格的两圈覆盖范围较宽,较高迭代数可能软化真实轮廓深度 → 保留默认值 5,并用 Subdivide 4、6 对比 5、12 的效果。
- 深度 Blur 与后置网格平滑叠加 → 分别检查置换阶段的射线保持、最终尖刺改善和整体形状,不把梯度下降单独视为几何更准确。
- 模型 validity 开口可能位于物体内部 → 使用内部孔洞、真实深度断层与孤立尖刺的合成用例,检查影响范围及不同连通表面的隔离。
- 球面方向和无效距离与相机 Z 语义不同 → Panorama 使用径向适配,覆盖经度接缝、极点、Invalid Distance 和 Valid Only 两个分支后再交付。