feat: Implement weight cutout boundary smoothing for image depth cutout
- Added a new proposal for boundary smoothing in the weight cutout process, differentiating between Split edges and Outline smoothing requirements. - Introduced a new capability `cutout-boundary-smoothing` to control smoothing strength and default values. - Updated specifications to define the behavior of boundary-specific smoothing strength and default settings. - Created tasks to verify the implementation of boundary behavior and asset updates. - Developed comprehensive tests for depth symmetry and normal scaling to ensure expected behavior and performance. - Introduced new attributes for normal mapping to facilitate persistent face attributes sharing between depth symmetry and image materials. - Built a new node group for O Image Depth Symmetry, integrating the new smoothing capabilities and ensuring compatibility with existing workflows.
This commit is contained in:
@@ -0,0 +1,2 @@
|
||||
schema: spec-driven
|
||||
created: 2026-09-14
|
||||
77
openspec/changes/add-projected-depth-symmetry/design.md
Normal file
77
openspec/changes/add-projected-depth-symmetry/design.md
Normal file
@@ -0,0 +1,77 @@
|
||||
## Context
|
||||
|
||||
`O Image Depth Balloon` 当前以原始 Cutout 网格作为对称平面上的轮廓,通过 `o_balloon` 和深度差构建两侧。新需求已经用用户提供的小车图完成独立实验:正面投射后截留正 Z 区域,两侧围绕固定 XY 平面镜像,并以直壁连接对应外边界。
|
||||
|
||||
实验文件位于 `C:/Users/icrdr/AppData/Local/Temp/anyimage-car-symmetry/`:`car-depth-balloon-fast-modes.blend`、`fast_balloon.py`、`performance-results.json`、`mode-validation.json`。这些是可复核的实验材料,正式实现和测试自行提供所需资源。
|
||||
|
||||
## Goals / Non-Goals
|
||||
|
||||
**Goals:** 双模式、手势预设、完整对称网格、独立且可复用的节点构建、统一命名。
|
||||
|
||||
**Non-Goals:** 本变更不包含旧资产兼容层、AI 模型调整或自动推断最佳车身对称方向。
|
||||
|
||||
## Decisions
|
||||
|
||||
### 名称与手势
|
||||
|
||||
| 对象 | 名称 |
|
||||
|---|---|
|
||||
| 功能与菜单 | `Depth Symmetry` |
|
||||
| 节点组 | `O Image Depth Symmetry` |
|
||||
| 构建模块与入口 | `image_depth_symmetry.py` / `build_image_depth_symmetry_group()` |
|
||||
| Shape 标识 | `DEPTH_SYMMETRY` |
|
||||
| Mode 顺序 | `Balloon`、`Projected` |
|
||||
|
||||
`Balloon` 描述原有鼓起方式;`Projected` 描述新模式的投射轮廓。功能名称表达两者共同的对称职责,避免用其中一个模式命名整个节点组。
|
||||
|
||||
| 手势 | Depth Cutout(现有) | Depth Symmetry |
|
||||
|---|---|---|
|
||||
| Lasso | Balloon | Balloon |
|
||||
| Polyline | Shell | Projected |
|
||||
|
||||
在 Cutout 对象创建阶段按 gesture 设置 Mode。预设只影响初值,用户仍可直接切换节点 Mode。裸节点默认 Balloon,保持原有入口的默认行为。
|
||||
|
||||
### 直接构建 Projected 正面
|
||||
|
||||
复用 `_position_field` 读取 Depth Image 的相机 XYZ,乘以 Uniform Scale,将 Y 转为现有 Cutout 坐标约定,以 `Reference Depth − metric depth` 构建 Z。Depth Scale 沿用已验证的平面坐标与相机坐标插值,并缩放深度差。
|
||||
|
||||
将 Depth Direction 对应的方向对齐到局部 Z 轴,输出成形坐标中的正面。Reference Depth 和 Depth Direction 共同改变位移与投射后的轮廓;最终镜像面固定在成形坐标 `Z=0`,不把镜像结果转回倾斜平面。既有 Depth Axis 作为统一的最终坐标变换保留。
|
||||
|
||||
复用公共边界平滑,随后在 POINT 域判断负 Z,并在 FACE 域判断是否包含越界顶点。删除包含越界顶点的整面及其失去面的边线、孤点。仅保留正 Z 面,不产生压扁在对称平面上的外围裙边。平面附近使用与几何尺度相适应的小容差处理零厚度退化。
|
||||
|
||||
采用整面删除,因为它只依赖现有网格与字段求值;相较精确裁切,边界具有网格分辨率级别的近似。新分支不使用 Mesh Boolean,也不嵌套 Depth Plane、Depth Cutout 节点组。
|
||||
|
||||
### 镜像与直壁
|
||||
|
||||
先完成正面和平滑,再镜像到负 Z,避免封闭后的全网格平滑破坏直壁。以边的面邻接数识别正面外边界,将每个边界点 `(x,y,z)` 与 `(x,y,-z)` 连接;生成的侧壁沿 Z 轴延伸,其法线垂直于 Z 轴。保留正背面平滑着色,侧壁使用平面着色。
|
||||
|
||||
合并对应顶点,正确处理对称平面上的零厚度边。Double Sided 打开时生成完整封闭网格;关闭时沿用已验证原型的正面预览行为。Balloon 分支原有 Double Sided、Thickness、平滑等语义保持不变。Thickness 继续控制 Balloon 轮廓;Projected 的形体由 Depth Scale、Reference Depth、Depth Direction 控制,不引入未经验证的厚度推断。
|
||||
|
||||
### 复用与模式分派
|
||||
|
||||
复用公共节点接口、深度采样、岛清理、边界平滑、普通平滑和属性函数。节点内部保留直接构建的两条几何分支,通过 Mode 选择;共享最终输出和坐标约定,不通过嵌套节点组包装旧实现。
|
||||
|
||||
Projected 需要局部辅助函数时放在该业务模块;只有确有其他消费者的函数才进入 common。UV 和现有命名属性继续随拓扑传递,新增临时属性需要明确生命周期;源码与保存资产中 Capture Attribute 数量均为零。
|
||||
|
||||
### 性能与验证
|
||||
|
||||
同一小车输入、相同参数与 3 次边界平滑,预热 4 次后连续修改 Reference Depth,记录 24 次依赖图求值的中位数。外部实验的双模式 Projected 分支结果如下:
|
||||
|
||||
| 输入顶点 | 布尔原型 | 双模式直接构建 | 提速 |
|
||||
|---|---:|---:|---:|
|
||||
| 27,860 | 174.9 ms | 30.9 ms | 约 5.7 倍 |
|
||||
| 165,771 | 960.7 ms | 135.6 ms | 约 7.1 倍 |
|
||||
|
||||
这些数值是当前机器的对比证据,不作为跨机器测试断言。正式验证保留同输入、同平滑、同参数的对照,并分别记录 Reference Depth 与 Depth Direction 调整耗时。几何测试覆盖封闭性、顶点流形性、面绕序、XY 镜像、直壁法线、越界删除、空结果及模式切换;Balloon 分支与变更前的基准几何比较。
|
||||
|
||||
## Risks / Trade-offs
|
||||
|
||||
- 整面删除使切口随网格密度离散变化 → 使用已有采样密度控制,比较多个密度与连续参数变化,明确其为近似边界。
|
||||
- 深度噪声可能形成小岛或点接触 → 复用岛清理,测试连通性与顶点流形性,退化处删除无效拓扑。
|
||||
- 在补壁后平滑可能令侧壁弯曲 → Projected 的平滑在正面阶段完成,再镜像和补壁。
|
||||
- 只在中等网格测量可能掩盖扩展成本 → 同时验证普通与加密输入,记录求值而非渲染耗时。
|
||||
- 资产与代码名称失配 → 同步重命名 Shape 标识、模块、校准函数、构建/校验清单和界面文本,构建保存资产后检查旧引用。
|
||||
|
||||
## Migration Plan
|
||||
|
||||
实现时整体替换旧名称并更新相关代码、测试和节点资产,不保留旧路径或别名。通过 `uv run node-group build` 构建并验证 `O_AnyImage.blend`,检查新组存在、旧组不再由构建产出。已保存在用户工程中的旧节点组不执行自动扫描或重写。
|
||||
29
openspec/changes/add-projected-depth-symmetry/proposal.md
Normal file
29
openspec/changes/add-projected-depth-symmetry/proposal.md
Normal file
@@ -0,0 +1,29 @@
|
||||
## Why
|
||||
|
||||
现有 Depth Balloon 始终向原 Cutout 剪影收拢。用户需要另一种对称形体:轮廓随深度投射变化,两侧围绕固定 XY 平面对称,并通过直壁补成完整网格。小车独立实验已验证效果;直接构建版本在保留相同边界平滑时,比布尔原型约快 5.7–7.1 倍。
|
||||
|
||||
## What Changes
|
||||
|
||||
- 将功能命名为 **Depth Symmetry**,节点组命名为 `O Image Depth Symmetry`,提供 `Balloon / Projected` 两种模式。
|
||||
- `Balloon` 保持原有行为;`Projected` 直接采样深度、调整投射方向、删除越界面、镜像并补直壁。
|
||||
- Lasso 默认使用 `Balloon`,Polyline 默认使用 `Projected`;创建后仍可通过 Mode 切换。与现有 Depth Cutout 的 `Lasso → Balloon / Polyline → Shell` 对应。
|
||||
- 正面保持在局部 `Z≥0`;开启 Double Sided 后,两侧关于局部 `Z=0` 对称,外边界沿 Z 轴连接,形成封闭网格。
|
||||
- 复用公共采样、清理、平滑和节点接口构建函数,新模式独立构建,不使用布尔或依赖 Depth Plane、Depth Cutout 节点组。
|
||||
- **BREAKING**:将节点资产名、Shape 标识 `DEPTH_BALLOON`、构建模块及相关代码名称统一为 Depth Symmetry,不保留旧名转发或兼容资产。
|
||||
|
||||
## Capabilities
|
||||
|
||||
### New Capabilities
|
||||
|
||||
- `image-depth-symmetry`: 双模式深度对称节点、直壁封闭、手势预设、命名和性能约束。
|
||||
|
||||
### Modified Capabilities
|
||||
|
||||
无。当前 `openspec/specs` 尚无可修改的已归档规格。
|
||||
|
||||
## Impact
|
||||
|
||||
- `tools/nodes/groups/image_depth_balloon.py`、相关公共构建函数、节点组构建与校验入口。
|
||||
- `src/anyimage/operators/cutout_tool` 的 Shape 菜单、手势分派、深度校准与对象创建,以及相关界面文本。
|
||||
- `src/anyimage/assets/O_AnyImage.blend` 和对应节点、对象创建、资产清单测试。
|
||||
- 实现时运行相关测试与 `uv run node-group build`,更新并验证源码及资产;不新增依赖。
|
||||
@@ -0,0 +1,74 @@
|
||||
## ADDED Requirements
|
||||
|
||||
### Requirement: Unified depth symmetry identity
|
||||
系统 SHALL 使用菜单名称 `Depth Symmetry`、节点组名称 `O Image Depth Symmetry` 和 Shape 标识 `DEPTH_SYMMETRY`,节点 Mode SHALL 按 `Balloon / Projected` 顺序提供选择。
|
||||
|
||||
#### Scenario: Load the node asset
|
||||
- **WHEN** 用户创建 Depth Symmetry 对象
|
||||
- **THEN** 系统从节点资产加载 `O Image Depth Symmetry`,Mode 包含 Balloon 和 Projected
|
||||
|
||||
### Requirement: Gesture selects the initial mode
|
||||
系统 SHALL 为 Lasso 创建结果选择 Balloon,为 Polyline 创建结果选择 Projected,并允许用户随后手动切换 Mode。
|
||||
|
||||
#### Scenario: Lasso preset
|
||||
- **WHEN** 用户通过 Lasso 选择区域并创建 Depth Symmetry
|
||||
- **THEN** Mode 初始值为 Balloon
|
||||
|
||||
#### Scenario: Polyline preset
|
||||
- **WHEN** 用户通过 Polyline 选择区域并创建 Depth Symmetry
|
||||
- **THEN** Mode 初始值为 Projected,Depth Cutout 自身的 Polyline → Shell 关系保持不变
|
||||
|
||||
#### Scenario: Switch the generated object's mode
|
||||
- **WHEN** 用户修改已创建对象的 Mode
|
||||
- **THEN** 同一份输入网格和深度数据按所选模式重新求值,不受创建手势锁定
|
||||
|
||||
### Requirement: Preserve balloon behavior
|
||||
Balloon 模式 SHALL 保持原 Depth Balloon 的几何与参数行为,在对称平面向原 Cutout 剪影收拢。
|
||||
|
||||
#### Scenario: Compare the original mode
|
||||
- **WHEN** 同一输入、深度图和原有参数分别进入旧基准与新节点的 Balloon 模式
|
||||
- **THEN** 输出拓扑和位置在浮点容差内一致,包括 Double Sided、Thickness、平滑及 Depth Axis 的行为
|
||||
|
||||
### Requirement: Projected positive surface
|
||||
Projected 模式 SHALL 独立读取深度,使用 Reference Depth 和 Depth Direction 调整正面的置换与投射方向。成形坐标中的正面 MUST 保持在 `Z≥0`,越界面 SHALL 被删除。
|
||||
|
||||
#### Scenario: Adjust both depth controls
|
||||
- **WHEN** 用户修改 Reference Depth 或 Depth Direction
|
||||
- **THEN** 正面形体与投射轮廓重新求值,镜像平面保持在成形坐标的 `Z=0`
|
||||
|
||||
#### Scenario: A face crosses the plane
|
||||
- **WHEN** 正面某个面含有负 Z 顶点
|
||||
- **THEN** 该面及失去面支撑的边线、孤点被删除,剩余结果不包含越界正面或外围压平裙边
|
||||
|
||||
#### Scenario: Everything is outside
|
||||
- **WHEN** 参数使全部输入面越界
|
||||
- **THEN** 输出为空几何,求值正常结束
|
||||
|
||||
### Requirement: Close the projected symmetric volume with straight walls
|
||||
Projected 开启 Double Sided 时 SHALL 关于成形坐标 `Z=0` 镜像,并沿 Z 轴直线连接对应外边界,生成封闭网格。正面平滑 SHALL 在镜像补壁之前完成。
|
||||
|
||||
#### Scenario: Complete a car volume
|
||||
- **WHEN** 合法正面存在外边界且 Double Sided 打开
|
||||
- **THEN** 输出网格没有开放边、异常面邻接或顶点非流形,面绕序一致;每个 `(x,y,z)` 存在镜像对应点 `(x,y,-z)`
|
||||
|
||||
#### Scenario: Check straight walls after smoothing
|
||||
- **WHEN** 用户开启 Projected 平滑后生成双面网格
|
||||
- **THEN** 外边界仍沿 Z 轴直线连接,侧壁法线与 Z 轴垂直,平滑不使侧壁弯曲
|
||||
|
||||
#### Scenario: Preview only the front
|
||||
- **WHEN** 用户关闭 Projected 的 Double Sided
|
||||
- **THEN** 仅输出非负 Z 正面,用于检查投射和裁去区域
|
||||
|
||||
### Requirement: Direct node construction and shared builders
|
||||
Projected 分支 MUST 直接使用基础节点与公共构建函数,不得使用 Mesh Boolean、Capture Attribute 或依赖 Depth Plane、Depth Cutout 节点组。插件运行时 SHALL 从资产加载节点组。
|
||||
|
||||
#### Scenario: Inspect the built asset
|
||||
- **WHEN** 构建与检查 `O Image Depth Symmetry`
|
||||
- **THEN** 新模式不存在布尔、Capture Attribute 或上述节点组依赖,Depth Symmetry 源码与资产接口一致
|
||||
|
||||
### Requirement: Verify performance on equivalent inputs
|
||||
实现 SHALL 在同一机器、同输入、同平滑和同参数序列下,对比直接构建版本与已验证的布尔原型,分别记录 Reference Depth 和 Depth Direction 更新耗时。
|
||||
|
||||
#### Scenario: Compare ordinary and dense meshes
|
||||
- **WHEN** 对普通与加密网格执行预热后的重复求值
|
||||
- **THEN** 报告两种更新的中位数、输入规模与测试条件,并确认正式双模式 Projected 分支的求值收益,而非以固定毫秒值作为跨机器测试门槛
|
||||
29
openspec/changes/add-projected-depth-symmetry/tasks.md
Normal file
29
openspec/changes/add-projected-depth-symmetry/tasks.md
Normal file
@@ -0,0 +1,29 @@
|
||||
## 1. 统一功能命名
|
||||
|
||||
- [x] 1.1 将构建模块和入口重命名为 `image_depth_symmetry.py` / `build_image_depth_symmetry_group()`,更新构建、校验与测试引用。
|
||||
- [x] 1.2 将菜单、Shape 标识、节点资产名称和深度校准相关名称统一为 Depth Symmetry,清除旧名称的业务引用。
|
||||
|
||||
## 2. 双模式节点
|
||||
|
||||
- [x] 2.1 保留 Balloon 分支与参数语义,新增顺序为 `Balloon / Projected` 的 Mode;复用公共接口、清理、属性及输出坐标处理。
|
||||
- [x] 2.2 直接构建 Projected 深度正面,使 Depth Direction 与 Reference Depth 控制投射,保留固定 XY 对称平面。
|
||||
- [x] 2.3 复用边界平滑与正面平滑,删除含越界点的整面并清理无面支撑拓扑,处理零厚度与空结果。
|
||||
- [x] 2.4 构建正面镜像与直壁补全,处理接缝合并、绕序、平滑着色和 Double Sided 正面预览。
|
||||
- [x] 2.5 整理节点布局,确保直接构建、无布尔、无 Capture Attribute、无复杂几何节点组依赖。
|
||||
|
||||
## 3. 手势预设
|
||||
|
||||
- [x] 3.1 在 Cutout 对象创建阶段设置 `Lasso → Balloon`、`Polyline → Projected`,保留现有 Depth Cutout 的 Balloon / Shell 预设。
|
||||
- [x] 3.2 验证两类手势的默认值、创建后 Mode 切换、深度校准输入及节点资产加载名称。
|
||||
|
||||
## 4. 几何与性能验证
|
||||
|
||||
- [x] 4.1 补充可独立运行的几何测试,覆盖非负正面、双面镜像、封闭性、顶点流形性、面绕序、直壁法线、平滑、空结果和 Depth Axis。
|
||||
- [x] 4.2 将新 Balloon 分支与变更前基准比较,验证原参数行为及模式切换不污染状态。
|
||||
- [x] 4.3 使用同输入、同边界平滑的普通与加密网格,分别测量 Reference Depth 和 Depth Direction 更新,记录预热后中位数及条件。
|
||||
- [x] 4.4 用已确认的小车案例检查视角一致的效果对比,记录整面删除在切口处的分辨率取舍。
|
||||
|
||||
## 5. 资产交付
|
||||
|
||||
- [x] 5.1 更新资产清单和相关测试,运行 `uv run node-group build`,保存并验证 `src/anyimage/assets/O_AnyImage.blend`。
|
||||
- [x] 5.2 运行相关对象创建与节点测试,检查源码、资产中的旧名称及最终差异,确认工作正常退出;不构建文档或打包扩展。
|
||||
28
openspec/changes/add-projected-depth-symmetry/validation.md
Normal file
28
openspec/changes/add-projected-depth-symmetry/validation.md
Normal file
@@ -0,0 +1,28 @@
|
||||
# 实现验证
|
||||
|
||||
2026-09-14,本机 Windows;资产由 Blender 4.5.10 LTS 构建和重载校验,几何测试及性能测量使用 bpy 4.5.3。
|
||||
|
||||
## 几何
|
||||
|
||||
- 源码构建和保存资产均验证正面越界删除、完整镜像、边与顶点流形性、面绕序、直壁法线、平滑、空输出和 Depth Axis。
|
||||
- 测试几何尺度为 0.001、1、100,包含倾斜方向和正面平滑。
|
||||
- Lasso / Polyline 默认值、模式往返切换与深度校准输入通过对象创建测试。
|
||||
- 小车 Balloon 分支在默认、单面、零厚度、平滑、坐标轴及方向变化共 5 组参数下,与变更前基准的顶点和面完全一致,最大坐标差为 0。
|
||||
- 同相机、同参数的小车渲染与已确认布尔原型一致。基准顶点到新网格最近顶点距离中位数为 0,P95 为 6.66e-8,最大值为 0.0361;这是顶点距离比较,不是曲面误差界。整面删除的切口精度受输入网格密度影响。
|
||||
|
||||
## 性能
|
||||
|
||||
同一小车网格及深度图,Boundary Smooth=3、Smooth=0、Depth Scale=1、Uniform Scale=1、Double Sided=true。Reference Depth=5.5786533,Depth Direction=(-0.6635724, -0.2783087, 0.6944177)。每次只修改所列参数:参考深度或方向 X 分量增加 `0.002*sin(i*0.71)`;预热 4 次,记录随后 24 次依赖图更新耗时中位数。加密输入通过一次 Simple Subdivision 生成,保留 UV。
|
||||
|
||||
| 输入顶点 | 修改参数 | 布尔原型 | 正式 Projected | 提速 |
|
||||
|---:|---|---:|---:|---:|
|
||||
| 27,860 | Reference Depth | 170.4 ms | 32.8 ms | 5.2 倍 |
|
||||
| 27,860 | Depth Direction | 173.1 ms | 32.6 ms | 5.3 倍 |
|
||||
| 165,771 | Reference Depth | 948.3 ms | 147.0 ms | 6.5 倍 |
|
||||
| 165,771 | Depth Direction | 987.2 ms | 151.5 ms | 6.5 倍 |
|
||||
|
||||
本机复核材料在 `C:/Users/icrdr/AppData/Local/Temp/anyimage-car-symmetry/`:`validate_production.py`、`production-validation.json`、`production-baseline.png`、`production-result.png`、`car-depth-symmetry-production.blend`。性能数字为本机对照证据。
|
||||
|
||||
## 交付检查
|
||||
|
||||
`uv run node-group build` 正常退出,10 个保存节点组通过 Blender 重载校验,附带全量测试 1064 项全部通过(188.83 秒)。源码、测试和构建清单中旧名称引用为零;资产清单验证新组存在且旧组不存在。`openspec validate add-projected-depth-symmetry` 通过。
|
||||
@@ -0,0 +1,2 @@
|
||||
schema: spec-driven
|
||||
created: 2026-09-14
|
||||
29
openspec/changes/weight-cutout-boundary-smoothing/design.md
Normal file
29
openspec/changes/weight-cutout-boundary-smoothing/design.md
Normal file
@@ -0,0 +1,29 @@
|
||||
## Context
|
||||
|
||||
Depth Cutout 当前在 Split 后对全部实际边界使用同一两圈 influence 和同一 `Smooth Weight`。原始 Outline 需要保形,Split 形成的切边则需要更强平滑;两者可通过分裂前原始几何的轮廓字段区分。
|
||||
|
||||
## Goals / Non-Goals
|
||||
|
||||
**Goals:**
|
||||
|
||||
- 只保留一个 `Boundary Smooth` 次数输入。
|
||||
- Split 边使用完整强度,Outline 使用固定 `0.1` 倍强度。
|
||||
- 两类影响带相交时保留更强的 Split 平滑。
|
||||
|
||||
**Non-Goals:**
|
||||
|
||||
- 不增加独立的 Outline 或 Split 平滑参数。
|
||||
- 不改变影响带宽度、整体 `Smooth Weight` 或普通 `Smooth` 的语义。
|
||||
|
||||
## Decisions
|
||||
|
||||
在 Split 前保留原始几何引用,并在当前投影几何上通过 `original_boundary_field()` 识别原始 Outline。分别构造 Outline 与 Split 边界字段及其两圈 influence:当前实际边界扣除 Outline 后作为 Split 边,Outline influence 乘 `0.1`,最终使用两者最大值。
|
||||
|
||||
两类边界继续进入同一个 Repeat Zone,共用 `Boundary Smooth` 次数和 `Smooth Weight`。相比串联两套平滑循环,这样不会增加公开参数,并保持节点数量与求值成本较低。交汇区域取最大值,使 Split 的完整强度优先。
|
||||
|
||||
`Boundary Smooth` 默认值改为 `4`,范围及零值旁路保持不变。
|
||||
|
||||
## Risks / Trade-offs
|
||||
|
||||
- Outline 每轮权重为 `0.1`,多次迭代后的累计位移不等于最终位移的 10% → 以行为测试验证它始终弱于相同设置下的 Split,并由默认 4 次控制累计程度。
|
||||
- Split influence 向 Outline 邻域扩散时会在交点附近覆盖弱 Outline influence → 这是 Split 优先规则的预期结果,测试交汇区域输出有限且拓扑不变。
|
||||
@@ -0,0 +1,23 @@
|
||||
## Why
|
||||
|
||||
`O Image Depth Cutout` 的 Split 边与原始 Outline 对几何平滑的需求不同:Split 边需要完整强度消除切缝折痕,而 Outline 只需轻微整理,避免轮廓被过度软化。
|
||||
|
||||
## What Changes
|
||||
|
||||
- `Boundary Smooth` 继续作为唯一的边界平滑次数控制,默认值改为 `4`。
|
||||
- Split 边使用完整 `Smooth Weight`,Outline 使用其 `0.1` 倍;两类影响相交时由 Split 强度优先。
|
||||
- 保持 `Boundary Smooth = 0` 完全关闭边界平滑。
|
||||
|
||||
## Capabilities
|
||||
|
||||
### New Capabilities
|
||||
|
||||
- `cutout-boundary-smoothing`: 定义 Depth Cutout 对 Split 边与 Outline 的差异化平滑强度和默认控制值。
|
||||
|
||||
### Modified Capabilities
|
||||
|
||||
无。
|
||||
|
||||
## Impact
|
||||
|
||||
影响 `tools/nodes/common/boundary_smoothing.py`、`tools/nodes/groups/image_depth_cutout.py`、相关节点测试和 `src/anyimage/assets/O_AnyImage.blend`;不增加或移除公开输入。
|
||||
@@ -0,0 +1,30 @@
|
||||
## ADDED Requirements
|
||||
|
||||
### Requirement: Boundary-specific smoothing strength
|
||||
|
||||
`O Image Depth Cutout` SHALL 使用单个 `Boundary Smooth` 输入控制边界平滑次数。Split 边 SHALL 使用完整 `Smooth Weight`,原始 Outline SHALL 使用 `0.1` 倍 `Smooth Weight`;两类影响相交时 Split 强度 MUST 优先。
|
||||
|
||||
#### Scenario: Separate Split and Outline response
|
||||
|
||||
- **WHEN** 同一网格同时存在 Split 边与原始 Outline 且启用 Boundary Smooth
|
||||
- **THEN** Split 边按完整 Smooth Weight 平滑
|
||||
- **AND** 仅受 Outline 影响的点按其 0.1 倍平滑
|
||||
|
||||
#### Scenario: Split and Outline intersection
|
||||
|
||||
- **WHEN** Split 与 Outline 的两圈影响范围相交
|
||||
- **THEN** 相交区域使用两者中较强的 Split influence
|
||||
|
||||
### Requirement: Boundary Smooth default and bypass
|
||||
|
||||
`O Image Depth Cutout` 的 `Boundary Smooth` SHALL 默认为 `4`,保持范围 `0–16`;值为 `0` 时 MUST 完全旁路边界平滑。
|
||||
|
||||
#### Scenario: New node group defaults
|
||||
|
||||
- **WHEN** 构建新的 O Image Depth Cutout 节点组
|
||||
- **THEN** Boundary Smooth 默认值为 4
|
||||
|
||||
#### Scenario: Disabled boundary smoothing
|
||||
|
||||
- **WHEN** Boundary Smooth 为 0
|
||||
- **THEN** Split 边和 Outline 均不发生边界平滑位移
|
||||
@@ -0,0 +1,9 @@
|
||||
## 1. Boundary behavior
|
||||
|
||||
- [x] 1.1 区分 Depth Cutout 的 Split 与 Outline influence,并在单一平滑循环中应用完整与 0.1 倍权重。
|
||||
- [x] 1.2 将 O Image Depth Cutout 的 Boundary Smooth 默认值改为 4,保持零值旁路和既有范围。
|
||||
|
||||
## 2. Verification and asset
|
||||
|
||||
- [x] 2.1 更新相关行为与接口测试,覆盖 Split 优先、Outline 弱权重、默认值和关闭行为。
|
||||
- [x] 2.2 运行相关测试,执行 `uv run node-group build` 并确认保存资产验证通过。
|
||||
Reference in New Issue
Block a user