Files
AnyImage/openspec/changes/standardize-cutout-z-axis/specs/cutout-axis-convention/spec.md
nan 1994d38ccd Add comprehensive tests for image processing and mask functionalities
- Introduced tests for color image handling, ensuring source preservation and premultiplied alpha usage.
- Implemented tests for brush stroke operations, validating segment boundaries and brush anti-aliasing.
- Added tests for frame anti-aliasing, confirming correct rendering behavior with various alpha values and depth settings.
- Created tests for frame projection, ensuring accurate overlap calculations and half-plane clipping.
- Developed tests for image premultiplied retention, verifying behavior during loading and packing processes.
- Added undo functionality tests for mask operations, ensuring single transaction behavior during edits.
2026-09-05 21:33:11 +08:00

62 lines
4.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## ADDED Requirements
### Requirement: Cutout base mesh matches the source image plane
系统 SHALL 直接在源 Image Empty 的局部 XY 平面创建 Cutout BaseShape,基础顶点 MUST 使用 `z = 0`,逆时针正面 MUST 朝局部 `+Z`,且对象放置 MUST 保持裁切区域的世界空间位置。
#### Scenario: Inspect a Cutout before Geometry Nodes evaluation
- **WHEN** 系统已从源图片裁切区域创建 Cutout Mesh,但尚未求值或复用 `O Image Cutout` Modifier
- **THEN** Mesh 位于对象局部 XY 平面,正面朝向与源 Image Empty 一致,且 X/Y 范围对应原裁切区域
#### Scenario: Evaluate an undeformed Surface
- **WHEN** Surface Cutout 以零厚度和零平滑求值
- **THEN** 求值前后的平面内坐标、正面朝向和世界空间位置保持一致,不执行轴交换或补偿旋转
### Requirement: Cutout Shape nodes use the local Z axis
`O Image Surface`、`O Image Balloon`、`O Image Depth Balloon` 与 `O Image Depth Surface` SHALL 接收局部 XY 平面几何,并统一使用局部 `-Z` 表示从图片平面向内的方向。外层 `O Image Cutout` 的默认 `-Z` 分支 MUST 直通该原生结果。平面内 X/Y 坐标 MUST 不因 Shape 求值而互换。
#### Scenario: Reuse a Shape group with XY geometry
- **WHEN** 任一 Cutout Shape 节点组直接接收位于 XY 平面的输入 Mesh
- **THEN** 节点组沿 Z 轴生成 Shape,并保持输入几何的 X/Y 方向
#### Scenario: Build Surface or Balloon thickness
- **WHEN** Surface 或 Balloon 使用正 Thickness 求值
- **THEN** 厚度和 Balloon 高度沿局部 Z 轴展开,图片内部一侧位于负 Z 方向
#### Scenario: Apply depth deformation
- **WHEN** Depth Balloon 或 Depth Surface 使用非零 Depth Scale 求值
- **THEN** 深度位置在统一的 XY / Z 对象空间中计算,不依赖 X 轴中间坐标系或最终轴变换
### Requirement: Cutout exposes selectable output axes
系统 SHALL 保留 **Inward Axis** Scene Property、Operator 参数和 `O Image Cutout` 节点接口。`-Z` MUST 为默认值并直接使用原生 XY / Z Shape 结果;选择 `+X` 时,外层节点组 MUST 将 Z 轴结果转换为 `+X` 内向对象空间,对象矩阵 MUST 执行配对补偿以保持相同世界空间形状。
#### Scenario: Create a Cutout from the tool
- **WHEN** 用户打开 Cutout 工具设置并选择任一 Shape
- **THEN** 工具显示并传递 **Inward Axis**,默认 `-Z` 创建结果直接沿用源 Image Empty 的局部轴
#### Scenario: Select the positive X output
- **WHEN** 用户把 **Inward Axis** 设为 `+X`
- **THEN** `O Image Cutout` 将原生 Z 轴 Shape 转换为 `+X` 内向的局部几何,对象矩阵同步补偿,世界空间位置和外观与默认结果一致
#### Scenario: Reuse a Shape subgroup directly
- **WHEN** 调用方绕过外层 `O Image Cutout` 并直接复用任一 Shape 子节点组
- **THEN** 子节点组始终使用原生 XY / Z 坐标,不公开或模拟旧 X 轴内部约定
### Requirement: Depth Surface normals match the Z-axis object space
Depth Surface 的 Object Space Normal Artifact SHALL 编码原生 Z 轴 Cutout 对象空间;不可见区域 MUST 使用局部 `+Z` 中性法线。默认 `-Z` 输出 MUST 原样使用该图片;选择 `+X` 输出时,Blender MUST 将其转换到配对的 `+X` 对象空间。
#### Scenario: Encode a known object-space normal
- **WHEN** Server 为 Depth Surface 编码已知的相机空间法线
- **THEN** 输出通道直接对应最终 XY / Z Cutout 对象空间,且无需 Blender 后处理即可作为 Object Space Normal 使用
#### Scenario: Load a Depth Surface normal image
- **WHEN** Blender 收到 `object-normal.png` 并以默认 `-Z` 创建 Depth Surface 材质
- **THEN** 图片像素保持 Artifact 原值并以 Object Space 连接到材质
#### Scenario: Load a positive X Depth Surface normal image
- **WHEN** Blender 收到 `object-normal.png` 并以 `+X` 创建 Depth Surface 材质
- **THEN** 图片通道按 Z 到 X 的配对轴变换转换一次,再以 Object Space 连接到材质
#### Scenario: Fill an invisible normal region
- **WHEN** Object Space Normal 的像素不在可见内容区域
- **THEN** 该像素编码局部 `+Z`,不会在正面产生虚假的侧向法线