Add cutout shell and volume node assets for depth volume processing
- Implemented `cutout_shell.py` to build front normals and shell positions for balloon geometry. - Created `cutout_volume.py` to establish smooth center fields and manage balloon surface attributes. - Introduced `pisa_sr_export.py` for exporting PiSA-SR components with dependencies and asset finalization.
This commit is contained in:
2
openspec/changes/reorganize-cutout-shapes/.openspec.yaml
Normal file
2
openspec/changes/reorganize-cutout-shapes/.openspec.yaml
Normal file
@@ -0,0 +1,2 @@
|
||||
schema: spec-driven
|
||||
created: 2026-09-07
|
||||
89
openspec/changes/reorganize-cutout-shapes/design.md
Normal file
89
openspec/changes/reorganize-cutout-shapes/design.md
Normal file
@@ -0,0 +1,89 @@
|
||||
## Context
|
||||
|
||||
当前 `shape.py` 将四种形态映射为四个子组,再由 `O Image Cutout` 用 Shape 菜单选择。菜单统一传入 Normal Map 勾选值;`normal_mode_for_shape()` 仅在勾选时为 Depth Surface 选择 OBJECT,其余形态使用 TANGENT。
|
||||
|
||||
`build/cutout_surface_balloon/surface-balloon-smooth-back.blend` 已验证五张输入、15 个参数组合;背面算法、控制测试与实际节点布局可作为实施参考。当前工作区也已修正前置 Cleanup 和不依赖 Depth Scale 的 Split,实施从这些修正继续。
|
||||
|
||||
## Goals / Non-Goals
|
||||
|
||||
**Goals:** 四个明确的创建预设,三个独立修改器节点组,统一厚度语义,深度入口自动生成法线,保留已验证的几何质量。
|
||||
|
||||
**Non-Goals:** 本次范围限定在 Cutout 的创建、节点资产与材质连接;AI 模型、图像区域交互和其他工具沿用现有职责。
|
||||
|
||||
## Decisions
|
||||
|
||||
### 创建预设与节点资产分离
|
||||
|
||||
| 入口 / 内部标识 | 节点组 | 初始设置 |
|
||||
| --- | --- | --- |
|
||||
| Flat / FLAT | O Image Cutout | Balloon,Thickness 0 |
|
||||
| Solid / SOLID | O Image Cutout | Balloon,Thickness 1 |
|
||||
| Depth Solid / DEPTH_SOLID | O Image Depth Cutout | Balloon,Thickness 1 |
|
||||
| Depth Balloon / DEPTH_BALLOON | O Image Depth Balloon | Thickness 1,Double Sided 开启 |
|
||||
|
||||
Solid 是新创建的默认预设,Pie 保持四个选择。Flat 和 Solid 使用同一基础网格属性与节点组,创建后通过厚度即可转换。预设名称用于菜单、对象命名与 Operator 协议;资产名称仅用于按名称加载。
|
||||
|
||||
三个节点组直接设置为修改器资产,各自输出最终几何。删除总 Shape 分支及 `O Image Surface`、`O Image Balloon`、`O Image Depth Surface` 旧资产。复用构建函数展开公共步骤,避免为了共享代码再建立总包装组。保留 `Inward Axis` 的几何与对象矩阵配对转换。
|
||||
|
||||
### 两种厚度方式
|
||||
|
||||
`O Image Cutout` 和 `O Image Depth Cutout` 使用 `Thickness Mode` 菜单,顺序为 Balloon、Uniform,默认 Balloon。Balloon 的 Thickness 是无量纲倍率,Uniform 的厚度是距离;输入显示与保存必须区分两种语义,距离 socket 使用 DISTANCE,倍率使用 NONE。具体 socket 组织在实现时按 Blender 修改器接口能力选择,验收必须确认用户能辨认单位,切换时不发生隐式单位换算。
|
||||
|
||||
普通 Cutout 的 Balloon 模式使用正背面 `±o_balloon × Thickness`;Uniform 使用当前 Surface 的等厚板片行为。两种方式在零厚度时均返回单层平面。全部预设都准备 `o_balloon`,即使以 Flat 创建也能直接增厚。
|
||||
|
||||
深度 Cutout 保留当前 Depth Surface 的采样、射线投影与 Split;Uniform 保留沿内向轴等厚的正背面。Balloon 采用实验中的平滑背面,两种方式零厚度均返回深度表面。
|
||||
|
||||
### 平滑背面进入正式构建
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[基础网格和 o_balloon] --> B[Cleanup 按原平面岛面积清理]
|
||||
B --> C[原始深度判断 Split]
|
||||
C --> D[相机射线修正与深度投影]
|
||||
D --> E[估计并平滑中心位置]
|
||||
E --> F[生成正背面及切口侧壁]
|
||||
F --> G[边缘平滑与整体 Smooth]
|
||||
G --> H[清理暂存属性与轴向输出]
|
||||
```
|
||||
|
||||
令 D 为投影后正面 Z,B 为 o_balloon。以 `C₀ = D − B` 初始化中心位置,固定原轮廓和 Split 切口上的值,仅对内部执行 256 次邻域平滑。Thickness 为 1 时目标背面为 `C − B`;一般厚度场为 `Thickness × max(D − C + B, 0.05 × B)`。比例下限用于限制深凹处反穿,原轮廓 B 为零时厚度仍归零,不引入 Rim Thickness。
|
||||
|
||||
复用原型中对轮廓耳三角形、内部零轮廓弦的补点方法,保证封闭轮廓不会产生零面积面。通过来源顶点和厚度层身份连接几何,Split 两侧保持独立;正面在边缘和整体平滑关闭时保持原始深度表面位置。
|
||||
|
||||
保留原型的 Edge Smooth 控制与抑制轮廓收缩的平滑过程,整体 Smooth 复用项目实现。临时属性使用 o_* 专用前缀并在输出前移除,保留 UVMap、o_balloon 和用户属性。默认参数及平滑成本用五张缓存输入复验。
|
||||
|
||||
### 每个节点组承担自己的公共处理
|
||||
|
||||
三个资产复用同一 Cleanup 构建函数,在塑形前按原平面岛总面积清理;UI 值继续乘 0.01 转为面积。Smooth 与轴向输出在各自塑形后执行。仅深度 Cutout 提供 Split;比较式继续为 `abs(原始相邻面 Z 差) × Uniform Scale × Split > 原始面中心距离 × 2.5`,Depth Scale 只参与后续显示位移。
|
||||
|
||||
### 法线策略在 Operator 层统一解析
|
||||
|
||||
| 入口 | 勾选关闭 | 勾选开启 |
|
||||
| --- | --- | --- |
|
||||
| Flat | NONE | TANGENT |
|
||||
| Solid | NONE | TANGENT |
|
||||
| Depth Solid | OBJECT | OBJECT |
|
||||
| Depth Balloon | TANGENT | TANGENT |
|
||||
|
||||
统一解析函数同时供 Job 构建和结果接收使用,保证直接调用 Operator 与 Pie 调用一致。深度入口的自动生成不会改写用户保存的勾选值。工具提示说明 Normal Map 仅控制 Flat / Solid;AI 未就绪时仍只提供两个本地入口,并忽略遗留的开启值。
|
||||
|
||||
复用现有法线结果加载、材质连接与轴向变换。Flat 与 Solid 共用节点后,法线的 Balloon 适配不得仅由创建时的预设名决定;按当前厚度方式和几何属性处理,验证 Flat 增厚后材质仍正确。Depth Solid 保留 OBJECT 法线的方向转换,Depth Balloon 保留 TANGENT 法线的适配。
|
||||
|
||||
Depth Solid 在 FACE 域保存正面法线权重 1,背面与侧壁为 0;材质读取该权重,使平滑背面使用几何法线。法线权重作为公开材质属性保留在输出网格中。
|
||||
|
||||
## Risks / Trade-offs
|
||||
|
||||
- 平滑中心场会弱化内部深度细节 → 正面保留原深度,背面用已验证的轮廓约束;通过合成曲面与五张实图同时验收。
|
||||
- 迭代与闭合细分增加成本 → 使用固定初始迭代数,测量默认预设求值时间;字段就近存取,避免重复推理与重复求值。
|
||||
- 同名 `O Image Cutout` 的资产职责改变 → 加载路径按新结构校验,避免复用已加载的旧 Shape 包装组;旧 .blend 中嵌入的数据保持原样,新创建对象使用新资产。源码不保留旧标识转发或迁移兼容层。
|
||||
- 法线图随默认预设开启后的材质效果可能不同 → 分别验证两个深度入口的正背面着色及两个 Inward Axis。
|
||||
|
||||
## Migration Plan
|
||||
|
||||
按标识和默认值、节点构建、运行时加载与材质、验证的顺序实施。发布资产只保留三个 Cutout 节点组;同步删除旧构建和验证分支。需要回退时整体恢复源码与对应资产,避免新旧接口混装。
|
||||
|
||||
未归档的 `gate-cutout-ai-options`、`replace-depth-surface-stretch-with-split` 和 `standardize-cutout-z-axis` 涉及本次边界。未来归档时以本提案的入口名称、直接修改器架构、前置 Cleanup 和原始深度 Split 要求为准,同时保留 AI 门控与轴向约定;不回退当前工作区已完成的修复。
|
||||
|
||||
## Open Questions
|
||||
|
||||
无产品决策待确认。厚度输入的具体展示方式属于实施细节,须满足倍率与距离可辨认的验收要求。
|
||||
32
openspec/changes/reorganize-cutout-shapes/proposal.md
Normal file
32
openspec/changes/reorganize-cutout-shapes/proposal.md
Normal file
@@ -0,0 +1,32 @@
|
||||
## Why
|
||||
|
||||
Cutout 当前将四种形态封装在一个总节点组中,创建入口与几何算法一一绑定。已经验证的平滑 Balloon 背面适合成为深度实体的默认厚度,需要将四个创建预设与三个几何节点组分开,并明确法线生成规则。
|
||||
|
||||
## What Changes
|
||||
|
||||
- 创建入口确定为 `Flat`、`Solid`、`Depth Solid`、`Depth Balloon`,默认形态为 Solid。
|
||||
- **BREAKING**:以 `O Image Cutout`、`O Image Depth Cutout`、`O Image Depth Balloon` 三个可直接用于修改器的节点组替代总 Shape 切换器与四个子组,移除旧节点名称和 Shape 菜单协议。
|
||||
- Flat 与 Solid 共用 `O Image Cutout`,分别以 Thickness 0 和 1 创建;普通与深度 Cutout 均提供 Balloon / Uniform 两种厚度方式,默认 Balloon。
|
||||
- Depth Solid 使用经过五张图验证的新背面算法,保留正面深度位置,背面按平滑中心位置与 o_balloon 构造;Uniform 保留等厚 Depth Surface 行为。
|
||||
- Depth Balloon 保留原塑形算法,默认开启 Double Sided。
|
||||
- 三个节点组各自提供适用的 Cleanup、Smooth 和轴向输出;深度 Cutout 保持 Cleanup 在 Split 前、Split 使用原始深度差的修正。
|
||||
- Normal Map 勾选仅控制 Flat 与 Solid;Depth Solid 与 Depth Balloon 始终生成并使用各自所需的法线图。
|
||||
|
||||
## Capabilities
|
||||
|
||||
### New Capabilities
|
||||
|
||||
- `cutout-shape-presets`: 四个入口、三个节点组、创建默认值与两种厚度方式。
|
||||
- `depth-cutout-volume`: 深度表面上的平滑 Balloon 背面、等厚模式、清理分离及闭合行为。
|
||||
- `cutout-normal-policy`: 按入口选择法线生成策略,保持 AI 可用性约束及材质连接正确。
|
||||
|
||||
### Modified Capabilities
|
||||
|
||||
无。当前 `openspec/specs/` 尚无已归档规范;本提案记录完整目标要求,并在设计中说明与现有未归档变更的关系。
|
||||
|
||||
## Impact
|
||||
|
||||
- `src/anyimage/operators/cutout_tool/` 的形态标识、菜单、节点加载、默认参数、法线策略和材质绑定,以及 Cutout 工具属性。
|
||||
- `tools/node_assets/` 的构建、布局与验证;`src/anyimage/assets/O_AnyImage.blend` 中的 Cutout 资产。
|
||||
- Cutout 交互、Job 参数、网格求值和节点资产测试,以及节点资产说明。
|
||||
- 原型位于 `build/cutout_surface_balloon/`,实施时将必要算法纳入正式源码。无需新增依赖。
|
||||
@@ -0,0 +1,45 @@
|
||||
## ADDED Requirements
|
||||
|
||||
### Requirement: Normal Map 勾选仅控制本地形态
|
||||
Normal Map 勾选 SHALL 仅控制 Flat 和 Solid 的法线生成;两个 Depth 入口 SHALL 始终生成并使用法线图,且不改写用户保存的勾选值。工具说明 SHALL 明确该作用范围。
|
||||
|
||||
#### Scenario: Flat 与 Solid 关闭法线
|
||||
- **WHEN** AI 可用且勾选关闭,用户创建 Flat 或 Solid
|
||||
- **THEN** 系统使用 NONE 法线模式
|
||||
|
||||
#### Scenario: Flat 与 Solid 开启法线
|
||||
- **WHEN** AI 可用且勾选开启,用户创建 Flat 或 Solid
|
||||
- **THEN** 系统请求 TANGENT 法线并连接结果材质
|
||||
|
||||
#### Scenario: Depth Solid 自动法线
|
||||
- **WHEN** 用户创建 Depth Solid,无论勾选保存为真或假
|
||||
- **THEN** 系统请求 OBJECT 法线并正确加载、按输出轴向处理和连接材质
|
||||
|
||||
#### Scenario: Depth Balloon 自动法线
|
||||
- **WHEN** 用户创建 Depth Balloon,无论勾选保存为真或假
|
||||
- **THEN** 系统请求 TANGENT 法线并连接结果材质
|
||||
|
||||
### Requirement: 所有调用路径采用一致策略
|
||||
法线策略 SHALL 在 Operator 业务层统一解析,Job 参数与结果接收使用同一策略。
|
||||
|
||||
#### Scenario: 绕过 Pie 调用
|
||||
- **WHEN** 直接调用 Operator 创建任一 Depth 形态并传入 generate_normal 为 false
|
||||
- **THEN** 法线仍按该深度入口生成和应用,与 Pie 调用结果一致
|
||||
|
||||
### Requirement: AI 可用性继续限制入口
|
||||
AI 未就绪时系统 SHALL 仅提供 Flat 与 Solid,忽略遗留的开启法线选项;AI 就绪时 SHALL 提供四个入口。
|
||||
|
||||
#### Scenario: 未就绪的本地创建
|
||||
- **WHEN** AI 未就绪、保存的 Normal Map 为真,用户创建 Flat 或 Solid
|
||||
- **THEN** 创建过程不因该遗留值启动 AI Job,法线模式为 NONE
|
||||
|
||||
### Requirement: 法线适配跟随当前几何
|
||||
Flat 与 Solid 共用节点组后的法线适配 SHALL 支持厚度变化,Depth 入口 SHALL 保持各自法线空间和轴向转换正确。
|
||||
|
||||
#### Scenario: Flat 增厚
|
||||
- **WHEN** 带法线的 Flat 调整为 Balloon 正厚度
|
||||
- **THEN** 材质按当前几何参与法线适配,不因初始 Flat 预设而缺失 Balloon 所需连接
|
||||
|
||||
#### Scenario: 深度入口轴向与双面
|
||||
- **WHEN** 分别检查两个 Depth 入口的 -Z、+X 输出,以及 Depth Balloon 的 Double Sided 开关
|
||||
- **THEN** 对应法线图被正确加载和连接,前后表面的着色方向与几何一致
|
||||
@@ -0,0 +1,56 @@
|
||||
## ADDED Requirements
|
||||
|
||||
### Requirement: 四个创建入口映射三个节点组
|
||||
系统 SHALL 提供 Flat、Solid、Depth Solid、Depth Balloon 四个入口,并默认使用 Solid。Flat 与 Solid SHALL 共用 O Image Cutout;Depth Solid SHALL 使用 O Image Depth Cutout;Depth Balloon SHALL 使用 O Image Depth Balloon。
|
||||
|
||||
#### Scenario: 普通默认创建
|
||||
- **WHEN** 用户以默认形态创建 Cutout
|
||||
- **THEN** 对象使用 O Image Cutout,Thickness Mode 为 Balloon,Thickness 为 1
|
||||
|
||||
#### Scenario: 显式选择入口
|
||||
- **WHEN** 用户分别选择四个入口
|
||||
- **THEN** 系统按上述映射加载三个资产,Flat 的 Thickness 为 0,另外三个入口的 Thickness 为 1
|
||||
|
||||
### Requirement: 三个节点组直接输出最终几何
|
||||
三个 Cutout 节点组 SHALL 可直接作为 Geometry Nodes 修改器使用,并承担各自的清理、塑形、平滑与轴向输出。发布资产 MUST 移除旧 Shape 总切换器及旧 Surface、Balloon、Depth Surface 子组。
|
||||
|
||||
#### Scenario: 检查新建修改器与发布资产
|
||||
- **WHEN** 新建任一 Cutout 并检查其修改器与资产
|
||||
- **THEN** 修改器直接引用对应节点组,不存在跨四种形态的 Shape 输入;Cutout 资产集合恰为三个指定节点组
|
||||
|
||||
#### Scenario: 输出轴向
|
||||
- **WHEN** 对同一输入分别使用 -Z 与 +X 的 Inward Axis
|
||||
- **THEN** 几何与对象矩阵配对转换,保持相同世界空间位置及正确朝向
|
||||
|
||||
### Requirement: 普通与深度 Cutout 具有双厚度方式
|
||||
O Image Cutout 与 O Image Depth Cutout SHALL 提供 Balloon、Uniform 两种 Thickness Mode,默认 Balloon。Balloon 厚度 SHALL 表示倍率,Uniform 厚度 SHALL 表示距离,输入语义与单位必须明确区分。
|
||||
|
||||
#### Scenario: 普通平面与体积转换
|
||||
- **WHEN** O Image Cutout 的 Balloon Thickness 从 0 调整到 1
|
||||
- **THEN** 相同基础网格由单层平面变为当前 Balloon 的正背面体积,无需重算 AI 或重建对象
|
||||
|
||||
#### Scenario: 等厚板片
|
||||
- **WHEN** O Image Cutout 选择 Uniform 并设置非零厚度
|
||||
- **THEN** 输出当前 Surface 的等厚板片形态;厚度为零时输出单层平面
|
||||
|
||||
#### Scenario: 厚度单位
|
||||
- **WHEN** 用户检查或切换两种 Thickness Mode
|
||||
- **THEN** Balloon 的输入明确为倍率,Uniform 的输入明确为距离,不将一种单位的值隐式解释为另一种单位
|
||||
|
||||
### Requirement: Depth Balloon 默认双面
|
||||
O Image Depth Balloon SHALL 保留原 Depth Balloon 的参考平面塑形行为,并默认开启 Double Sided。
|
||||
|
||||
#### Scenario: 默认与单面输出
|
||||
- **WHEN** 用户创建 Depth Balloon,再关闭 Double Sided
|
||||
- **THEN** 初始输出采用原算法的双面塑形,关闭后采用原算法的单面塑形,其余参数语义保持一致
|
||||
|
||||
### Requirement: 公共网格属性与前置清理
|
||||
所有入口 SHALL 准备 o_balloon;三个节点组 SHALL 在塑形前复用按原平面岛总面积清理小区域的 Cleanup 规则,并在输出保留 UVMap、o_balloon 与用户属性。
|
||||
|
||||
#### Scenario: Flat 后续增厚
|
||||
- **WHEN** 用户将 Flat 的 Thickness 调为正值
|
||||
- **THEN** 已有 o_balloon 可直接参与塑形,UV 与材质映射保持有效
|
||||
|
||||
#### Scenario: 小岛清理
|
||||
- **WHEN** 输入包含总面积低于 Cleanup 阈值的独立平面岛
|
||||
- **THEN** 三个节点组均在塑形前删除该岛,保留大于阈值的岛
|
||||
@@ -0,0 +1,45 @@
|
||||
## ADDED Requirements
|
||||
|
||||
### Requirement: 平滑背面保留空间位置
|
||||
O Image Depth Cutout 的 Balloon 模式 SHALL 以投影正面减 o_balloon 估计中心位置,固定轮廓与切口并平滑内部中心场,再用该中心场与 Balloon 轮廓构造背面。关闭边缘与整体平滑时,正面 MUST 保持原深度表面位置。
|
||||
|
||||
#### Scenario: 带噪声的已知体积
|
||||
- **WHEN** 输入正面由线性变化的中心深度、Balloon 轮廓和内部高频噪声构成,Thickness 为 1,额外几何平滑关闭
|
||||
- **THEN** 背面接近中心深度减 Balloon 轮廓,背面噪声 RMS 小于正面噪声的 1%,正面顶点位置误差小于 0.00001 个局部单位
|
||||
|
||||
#### Scenario: 前后距离保留
|
||||
- **WHEN** 输入有宽厚主体和处于不同深度的细长结构
|
||||
- **THEN** 背面形成按轮廓变化的厚度,各部分保留局部前后位置,不统一回到同一个参考平面
|
||||
|
||||
### Requirement: 两种厚度方式保留深度表面
|
||||
深度 Cutout SHALL 在 Balloon 模式使用平滑背面,在 Uniform 模式保留原 Depth Surface 的等厚行为;两种方式的零厚度 SHALL 输出单层深度表面。
|
||||
|
||||
#### Scenario: 零厚度
|
||||
- **WHEN** 两种厚度方式分别设为零
|
||||
- **THEN** 输出相同投影与 Split 结果的单层深度表面,不生成重叠背面或零面积侧壁
|
||||
|
||||
#### Scenario: 等厚方式
|
||||
- **WHEN** 选择 Uniform 并设为正厚度
|
||||
- **THEN** 正背面保持原 Depth Surface 的沿内向轴等厚关系
|
||||
|
||||
### Requirement: Split 独立于显示深度幅度
|
||||
Split SHALL 使用原始相邻面采样 Z 差经 Uniform Scale 标定后与变形前跨度比较,Cleanup MUST 位于 Split 前;Depth Scale SHALL 仅控制投影呈现幅度。
|
||||
|
||||
#### Scenario: Depth Scale 不改变切边
|
||||
- **WHEN** 固定输入和 Split,将 Depth Scale 依次设为 0、0.25、1、2、4
|
||||
- **THEN** 零厚度输出的切边拓扑保持一致,深度位移随 Depth Scale 变化
|
||||
|
||||
#### Scenario: 保留分离产生的小片
|
||||
- **WHEN** 原平面岛面积通过 Cleanup,但 Split 后的部分小片低于该面积阈值
|
||||
- **THEN** 这些分离小片仍被保留并参与后续厚度构造
|
||||
|
||||
### Requirement: 厚度网格闭合且轮廓无固定厚边
|
||||
正厚度网格 SHALL 在原轮廓合并正背面,并独立封闭 Split 切口;SHALL 保留原型中的深凹比例厚度下限、边缘平滑和整体 Smooth,且不提供 Rim Thickness。
|
||||
|
||||
#### Scenario: 五张实图验收
|
||||
- **WHEN** 使用噬菌体、蜘蛛、幼虫、心脏、棕榈树缓存输入,分别求值无平滑、边缘与整体平滑、平滑加 Split
|
||||
- **THEN** 15 个正厚度组合均为有限坐标、无非流形边、无法线连接错误和零面积面,输出保留 UVMap 与 o_balloon 并移除专用暂存属性
|
||||
|
||||
#### Scenario: 边缘与整体控制
|
||||
- **WHEN** 调整 Edge Smooth、Smooth 和 Smooth Iterations
|
||||
- **THEN** 相应几何平滑生效,Smooth Iterations 为零时整体平滑不改变位置,原轮廓不产生固定厚度的边框
|
||||
30
openspec/changes/reorganize-cutout-shapes/tasks.md
Normal file
30
openspec/changes/reorganize-cutout-shapes/tasks.md
Normal file
@@ -0,0 +1,30 @@
|
||||
## 1. 创建预设与参数协议
|
||||
|
||||
- [x] 1.1 将形态标识与入口文案统一为 FLAT / Flat、SOLID / Solid、DEPTH_SOLID / Depth Solid、DEPTH_BALLOON / Depth Balloon,默认 Solid,更新 Pie 与直接 Operator 调用测试。
|
||||
- [x] 1.2 建立四预设到三资产的映射及默认值,删除旧 Shape 索引协议、旧名称与转发路径,覆盖对象命名和 AI 可用性门控。
|
||||
- [x] 1.3 确定并实现两个 Cutout 的 Balloon / Uniform 厚度输入,验证默认顺序、倍率与距离语义、零厚度及模式切换;距离 socket 使用 DISTANCE,输入结构使用 SINGLE。
|
||||
|
||||
## 2. 三个独立几何节点资产
|
||||
|
||||
- [x] 2.1 将 O Image Cutout 构建为直接修改器,合并普通 Balloon 与等厚 Surface 行为;所有预设准备 o_balloon,保证 Flat 可直接增厚。
|
||||
- [x] 2.2 将已验证的平滑中心场、背面厚度与闭合方法纳入正式构建函数,构建 O Image Depth Cutout 的 Balloon 分支并保留 Uniform 分支。
|
||||
- [x] 2.3 将原型中防止轮廓耳三角形和内部零轮廓弦退化的处理纳入合适的正式网格模块,增加针对闭合退化的求值测试。
|
||||
- [x] 2.4 复用公共 Cleanup、Smooth、轴向输出与暂存属性清理;保留 Depth Cutout 的前置 Cleanup、原始深度 Split 和 Edge Smooth 控制。
|
||||
- [x] 2.5 将 O Image Depth Balloon 改为直接修改器并默认 Double Sided 开启,保留其塑形和单面开关行为。
|
||||
- [x] 2.6 删除总 Shape 切换器和三个旧子组资产,更新构建清单、节点加载及结构验证;处理同名旧 O Image Cutout 已加载时的新资产识别,避免复用旧接口。
|
||||
|
||||
## 3. Normal Map 与材质
|
||||
|
||||
- [x] 3.1 在业务层统一法线策略:Flat / Solid 受勾选控制,Depth Solid 固定 OBJECT,Depth Balloon 固定 TANGENT;Job 参数与结果接收共用解析。
|
||||
- [x] 3.2 更新 Normal Map 工具说明,保持用户勾选值不被深度创建改写,覆盖未就绪时遗留开启值和直接调用 Operator 的测试。
|
||||
- [x] 3.3 调整 Flat / Solid 共用节点后的材质法线适配,验证从 Flat 增厚以及 Balloon / Uniform 切换时的连接。
|
||||
- [x] 3.4 验证两个深度入口的法线结果加载、材质连接、双面着色与 Inward Axis 转换。
|
||||
|
||||
## 4. 求值与视觉验收
|
||||
|
||||
- [x] 4.1 更新接口、默认值、资产集合和几何测试,覆盖三资产直接输出、普通与深度零厚度、Uniform 等厚、Depth Balloon 默认双面。
|
||||
- [x] 4.2 保留 Cleanup 在 Split 前和 Depth Scale 0 / 0.25 / 1 / 2 / 4 不改变切边拓扑的回归测试。
|
||||
- [x] 4.3 用已知中心深度加 Balloon 轮廓与噪声的合成曲面验证平滑背面、正面保留及参考深度平移。
|
||||
- [x] 4.4 复用五张缓存输入,在独立 Blender 脚本中检查 15 个平滑与分离组合的闭合、退化、属性保留和求值时间;渲染背面与侧面,对照已接受原型,不直接控制用户 Blender。
|
||||
- [x] 4.5 在独立 Blender 节点编辑器按实际绘制尺寸检查三个节点组的总览与局部,验证主轴、重复区域、socket 顺序和未使用输出隐藏。
|
||||
- [x] 4.6 同步节点资产说明,重建 O_AnyImage.blend,运行全部节点验证和项目测试,记录结果;核对相关未归档规范在后续归档时采用本提案的目标行为。
|
||||
24
openspec/changes/reorganize-cutout-shapes/validation.md
Normal file
24
openspec/changes/reorganize-cutout-shapes/validation.md
Normal file
@@ -0,0 +1,24 @@
|
||||
# 验收记录
|
||||
|
||||
2026-09-07,Windows;资产构建与独立节点编辑器使用 Blender 4.5.10 LTS,Python 求值与测试使用 bpy 4.5.3。
|
||||
|
||||
## 自动验证
|
||||
|
||||
- `tools/node_assets/build.py` 完成资产重建;`validate.py`、`validate_mesh_plane.py`、`validate_cutout.py` 全部通过。
|
||||
- 全量 pytest:664 passed、2 xfailed。覆盖四入口、三资产、双厚度模式、前置 Cleanup、原始深度 Split、闭合、背面平滑和法线策略。
|
||||
- 测试完成后本地 bpy 运行时退出阶段发生原生崩溃(Windows 3221225477)。独立脚本调用 `pytest.main` 并将其返回码写入文件,确认返回 0;进程随后仍以访问冲突退出。测试断言均通过,进程退出问题保留为本地验证环境限制。
|
||||
|
||||
## 几何与视觉
|
||||
|
||||
- 噬菌体、蜘蛛、幼虫、心脏、棕榈树,共 15 个平滑与分离组合:非流形边、非流形顶点、零面积面均为 0,坐标有限,保留 UVMap 和 o_balloon。
|
||||
- 与已接受原型逐对象比较,顶点和面数量一致;双向最近点最大位置差 0.00001258(图像尺度约 4)。
|
||||
- 本机单次网格求值约 0.018–0.203 秒,包含依赖图更新与网格提取;用于观察成本,不作为性能保证。
|
||||
- 背面、侧面和斜视渲染通过。Depth Solid 的 FACE 法线权重令贴图仅影响正面,背面与侧壁使用几何法线。
|
||||
- 两个深度入口使用正式 O Image Layer 材质,检查两个 Inward Axis 的正背面法线方向渲染;归一化像素平均绝对差均小于 0.00000009。
|
||||
- 独立隐藏 Blender 节点编辑器检查三组总览、中心场 Repeat 和闭合局部;实际绘制矩形无重叠。结构验证同时检查接口顺序、SINGLE 和未使用输出隐藏。
|
||||
|
||||
实验文件与详细 JSON、截图、日志位于 `build/cutout_surface_balloon/`;可编辑样例为 `cutout-production.blend`。以上验证复用缓存输入,未控制用户 Blender 实例。
|
||||
|
||||
## 归档衔接
|
||||
|
||||
`gate-cutout-ai-options`、`replace-depth-surface-stretch-with-split`、`standardize-cutout-z-axis` 后续归档时,采用本变更的四入口、三直接资产、前置 Cleanup 与原始深度 Split,保留 AI 门控和轴向约定。
|
||||
Reference in New Issue
Block a user