diff --git a/1.0.x/assets/cover.png b/1.0.x/assets/cover.png new file mode 100755 index 0000000..c437f50 Binary files /dev/null and b/1.0.x/assets/cover.png differ diff --git a/1.0.x/en/getting-started/installation/index.html b/1.0.x/en/getting-started/installation/index.html index 90578a3..4911138 100755 --- a/1.0.x/en/getting-started/installation/index.html +++ b/1.0.x/en/getting-started/installation/index.html @@ -1580,7 +1580,7 @@ @@ -1339,44 +1391,48 @@ -
把图片里的空间感带进 Blender。
-AnyImage 是一款 Blender 扩展,可以粘贴和编辑图片、创建普通 Plane 或 Depth Plane、从局部选区生成 Cutout Shape,并在独立 AI Environment 中完成去背景与高清放大。
+
AnyImage is an image toolkit for Blender by OmooLab. It turns images into more than references: paste an image, select what you need, and transform it into a scene element with materials, contours, and depth.
+Press Ctrl+Shift+V in the 3D View or Node Editor (Cmd+Shift+V on macOS) to paste an image from the clipboard directly into the current workspace. There is no need to save the image first or interrupt your workflow.
+You can also continue working with existing images. Select an Image Empty, right-click to open the AnyImage menu, and access the most common actions from there.
+Drag the button below into the Blender window to install. The first drag prompts you to add the AnyImage extension repository. Confirm it, then drag the button again.
tools.pykeymaps.pycommon/注销先关闭 Runtime、快捷键与工具,再移除菜单和 Scene 属性,按 CLASSES 逆序注销类型。设备、存储目录、模型、材质显示适配和功能上限统一通过 preferences.py 读取。
顶层入口注册类型后,通过 tools.py 统一注册 WorkspaceTool,通过 keymaps.py 统一注册快捷键。注销按相反生命周期关闭 Runtime、快捷键与工具,再移除菜单和 Scene 属性,按 CLASSES 逆序注销类型。设备、存储目录、模型、材质显示适配和功能上限统一通过 preferences.py 读取。
Maximum AI Input Size 限制模型分析输入和 Upscale 可提交源图的长边;Maximum Frame Resolution 限制 Frame 输出长边;Minimum Relative Edge Length 与 Boundary Padding 控制 Cutout 的网格密度和轮廓边界采样。
flowchart TD
diff --git a/1.0.x/en/internals/development/index.html b/1.0.x/en/internals/development/index.html
index b9e93a3..b15ad78 100755
--- a/1.0.x/en/internals/development/index.html
+++ b/1.0.x/en/internals/development/index.html
@@ -1536,8 +1536,8 @@
为本机同步扩展 wheel 与 Manifest
-uv run node-group build
-构建、验证节点资产并运行测试
+uv run --group blender node-group build
+构建、验证节点资产并运行节点测试
uv run model sync
diff --git a/1.0.x/en/internals/node-assets/index.html b/1.0.x/en/internals/node-assets/index.html
index 222f4ab..0806d63 100755
--- a/1.0.x/en/internals/node-assets/index.html
+++ b/1.0.x/en/internals/node-assets/index.html
@@ -1473,7 +1473,7 @@
节点资产
资产清单
-节点组由 tools/nodes/groups/ 中的构建模块定义。
+节点组由 nodes/groups/ 中的构建模块定义,共用构建逻辑位于 nodes/common/。
@@ -1525,7 +1525,7 @@
构建节点资产
-生产节点组由 uv run node-group build 构建到 src/anyimage/assets/O_AnyImage.blend
+生产节点组由 uv run --group blender node-group build 构建到 src/anyimage/assets/O_AnyImage.blend。该文件是 Git 忽略的发布构建产物;CI 与本地发布都从节点源码重新生成。
节点组规则:
- 字段默认直接连接,多个消费者可复用同一输出;按消费位置的几何、域、类型和输入属性版本验证求值等价性
@@ -1542,15 +1542,12 @@
- 接口或布局变更须验证 socket 顺序与结构、未使用输出隐藏及几何求值;纯布局变更比较运算、默认值和实际连接,确认功能不变
构建资产脚本
-tools/nodes/build.py 按依赖顺序构建资产,调用 arrangement/ 统一排列几何节点组后保存。common/ 提供共用构建函数:nodes.py 创建接口与节点,depth_surface.py、cutout.py 等组装几何,shader.py 构建材质着色节点,material_slots.py 继承几何材质槽;tools/nodes/preview/ 导出交互预览。
-保存后,check.py 在独立 Blender 进程中重新加载资产并做基本几何求值。接口、默认值和详细几何行为由 tests/ 检查。
-uv run node-group build --blender "/path/to/blender"
-uv run node-group build --skip-tests
-uv run node-group check
-uv run node-group preview
-
-脚本按 --blender、环境变量 BLENDER_BIN、项目 .env、PATH 的顺序查找 Blender。无法自动找到时,在项目根目录的 .env 中配置:
-BLENDER_BIN="/absolute/path/to/blender"
+tools/nodes/build.py 按依赖顺序加载 nodes/groups/ 的定义,调用 arrangement/ 统一排列几何节点组后保存。nodes/common/ 提供共用构建函数:nodes.py 创建接口与节点,depth_surface.py、cutout.py 等组装几何,shader.py 构建材质着色节点,material_slots.py 继承几何材质槽;tools/nodes/preview/ 导出交互预览。
+命令通过当前 uv Python 的独立子进程执行构建、检查和预览,bpy 由 blender dependency group 提供。保存后,check.py 重新加载资产并做基本几何求值;tests/nodes/ 覆盖节点定义行为,tests/tools/nodes/ 覆盖工具行为。CI 使用同一入口先生成资产,再运行常规测试和打包。
+uv run --group blender node-group build
+uv run --group blender node-group build --skip-tests
+uv run --group blender node-group check
+uv run --group blender node-group preview
diff --git a/1.0.x/en/internals/operators/cutout-tool/index.html b/1.0.x/en/internals/operators/cutout-tool/index.html
index 9315f81..94c1efb 100755
--- a/1.0.x/en/internals/operators/cutout-tool/index.html
+++ b/1.0.x/en/internals/operators/cutout-tool/index.html
@@ -1452,7 +1452,7 @@
Cutout
-Cutout 在静态 Image Empty 上圈定 Selection,按轮廓创建 Flat、Solid、Depth Symmetry 或 Depth Solid。入口位于 operators/cutout_tool/operators.py,Shape 菜单位于 interaction.py,预设标识与节点组对应关系位于 shape.py。
+Cutout 在静态 Image Empty 上圈定 Selection,按轮廓创建 Flat、Solid、Depth Symmetry 或 Depth Solid。Operator 入口位于 operators/cutout_tool/operators.py,WorkspaceTool 声明位于 tools.py,Shape 菜单位于 interaction.py,预设标识与节点组对应关系位于 shape.py。
flowchart TD
A[Lasso 或 Polyline 提交 SelectionPath] --> B[选择 Shape]
B --> C[栅格化 SelectionMask 并读取源 RGBA]
diff --git a/1.0.x/en/internals/operators/frame/index.html b/1.0.x/en/internals/operators/frame/index.html
index 2ac6071..902079e 100755
--- a/1.0.x/en/internals/operators/frame/index.html
+++ b/1.0.x/en/internals/operators/frame/index.html
@@ -1363,7 +1363,7 @@
Frame 多图合成
-operators/frame_tool/operators.py 定义 FrameImages 和 FrameTool。projection.py 负责视图投影、交叠和结果平面定位,compositing.py 负责像素深度排序与边界覆盖采样,__init__.py 导出类型及注册清单。Frame 将选中的静态 Image Empty 按当前视图合成为一张图片。
+operators/frame_tool/operators.py 定义 FrameImages。projection.py 负责视图投影、交叠和结果平面定位,compositing.py 负责像素深度排序与边界覆盖采样,__init__.py 导出 Operator 及注册清单。tools.py 定义对应的 FrameTool。Frame 将选中的静态 Image Empty 按当前视图合成为一张图片。
flowchart TD
A[拖出屏幕矩形] --> B[冻结视图矩阵并收集选中静态图片]
B --> C[检查矩形与 active 图片的有效投射交集]
diff --git a/1.0.x/en/internals/operators/index.html b/1.0.x/en/internals/operators/index.html
index 1f0aa09..5533ca5 100755
--- a/1.0.x/en/internals/operators/index.html
+++ b/1.0.x/en/internals/operators/index.html
@@ -1403,7 +1403,7 @@
-单文件功能按业务命名;复杂功能包在 operators.py 定义 Operator 和入口协调逻辑,交互式工具同时定义 WorkSpaceTool,其余模块承载具体实现。包的 __init__.py 汇总导出与 CLASSES 注册清单,类型在 operators/__init__.py 和扩展 __init__.py 汇总注册。AI Operator 使用普通字典提交任务,并在主线程响应中读取文件和修改 Blender 数据。
+单文件功能按业务命名;复杂功能包在 operators.py 定义 Operator 和入口协调逻辑,其余模块承载具体实现。包的 __init__.py 汇总导出与 CLASSES 注册清单,类型在 operators/__init__.py 和扩展 __init__.py 汇总注册。交互式工具的 WorkspaceTool 统一定义和注册于 tools.py。AI Operator 使用普通字典提交任务,并在主线程响应中读取文件和修改 Blender 数据。
diff --git a/1.0.x/en/internals/operators/mask/index.html b/1.0.x/en/internals/operators/mask/index.html
index 19e001c..0171b9f 100755
--- a/1.0.x/en/internals/operators/mask/index.html
+++ b/1.0.x/en/internals/operators/mask/index.html
@@ -1363,7 +1363,7 @@
Mask Alpha 编辑
-operators/mask_tool.py 定义 EditImageAlpha 和 MaskTool,使用 common/viewport.py 的 ImageGesture 管理 Lasso、Brush 与 Polyline。
+operators/mask_tool.py 定义 EditImageAlpha,使用 common/viewport.py 的 ImageGesture 管理 Lasso、Brush 与 Polyline;tools.py 定义对应的 MaskTool。
flowchart TD
A[冻结 Scene 的 Gesture、Mode、Radius] --> B[屏幕手势与 Overlay]
B --> C[完成后投影并生成覆盖 M]
diff --git a/1.0.x/en/internals/operators/rectify/index.html b/1.0.x/en/internals/operators/rectify/index.html
index 840390a..30673ce 100755
--- a/1.0.x/en/internals/operators/rectify/index.html
+++ b/1.0.x/en/internals/operators/rectify/index.html
@@ -1363,7 +1363,7 @@
Rectify 透视校正
-operators/rectify_tool/operators.py 定义 RectifyImagePerspective 与 RectifyTool,将图片内的四角区域校正为矩形。geometry.py 负责四角验证与像素校正,preview.py 负责预览图、Overlay 和宽高比控制,__init__.py 导出类型及注册清单。
+operators/rectify_tool/operators.py 定义 RectifyImagePerspective,将图片内的四角区域校正为矩形。geometry.py 负责四角验证与像素校正,preview.py 负责预览图、Overlay 和宽高比控制,__init__.py 导出 Operator 及注册清单;tools.py 定义对应的 RectifyTool。
flowchart TD
A[点选四角] --> B[规范为凸 Quad 并检查图片交叠]
B --> C[512×512 预览与宽高比调整]
diff --git a/1.0.x/getting-started/installation/index.html b/1.0.x/getting-started/installation/index.html
index ff28ed8..ef5a4f3 100755
--- a/1.0.x/getting-started/installation/index.html
+++ b/1.0.x/getting-started/installation/index.html
@@ -1578,7 +1578,7 @@
@@ -1337,17 +1389,21 @@
-AnyImage
-把图片里的空间感带进 Blender。
-AnyImage 是一款 Blender 扩展,可以粘贴和编辑图片、创建普通 Plane 或 Depth Plane、从局部选区生成 Cutout Shape,并在独立 AI Environment 中完成去背景与高清放大。
+🖼️ AnyImage
+IMAGE is All You Need
+
+AnyImage 是 OmooLab 为 Blender 准备的图片工具。它让图片不再只是参考图:粘贴进来,选出需要的部分,再把它变成带材质、轮廓与深度的场景元素。
+从图片直接开始
+在 3D View 或 Node Editor 中按 Ctrl+Shift+V(macOS 为 Cmd+Shift+V),剪贴板里的图片会直接进入当前工作区。不必先保存文件,也不用中断正在进行的搭建。
+已有图片同样可以继续使用。选中 Image Empty 后,右键打开 AnyImage 菜单,常用操作都在这里。
+一张图,多种空间表达
-- 按 Ctrl+V(macOS 为 Cmd+V)把剪贴板图片粘贴到当前编辑器
-- 用 Plane 创建可调厚度和细分的图片网格
-- 用 Depth Plane 把静态图片转换为可调节的立体面片
-- 用 Cutout 从套索选区生成 Surface、Balloon 与两种 Depth Shape
-- 用 Frame 从当前视角重新取景并合并 Image Empty,用 Mask 的 Lasso、Brush 或 Polyline 编辑 Alpha;Brush 拖动时以红色或灰色填充预览准确范围,释放后提交;用 Rectify 校正透视
-- 用 Remove Background / Upscale 处理单图、视频和序列帧
+- Plane / Depth Plane:把图片变成平面或立体面片。
+- Cutout:圈选主体,创建 Surface、Balloon 或 Depth Shape。
+- 图片工具:重新取景、编辑透明区域、校正透视、去背景和高清放大。
+快速开始
+按住下方按钮并拖到 Blender 窗口即可安装。首次拖入会提示添加 AnyImage 扩展仓库,确认后再拖入一次。
diff --git a/1.0.x/internals/architecture/index.html b/1.0.x/internals/architecture/index.html
index f72e30c..b9bd81a 100755
--- a/1.0.x/internals/architecture/index.html
+++ b/1.0.x/internals/architecture/index.html
@@ -1473,6 +1473,14 @@
Scene 手势状态、模型状态查询、枚举与 Operator 属性构造
+tools.py
+3D View WorkspaceTool 声明、顺序与注册
+
+
+keymaps.py
+扩展快捷键的注册与清理
+
+
common/
Blender 侧公共能力
@@ -1487,7 +1495,7 @@
注册与配置
-注销先关闭 Runtime、快捷键与工具,再移除菜单和 Scene 属性,按 CLASSES 逆序注销类型。设备、存储目录、模型、材质显示适配和功能上限统一通过 preferences.py 读取。
+顶层入口注册类型后,通过 tools.py 统一注册 WorkspaceTool,通过 keymaps.py 统一注册快捷键。注销按相反生命周期关闭 Runtime、快捷键与工具,再移除菜单和 Scene 属性,按 CLASSES 逆序注销类型。设备、存储目录、模型、材质显示适配和功能上限统一通过 preferences.py 读取。
Maximum AI Input Size 限制模型分析输入和 Upscale 可提交源图的长边;Maximum Frame Resolution 限制 Frame 输出长边;Minimum Relative Edge Length 与 Boundary Padding 控制 Cutout 的网格密度和轮廓边界采样。
执行边界
flowchart TD
diff --git a/1.0.x/internals/development/index.html b/1.0.x/internals/development/index.html
index 7a818ee..2a7cb20 100755
--- a/1.0.x/internals/development/index.html
+++ b/1.0.x/internals/development/index.html
@@ -1534,8 +1534,8 @@
为本机同步扩展 wheel 与 Manifest
-uv run node-group build
-构建、验证节点资产并运行测试
+uv run --group blender node-group build
+构建、验证节点资产并运行节点测试
uv run model sync
diff --git a/1.0.x/internals/node-assets/index.html b/1.0.x/internals/node-assets/index.html
index 5d8c22f..ed1c760 100755
--- a/1.0.x/internals/node-assets/index.html
+++ b/1.0.x/internals/node-assets/index.html
@@ -1471,7 +1471,7 @@
节点资产
资产清单
-节点组由 tools/nodes/groups/ 中的构建模块定义。
+节点组由 nodes/groups/ 中的构建模块定义,共用构建逻辑位于 nodes/common/。
@@ -1523,7 +1523,7 @@
构建节点资产
-生产节点组由 uv run node-group build 构建到 src/anyimage/assets/O_AnyImage.blend
+生产节点组由 uv run --group blender node-group build 构建到 src/anyimage/assets/O_AnyImage.blend。该文件是 Git 忽略的发布构建产物;CI 与本地发布都从节点源码重新生成。
节点组规则:
- 字段默认直接连接,多个消费者可复用同一输出;按消费位置的几何、域、类型和输入属性版本验证求值等价性
@@ -1540,15 +1540,12 @@
- 接口或布局变更须验证 socket 顺序与结构、未使用输出隐藏及几何求值;纯布局变更比较运算、默认值和实际连接,确认功能不变
构建资产脚本
-tools/nodes/build.py 按依赖顺序构建资产,调用 arrangement/ 统一排列几何节点组后保存。common/ 提供共用构建函数:nodes.py 创建接口与节点,depth_surface.py、cutout.py 等组装几何,shader.py 构建材质着色节点,material_slots.py 继承几何材质槽;tools/nodes/preview/ 导出交互预览。
-保存后,check.py 在独立 Blender 进程中重新加载资产并做基本几何求值。接口、默认值和详细几何行为由 tests/ 检查。
-uv run node-group build --blender "/path/to/blender"
-uv run node-group build --skip-tests
-uv run node-group check
-uv run node-group preview
-
-脚本按 --blender、环境变量 BLENDER_BIN、项目 .env、PATH 的顺序查找 Blender。无法自动找到时,在项目根目录的 .env 中配置:
-BLENDER_BIN="/absolute/path/to/blender"
+tools/nodes/build.py 按依赖顺序加载 nodes/groups/ 的定义,调用 arrangement/ 统一排列几何节点组后保存。nodes/common/ 提供共用构建函数:nodes.py 创建接口与节点,depth_surface.py、cutout.py 等组装几何,shader.py 构建材质着色节点,material_slots.py 继承几何材质槽;tools/nodes/preview/ 导出交互预览。
+命令通过当前 uv Python 的独立子进程执行构建、检查和预览,bpy 由 blender dependency group 提供。保存后,check.py 重新加载资产并做基本几何求值;tests/nodes/ 覆盖节点定义行为,tests/tools/nodes/ 覆盖工具行为。CI 使用同一入口先生成资产,再运行常规测试和打包。
+uv run --group blender node-group build
+uv run --group blender node-group build --skip-tests
+uv run --group blender node-group check
+uv run --group blender node-group preview
diff --git a/1.0.x/internals/operators/cutout-tool/index.html b/1.0.x/internals/operators/cutout-tool/index.html
index 8b0c395..2e8a946 100755
--- a/1.0.x/internals/operators/cutout-tool/index.html
+++ b/1.0.x/internals/operators/cutout-tool/index.html
@@ -1450,7 +1450,7 @@
Cutout
-Cutout 在静态 Image Empty 上圈定 Selection,按轮廓创建 Flat、Solid、Depth Symmetry 或 Depth Solid。入口位于 operators/cutout_tool/operators.py,Shape 菜单位于 interaction.py,预设标识与节点组对应关系位于 shape.py。
+Cutout 在静态 Image Empty 上圈定 Selection,按轮廓创建 Flat、Solid、Depth Symmetry 或 Depth Solid。Operator 入口位于 operators/cutout_tool/operators.py,WorkspaceTool 声明位于 tools.py,Shape 菜单位于 interaction.py,预设标识与节点组对应关系位于 shape.py。
flowchart TD
A[Lasso 或 Polyline 提交 SelectionPath] --> B[选择 Shape]
B --> C[栅格化 SelectionMask 并读取源 RGBA]
diff --git a/1.0.x/internals/operators/frame/index.html b/1.0.x/internals/operators/frame/index.html
index 6b87ece..6e8b45e 100755
--- a/1.0.x/internals/operators/frame/index.html
+++ b/1.0.x/internals/operators/frame/index.html
@@ -1361,7 +1361,7 @@
Frame 多图合成
-operators/frame_tool/operators.py 定义 FrameImages 和 FrameTool。projection.py 负责视图投影、交叠和结果平面定位,compositing.py 负责像素深度排序与边界覆盖采样,__init__.py 导出类型及注册清单。Frame 将选中的静态 Image Empty 按当前视图合成为一张图片。
+operators/frame_tool/operators.py 定义 FrameImages。projection.py 负责视图投影、交叠和结果平面定位,compositing.py 负责像素深度排序与边界覆盖采样,__init__.py 导出 Operator 及注册清单。tools.py 定义对应的 FrameTool。Frame 将选中的静态 Image Empty 按当前视图合成为一张图片。
flowchart TD
A[拖出屏幕矩形] --> B[冻结视图矩阵并收集选中静态图片]
B --> C[检查矩形与 active 图片的有效投射交集]
diff --git a/1.0.x/internals/operators/index.html b/1.0.x/internals/operators/index.html
index 6604dfc..1d685b1 100755
--- a/1.0.x/internals/operators/index.html
+++ b/1.0.x/internals/operators/index.html
@@ -1401,7 +1401,7 @@
-单文件功能按业务命名;复杂功能包在 operators.py 定义 Operator 和入口协调逻辑,交互式工具同时定义 WorkSpaceTool,其余模块承载具体实现。包的 __init__.py 汇总导出与 CLASSES 注册清单,类型在 operators/__init__.py 和扩展 __init__.py 汇总注册。AI Operator 使用普通字典提交任务,并在主线程响应中读取文件和修改 Blender 数据。
+单文件功能按业务命名;复杂功能包在 operators.py 定义 Operator 和入口协调逻辑,其余模块承载具体实现。包的 __init__.py 汇总导出与 CLASSES 注册清单,类型在 operators/__init__.py 和扩展 __init__.py 汇总注册。交互式工具的 WorkspaceTool 统一定义和注册于 tools.py。AI Operator 使用普通字典提交任务,并在主线程响应中读取文件和修改 Blender 数据。
diff --git a/1.0.x/internals/operators/mask/index.html b/1.0.x/internals/operators/mask/index.html
index f0c833f..b57eaf7 100755
--- a/1.0.x/internals/operators/mask/index.html
+++ b/1.0.x/internals/operators/mask/index.html
@@ -1361,7 +1361,7 @@
Mask Alpha 编辑
-operators/mask_tool.py 定义 EditImageAlpha 和 MaskTool,使用 common/viewport.py 的 ImageGesture 管理 Lasso、Brush 与 Polyline。
+operators/mask_tool.py 定义 EditImageAlpha,使用 common/viewport.py 的 ImageGesture 管理 Lasso、Brush 与 Polyline;tools.py 定义对应的 MaskTool。
flowchart TD
A[冻结 Scene 的 Gesture、Mode、Radius] --> B[屏幕手势与 Overlay]
B --> C[完成后投影并生成覆盖 M]
diff --git a/1.0.x/internals/operators/rectify/index.html b/1.0.x/internals/operators/rectify/index.html
index 6c12551..e02454a 100755
--- a/1.0.x/internals/operators/rectify/index.html
+++ b/1.0.x/internals/operators/rectify/index.html
@@ -1361,7 +1361,7 @@
Rectify 透视校正
-operators/rectify_tool/operators.py 定义 RectifyImagePerspective 与 RectifyTool,将图片内的四角区域校正为矩形。geometry.py 负责四角验证与像素校正,preview.py 负责预览图、Overlay 和宽高比控制,__init__.py 导出类型及注册清单。
+operators/rectify_tool/operators.py 定义 RectifyImagePerspective,将图片内的四角区域校正为矩形。geometry.py 负责四角验证与像素校正,preview.py 负责预览图、Overlay 和宽高比控制,__init__.py 导出 Operator 及注册清单;tools.py 定义对应的 RectifyTool。
flowchart TD
A[点选四角] --> B[规范为凸 Quad 并检查图片交叠]
B --> C[512×512 预览与宽高比调整]
diff --git a/1.0.x/search/search_index.json b/1.0.x/search/search_index.json
index fc271a0..95ff390 100755
--- a/1.0.x/search/search_index.json
+++ b/1.0.x/search/search_index.json
@@ -1 +1 @@
-{"config":{"lang":["en","zh"],"separator":"[\\s\\u200b\\u3000\\-\u3001\u3002\uff0c\uff0e\uff1f\uff01\uff1b]+","pipeline":["stemmer"],"fields":{"title":{"boost":1000.0},"text":{"boost":1.0},"tags":{"boost":1000000.0}}},"docs":[{"location":"","title":"AnyImage","text":"\u628a\u56fe\u7247\u91cc\u7684\u7a7a\u95f4\u611f\u5e26\u8fdb Blender\u3002
AnyImage \u662f\u4e00\u6b3e Blender \u6269\u5c55\uff0c\u53ef\u4ee5\u7c98\u8d34\u548c\u7f16\u8f91\u56fe\u7247\u3001\u521b\u5efa\u666e\u901a Plane \u6216 Depth Plane\u3001\u4ece\u5c40\u90e8\u9009\u533a\u751f\u6210 Cutout Shape\uff0c\u5e76\u5728\u72ec\u7acb AI Environment \u4e2d\u5b8c\u6210\u53bb\u80cc\u666f\u4e0e\u9ad8\u6e05\u653e\u5927\u3002
- \u6309 Ctrl+V\uff08macOS \u4e3a Cmd+V\uff09\u628a\u526a\u8d34\u677f\u56fe\u7247\u7c98\u8d34\u5230\u5f53\u524d\u7f16\u8f91\u5668
- \u7528 Plane \u521b\u5efa\u53ef\u8c03\u539a\u5ea6\u548c\u7ec6\u5206\u7684\u56fe\u7247\u7f51\u683c
- \u7528 Depth Plane \u628a\u9759\u6001\u56fe\u7247\u8f6c\u6362\u4e3a\u53ef\u8c03\u8282\u7684\u7acb\u4f53\u9762\u7247
- \u7528 Cutout \u4ece\u5957\u7d22\u9009\u533a\u751f\u6210 Surface\u3001Balloon \u4e0e\u4e24\u79cd Depth Shape
- \u7528 Frame \u4ece\u5f53\u524d\u89c6\u89d2\u91cd\u65b0\u53d6\u666f\u5e76\u5408\u5e76 Image Empty\uff0c\u7528 Mask \u7684 Lasso\u3001Brush \u6216 Polyline \u7f16\u8f91 Alpha\uff1bBrush \u62d6\u52a8\u65f6\u4ee5\u7ea2\u8272\u6216\u7070\u8272\u586b\u5145\u9884\u89c8\u51c6\u786e\u8303\u56f4\uff0c\u91ca\u653e\u540e\u63d0\u4ea4\uff1b\u7528 Rectify \u6821\u6b63\u900f\u89c6
- \u7528 Remove Background / Upscale \u5904\u7406\u5355\u56fe\u3001\u89c6\u9891\u548c\u5e8f\u5217\u5e27
\u62d6\u5165 Blender \u5b89\u88c5 Windows \u2013 78.3\u00a0MB \u2026\u6216\u4e0b\u8f7d\u540e\u901a\u8fc7 Install from Disk \u5b89\u88c5 \u62d6\u5165 Blender \u5b89\u88c5 macOS - Apple Silicon \u2013 57.5\u00a0MB \u2026\u6216\u4e0b\u8f7d\u540e\u901a\u8fc7 Install from Disk \u5b89\u88c5 \u62d6\u5165 Blender \u5b89\u88c5 Linux \u2013 71.0\u00a0MB \u2026\u6216\u4e0b\u8f7d\u540e\u901a\u8fc7 Install from Disk \u5b89\u88c5"},{"location":"getting-started/installation/","title":"\u5b89\u88c5\u4e0e\u9996\u6b21\u914d\u7f6e","text":"\u9875\u9762\u4f1a\u6309\u5f53\u524d\u7cfb\u7edf\u663e\u793a\u5bf9\u5e94\u7684\u5b89\u88c5\u5305\uff0c\u6309\u4f4f\u6309\u94ae\u62d6\u5230 Blender \u7a97\u53e3\u4efb\u610f\u4f4d\u7f6e\u5373\u53ef\u5b89\u88c5\u3002\u9996\u6b21\u62d6\u5165\u4f1a\u63d0\u793a\u6dfb\u52a0 AnyImage \u6269\u5c55\u4ed3\u5e93\uff0c\u786e\u8ba4\u540e\u91cd\u65b0\u62d6\u5165\u4e00\u6b21\uff0c\u4e4b\u540e\u5347\u7ea7\u540c\u6837\u76f4\u63a5\u62d6\u5165\u3002
\u62d6\u5165 Blender \u5b89\u88c5 Windows \u2013 78.3\u00a0MB \u2026\u6216\u4e0b\u8f7d\u540e\u901a\u8fc7 Install from Disk \u5b89\u88c5 \u62d6\u5165 Blender \u5b89\u88c5 macOS - Apple Silicon \u2013 57.5\u00a0MB \u2026\u6216\u4e0b\u8f7d\u540e\u901a\u8fc7 Install from Disk \u5b89\u88c5 \u62d6\u5165 Blender \u5b89\u88c5 Linux \u2013 71.0\u00a0MB \u2026\u6216\u4e0b\u8f7d\u540e\u901a\u8fc7 Install from Disk \u5b89\u88c5"},{"location":"getting-started/installation/#_2","title":"\u68c0\u67e5\u6269\u5c55\u504f\u597d\u8bbe\u7f6e","text":"AnyImage \u7684\u6269\u5c55\u504f\u597d\u8bbe\u7f6e\u6309\u529f\u80fd\u5206\u7ec4\u3002Environment \u533a\u5305\u542b\uff1a
- Storage Root\uff1a\u4fdd\u5b58\u8fd0\u884c\u73af\u5883\u3001\u6a21\u578b\u548c\u4efb\u52a1\u6587\u4ef6\u7684\u4f4d\u7f6e\u3002\u9ed8\u8ba4\u662f\u7528\u6237\u76ee\u5f55\u4e0b\u7684
.anyimage\uff0c\u4e00\u822c\u65e0\u9700\u4fee\u6539\u3002 - Device\uff1a\u6b63\u5f0f\u8f6c\u6362\u4efb\u52a1\u4f7f\u7528\u7684\u8ba1\u7b97\u8bbe\u5907\u3002Apple Silicon Mac \u9ed8\u8ba4\u4f7f\u7528 CPU\uff0cWindows \u9ed8\u8ba4\u4f7f\u7528 DirectML\uff1b\u4e5f\u53ef\u624b\u52a8\u9009\u62e9\u5176\u4ed6\u53ef\u7528\u8bbe\u5907\u3002
macOS arm64 \u63d0\u4f9b CPU \u4e0e CoreML\u3002CoreML \u7531\u7cfb\u7edf\u5728 Apple CPU\u3001GPU \u4e0e Neural Engine \u4e4b\u95f4\u8c03\u5ea6\uff0c\u4e0d\u662f PyTorch MPS backend\uff0c\u4e5f\u4e0d\u8868\u793a\u53ea\u4f7f\u7528 GPU\uff1b\u5b83\u7684\u5b9e\u9645\u901f\u5ea6\u53d6\u51b3\u4e8e\u6a21\u578b\u3002
Environment \u68c0\u6d4b\u540e\u663e\u793a Diagnostics\u3002Depth & Normal\u3001Remove Background\u3001Upscale \u4e0e Cutout \u662f\u9ed8\u8ba4\u5c55\u5f00\u7684\u53ef\u6298\u53e0\u529f\u80fd\u533a\uff0c\u5404\u81ea\u5305\u542b\u5bf9\u5e94\u8bbe\u7f6e\u548c\u6a21\u578b\u72b6\u6001\u3002\u5176\u4e2d\uff1a
- Default Upscale Model\uff1aUpscale \u4f7f\u7528\u7684\u6a21\u578b\uff0c\u9ed8\u8ba4\u662f General WDN x4v3\u3002
- Maximum AI Input Size\uff1aUpscale\u3001Depth \u4e0e Normal Map \u7684 AI \u8f93\u5165\u957f\u8fb9\u4e0a\u9650\uff0c\u9ed8\u8ba4 2048 px\uff1b\u989c\u8272\u8d34\u56fe\u4fdd\u7559\u539f\u59cb\u5206\u8fa8\u7387\u3002
- Maximum Cutout Mesh Resolution\uff1a\u6240\u6709 Cutout Shape \u7684\u7f51\u683c\u91c7\u6837\u957f\u8fb9\u4e0a\u9650\uff0c\u9ed8\u8ba4 1024\uff0c\u72ec\u7acb\u4e8e AI \u8f93\u5165\u5c3a\u5bf8\u3002
Depth & Normal \u63d0\u4f9b\u4e09\u6863 MoGe-2\uff0cDepth Plane \u4e0e Cutout Depth / Normal Map \u5171\u7528\u5f53\u524d\u9009\u62e9\u3002\u53ef\u9009\u6a21\u578b\u7684 Ready \u72b6\u6001\u6216 Download \u6309\u94ae\u4f4d\u4e8e\u9009\u62e9\u9879\u4e0b\u65b9\uff1bCutout \u533a\u63d0\u4f9b\u72ec\u7acb\u7f51\u683c\u4e0a\u9650\u4e0e Balloon Profile\u3002
\u5982\u679c\u51c6\u5907\u628a Storage Root \u653e\u5230\u5176\u4ed6\u78c1\u76d8\uff0c\u5efa\u8bae\u5728\u9996\u6b21\u5b89\u88c5 Environment \u4e4b\u524d\u4fee\u6539\u3002\u66f4\u6362\u76ee\u5f55\u540e\uff0c\u65e7\u76ee\u5f55\u4e2d\u7684\u73af\u5883\u548c\u6a21\u578b\u4e0d\u4f1a\u81ea\u52a8\u79fb\u52a8\u3002
"},{"location":"getting-started/installation/#ai-environment","title":"\u914d\u7f6e AI Environment","text":"\u9009\u4e2d Image Empty\uff0c\u5728\u53f3\u952e AnyImage \u5b50\u83dc\u5355\u4e2d\u70b9\u51fb Set Up AI Environment\u2026\uff1b\u4e5f\u53ef\u4ee5\u5728 AnyImage \u6269\u5c55\u504f\u597d\u8bbe\u7f6e\u4e2d\u70b9\u51fb\u540c\u540d\u6309\u94ae\u3002
\u786e\u8ba4\u5b89\u88c5\u524d\uff0c\u5bf9\u8bdd\u6846\u4f1a\u8bf4\u660e\u4ee5\u4e0b\u5185\u5bb9\uff1a
- \u5b89\u88c5\u72ec\u7acb Python\u3001ONNX Runtime \u4e0e\u652f\u6301\u5305\uff0c\u5e76\u4e0b\u8f7d MoGe-2 ViT-S Normal\u3001BEN2 Base \u548c Real-ESRGAN General WDN x4v3\u3002
- \u9ed8\u8ba4\u6a21\u578b\u5408\u8ba1\u7ea6 360 MB\uff1b\u8fde\u540c Environment \u9884\u8ba1\u9700\u8981\u7ea6 600 MB \u4e0b\u8f7d\u91cf\u548c\u7ea6 1 GB \u78c1\u76d8\u7a7a\u95f4\u3002
- \u6839\u636e\u7f51\u7edc\u901f\u5ea6\uff0c\u9996\u6b21\u5b89\u88c5\u901a\u5e38\u9700\u8981 5\u201320 \u5206\u949f\u3002
- Use Mirror \u53ea\u8ba9 uv\u3001Python \u548c Python \u5305\u4f7f\u7528\u56fd\u5185\u955c\u50cf\uff1b\u6a21\u578b\u4e0b\u8f7d\u6e90\u4fdd\u6301\u4e0d\u53d8\u3002
\u5b89\u88c5\u8fc7\u7a0b\u4e2d\u8bf7\u4fdd\u6301 Blender \u6253\u5f00\u3002\u72b6\u6001\u680f\u4f1a\u663e\u793a\u5f53\u524d\u9636\u6bb5\u3001\u8fdb\u5ea6\u548c\u4e0b\u8f7d\u901f\u5ea6\u3002
\u5982\u679c Environment \u5df2\u5b89\u88c5\u4f46\u4efb\u4e00\u9ed8\u8ba4\u6a21\u578b\u7f3a\u5931\uff0c\u5165\u53e3\u4f1a\u6539\u4e3a Download Required Models\u2026\uff1b\u5bf9\u8bdd\u6846\u5217\u51fa\u7f3a\u5931\u6a21\u578b\u548c\u4e0b\u8f7d\u4f53\u79ef\uff0c\u786e\u8ba4\u540e\u53ea\u4e0b\u8f7d\u7f3a\u5931\u6a21\u578b\uff0c\u4e0d\u4f1a\u91cd\u88c5 Environment \u6216\u91cd\u590d\u4e0b\u8f7d\u5df2\u5c31\u7eea\u5185\u5bb9\u3002
"},{"location":"getting-started/installation/#_3","title":"\u786e\u8ba4\u5b89\u88c5\u5b8c\u6210","text":"\u5b8c\u6210\u540e\u53ef\u4ee5\u7528\u4ee5\u4e0b\u65b9\u5f0f\u786e\u8ba4\uff1a
- AnyImage \u6269\u5c55\u504f\u597d\u8bbe\u7f6e\u4e2d\u7684 MoGe-2 ViT-S Normal\u3001BEN2 Base \u548c Real-ESRGAN General WDN x4v3 \u663e\u793a Ready\u3002
- \u9009\u4e2d Image Empty \u540e\uff0c\u53f3\u952e\u83dc\u5355\u5e95\u90e8\u663e\u793a AI Environment Settings\u2026\u3002
\u70b9\u51fb Convert to Depth Plane\u3001Remove Background \u6216 Upscale \u65f6\uff0cAnyImage \u4f1a\u6839\u636e\u72b6\u6001\u8fdb\u5165 Set Up AI Environment\u2026 \u6216 Download Required Models\u2026\u3002\u666e\u901a Plane\u3001Image \u7f16\u8f91\u548c\u57fa\u7840 Cutout Surface / Balloon \u76f4\u63a5\u5728 Blender \u4e2d\u6267\u884c\u3002
"},{"location":"getting-started/installation/#_4","title":"\u4e0b\u4e00\u6b65","text":"\u7ee7\u7eed\u9605\u8bfb\u4e94\u5206\u949f\u4e0a\u624b\uff0c\u7528\u4e00\u5f20\u56fe\u7247\u5b8c\u6210\u7b2c\u4e00\u6b21\u8f6c\u6362\u3002
"},{"location":"internals/","title":"\u5185\u90e8\u5b9e\u73b0\u603b\u89c8","text":"AnyImage \u5728 Blender \u4e3b\u7ebf\u7a0b\u5904\u7406\u4ea4\u4e92\u3001\u50cf\u7d20\u7f16\u8f91\u548c\u6570\u636e\u521b\u5efa\uff0c\u901a\u8fc7 BlendJob \u628a\u6a21\u578b\u63a8\u7406\u4ea4\u7ed9\u72ec\u7acb Job Server\u3002
\u4e3b\u9898 \u5bf9\u5e94\u804c\u8d23 \u7a0b\u5e8f\u67b6\u6784 \u8fdb\u7a0b\u3001\u6ce8\u518c\u3001\u914d\u7f6e\u4e0e\u4e3b\u7ebf\u7a0b\u8fb9\u754c Common Blender \u4fa7\u56fe\u50cf\u3001\u624b\u52bf\u3001\u51e0\u4f55\u4e0e AI \u516c\u5171\u80fd\u529b Runtime \u4e0e Server Environment\u3001Job\u3001\u6a21\u578b\u4e0b\u8f7d\u4e0e Session \u751f\u547d\u5468\u671f Job \u4ea7\u7269 \u6587\u4ef6\u534f\u8bae\u3001\u76f8\u673a\u5750\u6807\u548c Blender \u6d88\u8d39\u65b9\u5f0f Operator \u7d22\u5f15 \u6309\u5b9e\u9645\u7528\u6237\u529f\u80fd\u67e5\u627e\u5b9e\u73b0 \u8282\u70b9\u8d44\u4ea7 \u8d44\u4ea7\u3001\u6e90\u7801\u804c\u8d23\u3001\u6784\u5efa\u548c\u9a8c\u8bc1 \u5f00\u53d1\u4e0e\u53d1\u5e03 \u6d4b\u8bd5\u7ec4\u7ec7\u3001\u5de5\u5177\u547d\u4ee4\u4e0e\u53d1\u5e03\u6d41\u7a0b \u6e90\u7801\u4f4d\u4e8e src/anyimage/\uff0c\u5f00\u53d1\u5de5\u5177\u4f4d\u4e8e tools/\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u4f4d\u4e8e tests/\u3002\u6269\u5c55\u7ea7\u8bbe\u7f6e\u7531 preferences.py \u5b9a\u4e49\uff0c\u8fd0\u884c\u65f6\u8d44\u6e90\u7531 runtime.py \u63a5\u5165 BlendJob\u3002
"},{"location":"internals/architecture/","title":"\u7a0b\u5e8f\u67b6\u6784","text":"\u6a21\u5757 \u804c\u8d23 __init__.py \u6ce8\u518c\u7c7b\u578b\u3001\u5de5\u5177\u3001\u83dc\u5355\u3001\u5feb\u6377\u952e\u4e0e Runtime menu.py\u3001panel.py Image Empty \u4e0e Shader Image Texture \u4e0a\u4e0b\u6587\u83dc\u5355\u4e0e Job Server \u9762\u677f preferences.py \u6269\u5c55\u8bbe\u7f6e\u53ca\u8bfb\u53d6\u5165\u53e3 properties.py Scene \u624b\u52bf\u72b6\u6001\u3001\u6a21\u578b\u72b6\u6001\u67e5\u8be2\u3001\u679a\u4e3e\u4e0e Operator \u5c5e\u6027\u6784\u9020 common/ Blender \u4fa7\u516c\u5171\u80fd\u529b operators/ \u4ea4\u4e92\u3001\u4efb\u52a1\u53c2\u6570\u3001\u7ed3\u679c\u5bfc\u5165\u548c Undo server/ \u72ec\u7acb\u73af\u5883\u5185\u7684\u5a92\u4f53\u5904\u7406\u3001\u63a8\u7406\u548c\u4ea7\u7269\u5199\u51fa"},{"location":"internals/architecture/#_2","title":"\u6ce8\u518c\u4e0e\u914d\u7f6e","text":"\u6ce8\u9500\u5148\u5173\u95ed Runtime\u3001\u5feb\u6377\u952e\u4e0e\u5de5\u5177\uff0c\u518d\u79fb\u9664\u83dc\u5355\u548c Scene \u5c5e\u6027\uff0c\u6309 CLASSES \u9006\u5e8f\u6ce8\u9500\u7c7b\u578b\u3002\u8bbe\u5907\u3001\u5b58\u50a8\u76ee\u5f55\u3001\u6a21\u578b\u3001\u6750\u8d28\u663e\u793a\u9002\u914d\u548c\u529f\u80fd\u4e0a\u9650\u7edf\u4e00\u901a\u8fc7 preferences.py \u8bfb\u53d6\u3002
Maximum AI Input Size \u9650\u5236\u6a21\u578b\u5206\u6790\u8f93\u5165\u548c Upscale \u53ef\u63d0\u4ea4\u6e90\u56fe\u7684\u957f\u8fb9\uff1bMaximum Frame Resolution \u9650\u5236 Frame \u8f93\u51fa\u957f\u8fb9\uff1bMinimum Relative Edge Length \u4e0e Boundary Padding \u63a7\u5236 Cutout \u7684\u7f51\u683c\u5bc6\u5ea6\u548c\u8f6e\u5ed3\u8fb9\u754c\u91c7\u6837\u3002
"},{"location":"internals/architecture/#_3","title":"\u6267\u884c\u8fb9\u754c","text":"flowchart TD\n A[Operator \u5728\u4e3b\u7ebf\u7a0b\u8bfb\u53d6 Blender \u6570\u636e] --> B[\u51c6\u5907\u8f93\u5165\u6587\u4ef6]\n B --> C[request \u8fd4\u56de\u666e\u901a\u5b57\u5178]\n C --> D[BlendJob \u961f\u5217\u6267\u884c Server Job]\n D --> E[\u6a21\u578b\u4e0e\u5a92\u4f53\u5904\u7406\u5199\u5165 Job \u76ee\u5f55]\n E --> F[\u4e3b\u7ebf\u7a0b response \u52a0\u8f7d\u7ed3\u679c]\n F --> G[\u63d0\u4ea4 Image \u6216 Object \u4fee\u6539\u53ca Undo]\n G --> H[\u6e05\u7406\u4e34\u65f6\u8f93\u5165]
Plane\u3001Frame\u3001Mask\u3001Rectify \u548c\u65e0\u9700 AI \u7684 Cutout \u5728 Blender \u5185\u6267\u884c\u3002Server \u7684 jobs/ \u7f16\u6392\u4efb\u52a1\uff0cmodels/ \u8d1f\u8d23\u6a21\u578b\u9002\u914d\uff0cgeometry/ \u5904\u7406\u6df1\u5ea6\u4e0e\u6cd5\u7ebf\u4ea7\u7269\u3002Server \u6a21\u5757\u901a\u8fc7\u5185\u90e8\u76f8\u5bf9\u5bfc\u5165\u5171\u4eab\u80fd\u529b\uff0cBlender \u4fa7\u901a\u8fc7 common/ \u590d\u7528\u3002
MoGe-2 \u4e0e MoGe-3 \u8f93\u51fa\u7edf\u4e00\u4e3a GeometryFrame\uff1a\u5305\u542b Depth\u3001Validity\u3001Intrinsics\uff0c\u4ee5\u53ca\u6309\u9700\u63d0\u4f9b\u7684 Normal \u548c Points\u3002\u4ea7\u7269\u5199\u5165\u5668\u6d88\u8d39\u540c\u4e00\u4e2a Frame\uff0c\u4fdd\u6301\u6df1\u5ea6\u3001\u6cd5\u7ebf\u548c\u76f8\u673a\u6570\u636e\u4e00\u81f4\u3002\u53c2\u89c1 Runtime \u4e0e \u4ea7\u7269\u534f\u8bae\u3002
"},{"location":"internals/common/","title":"Blender \u516c\u5171\u80fd\u529b","text":"src/anyimage/common/ \u6309\u4e1a\u52a1\u804c\u8d23\u63d0\u4f9b\u516c\u5171\u51fd\u6570\uff0c\u8c03\u7528\u65b9\u4ece\u5bf9\u5e94\u6a21\u5757\u76f4\u63a5\u5bfc\u5165\u3002
\u6a21\u5757 \u804c\u8d23\u4e0e\u4e3b\u8981\u5165\u53e3 ai.py \u73af\u5883\u548c\u6a21\u578b\u5c31\u7eea\u68c0\u67e5\u3001\u8f93\u5165\u8def\u5f84\u6821\u9a8c\u3001production_device()\u3001moge2_parameters() \u4e0e\u5b89\u88c5 UI image.py image_rgba()\u3001Image User \u5e27\u8bbe\u7f6e\u8bfb\u53d6\u3001Job \u8f93\u5165\u51c6\u5907\u3001\u50cf\u7d20\u91c7\u6837\u3001\u7ed3\u679c Image \u548c replace_empty_image() color_image.py \u6750\u8d28\u989c\u8272\u4e0e AI \u5206\u6790\u8f93\u5165\u7684\u51c6\u5907\u548c\u6e05\u7406 hdr_image.py HDR \u53bb\u80cc\u666f\u5206\u6790\u8f93\u5165\u53ca\u6d6e\u70b9\u989c\u8272\u4fdd\u7559 image_target.py Image Empty \u4e0e Shader Image Texture \u7f16\u8f91\u76ee\u6807 selection.py SelectionPath\u3001SelectionMask\u3001non-zero winding \u6805\u683c\u5316\u4e0e Alpha \u4fee\u6574 viewport.py \u539f\u751f\u70b9\u9009\u3001\u5c4f\u5e55\u6295\u5f71\u3001ImageGesture\u3001Lasso / Brush / Polyline \u4e0e Overlay depth.py \u6df1\u5ea6\u56fe\u7247\u548c\u5143\u6570\u636e\u52a0\u8f7d\u3001\u76f8\u673a\u5750\u6807\u4e0e\u663e\u793a\u8303\u56f4\u7684\u5c3a\u5ea6\u6362\u7b97 material.py Image Layer\u3001Normal\u3001Alpha\u3001Shadeless \u4e0e Depth \u6750\u8d28 object.py Modifier \u8f93\u5165\u8bbe\u7f6e\u4e0e\u7ed3\u679c\u5bf9\u8c61\u6fc0\u6d3b\u3001\u6e90\u5bf9\u8c61\u66ff\u6362 node.py node_asset_path() \u4e0e load_node_group()"},{"location":"internals/common/#_1","title":"\u56fe\u50cf\u751f\u547d\u5468\u671f","text":"\u4e1a\u52a1\u50cf\u7d20\u91c7\u7528 Top-down RGBA\uff0cimage_pixels() \u4f7f\u7528 Blender \u50cf\u7d20\u987a\u5e8f\u3002\u9884\u4e58\u91c7\u6837\u7528\u4e8e\u6295\u5f71\u63d2\u503c\uff1b\u6587\u4ef6\u6216 Packed \u56fe\u50cf\u7684\u4e1a\u52a1\u8bfb\u53d6\u4fdd\u7559\u9690\u85cf RGB\u3002ImageEditTarget \u6821\u9a8c\u76ee\u6807\u8eab\u4efd\u540e\u7ecf replace_empty_image() \u6216 replace_texture_image() \u63d0\u4ea4\uff1a\u672a\u5171\u4eab\u7684 Image \u539f\u5730\u66ff\u6362\u5185\u5bb9\uff0c\u5171\u4eab\u65f6\u6539\u7528\u65b0\u7684 Image \u6570\u636e\u5757\uff0c\u5931\u8d25\u65f6\u56de\u6eda\u6e90\u6570\u636e\u3002
prepare_image_input() \u8fd4\u56de\u8def\u5f84\u53ca\u4e34\u65f6\u6807\u8bb0\uff1bcleanup_image_input() \u4e0e\u521b\u5efa\u65b9\u914d\u5bf9\u3002color_image.py \u7684 prepare_material_color_input() \u51c6\u5907\u6750\u8d28\u989c\u8272\uff0cmaterial_analysis_input() \u63d0\u4f9b\u5206\u6790\u8f93\u5165\uff1bCutout \u6309\u51e0\u4f55 bounds \u88c1\u5207\u3002
"},{"location":"internals/common/#selection","title":"\u624b\u52bf\u4e0e Selection","text":"flowchart TD\n A[\u539f\u751f\u5bf9\u8c61\u70b9\u9009] --> B[ImageGesture \u51bb\u7ed3\u6e90\u56fe\u4e0e\u4ea4\u4e92\u72b6\u6001]\n B --> C[\u5c4f\u5e55\u8def\u5f84\u4e0e Overlay]\n C --> D[\u63d0\u4ea4\u65f6\u6295\u5f71\u5230\u56fe\u7247\u7a7a\u95f4]\n D --> E[SelectionPath]\n E --> F[\u5c40\u90e8 non-zero winding \u6805\u683c\u5316]\n F --> G[SelectionMask values \u4e0e bounds]\n G --> H[Mask Alpha \u8fd0\u7b97\u6216 Cutout \u5185\u5bb9\u8f6e\u5ed3]
Brush \u7684\u5706\u5f62\u5370\u8bb0\u548c\u8fde\u63a5\u6761\u7531 brush_footprint_polygons() \u751f\u6210\uff0c\u4f9b\u9884\u89c8\u4e0e\u63d0\u4ea4\u5171\u7528\u3002\u62d6\u52a8\u65f6\u7ef4\u62a4\u5c4f\u5e55\u8def\u5f84\u4e0e\u5c40\u90e8 Overlay\uff0c\u63d0\u4ea4\u65f6\u751f\u6210\u8986\u76d6\u503c\u3002Mask\u3001Rectify \u4e0e Cutout \u7684\u7a7a\u547d\u4e2d\u4fdd\u7559 active Image Empty\uff1b\u70b9\u4e2d\u53e6\u4e00\u5bf9\u8c61\u65f6\u5b8c\u6210\u539f\u751f\u9009\u62e9\u3002
"},{"location":"internals/common/#_2","title":"\u6750\u8d28\u3001\u8282\u70b9\u4e0e\u5bf9\u8c61","text":"create_image_material() \u6309 Shadeless\u3001Normal \u548c Depth \u7ec4\u5408\u8282\u70b9\u3001\u8fde\u63a5\u989c\u8272\u4e0e Alpha\uff1b\u6750\u8d28\u663e\u793a\u9002\u914d\u8bfb\u53d6\u5f53\u524d Preferences\u3002set_modifier_input() \u6309\u5b9e\u9645 RNA \u8f93\u5165\u5f62\u5f0f\u8bbe\u7f6e\u503c\uff0cfinalize_object_result() \u5b8c\u6210\u7ed3\u679c\u5bf9\u8c61\u6fc0\u6d3b\u548c\u6e90\u5bf9\u8c61\u5904\u7406\u3002Image \u66ff\u6362\u8def\u5f84\u4fdd\u7559 Empty \u7684\u77e9\u9635\u3001\u663e\u793a\u5c3a\u5bf8\u3001\u504f\u79fb\u548c Image User \u5e27\u8bbe\u7f6e\u3002
Geometry Nodes \u4ece src/anyimage/assets/O_AnyImage.blend \u6309\u516c\u5f00\u540d\u79f0\u52a0\u8f7d\u3002\u6784\u5efa\u4e0e\u5e03\u5c40\u804c\u8d23\u89c1\u8282\u70b9\u8d44\u4ea7\uff0c\u6df1\u5ea6\u5b57\u6bb5\u89c1Job \u4ea7\u7269\u3002
"},{"location":"internals/development/","title":"\u5f00\u53d1\u4e0e\u53d1\u5e03","text":"\u4ed3\u5e93\u4f7f\u7528 CPython 3.11 \u4e0e bpy==4.5.3 \u6d4b\u8bd5 Blender \u4ee3\u7801\uff1bAI Server \u4f7f\u7528 runtime.py \u58f0\u660e\u7684\u72ec\u7acb Python 3.12 Environment\u3002
uv sync\nuv run pytest\n
"},{"location":"internals/development/#_2","title":"\u6d4b\u8bd5\u7ec4\u7ec7","text":"\u6d4b\u8bd5\u8303\u56f4 \u6587\u4ef6 \u6269\u5c55\u6ce8\u518c\u3001\u8bbe\u7f6e\u3001\u5b89\u88c5\u548c Job \u4ea4\u4e92 test_addon_registration.py\u3001test_preferences.py\u3001test_ai_setup.py\u3001test_job_operator.py Frame\u3001Mask\u3001Rectify\u3001Plane\u3001Cutout \u5bf9\u5e94 test_*_tool.py\u3001test_*_operators.py \u4e0e\u5bf9\u8c61\u3001\u6295\u5f71\u3001\u7f51\u683c\u6d4b\u8bd5 \u56fe\u50cf\u8eab\u4efd\u3001Alpha\u3001\u6750\u8d28\u4e0e Undo \u56fe\u50cf\u7f16\u8f91\u96c6\u6210\u3001\u5171\u4eab\u66ff\u6362\u3001\u6750\u8d28\u9002\u914d\u4e0e Undo \u6d4b\u8bd5 Server test_job_server.py\u3001test_server_jobs.py\u3001test_input_validation.py\u3001test_geometry_artifacts.py \u6a21\u578b test_model_manager.py\u3001\u4e0b\u8f7d\u3001\u63a8\u7406\u4e0e\u5404 ONNX \u6a21\u578b\u6d4b\u8bd5 \u8282\u70b9\u8d44\u4ea7 \u5e03\u5c40\u4e0e\u63a5\u53e3\u7b49\u4ef7\u3001\u51e0\u4f55\u6c42\u503c\u3001Cutout \u4e0e\u4e34\u65f6\u5c5e\u6027\u6e05\u7406 \u5de5\u5177\u4e0e\u5305\u534f\u8bae \u6269\u5c55 Manifest\u3001\u6253\u5305\u3001\u6a21\u578b\u540c\u6b65\u4e0e\u8282\u70b9\u542f\u52a8\u5668 Blender Stub \u5171\u7528 tests/support/blender.py\uff1bServer \u548c\u5b9e\u9645 Blender \u51e0\u4f55 fixture \u6309\u4f7f\u7528\u8303\u56f4\u5b58\u653e\u5728\u5bf9\u5e94 support \u6a21\u5757\u3002\u6d4b\u8bd5\u547d\u540d\u63cf\u8ff0\u529f\u80fd\u3001\u89e6\u53d1\u6761\u4ef6\u4e0e\u53ef\u89c2\u5bdf\u7ed3\u679c\u3002
"},{"location":"internals/development/#_3","title":"\u53d1\u5e03\u547d\u4ee4","text":"\u547d\u4ee4 \u804c\u8d23 uv run pack \u751f\u6210 Windows\u3001macOS arm64\u3001Linux \u6269\u5c55\u5305 uv run pack --prepare \u4e3a\u672c\u673a\u540c\u6b65\u6269\u5c55 wheel \u4e0e Manifest uv run node-group build \u6784\u5efa\u3001\u9a8c\u8bc1\u8282\u70b9\u8d44\u4ea7\u5e76\u8fd0\u884c\u6d4b\u8bd5 uv run model sync \u51c6\u5907\u3001\u6821\u9a8c\u5e76\u4e0a\u4f20\u6a21\u578b\u58f0\u660e\u7684\u6587\u4ef6 uv run docs -dev \u672c\u5730\u9884\u89c8\u6587\u6863 uv run docs \u901a\u8fc7 Mike \u53d1\u5e03\u9879\u76ee\u7248\u672c\u5e76\u66f4\u65b0 latest tools/pack.py \u4ece pyproject.toml \u8bfb\u53d6\u4f9d\u8d56\uff0c\u6309\u5e73\u53f0\u4e0e Blender Python \u7248\u672c\u89e3\u6790 wheel\uff0c\u4f7f\u7528 Blender \u63d0\u4f9b\u7684 NumPy\u3002\u4ea7\u7269\u547d\u540d\u4e3a AnyImage.v<version>.<platform>.zip\uff0c\u5199\u5165 dist/\u3002\u672c\u5730 BlendJob wheel \u5185\u5bb9\u53d8\u5316\u540e\u8fd0\u884c uv lock --refresh\uff0c\u5e76\u6838\u5bf9\u9501\u6587\u4ef6\u3001Manifest \u4e0e\u6253\u5305\u6d4b\u8bd5\u3002
tools/models/cli.py \u6839\u636e\u6a21\u578b\u76ee\u5f55\u9009\u62e9\u4e0a\u6e38 ONNX \u6216\u672c\u5730\u5bfc\u51fa\u6d41\u7a0b\uff1btools/models/exports.py \u5904\u7406\u5bf9\u5e94 PyTorch \u6743\u91cd\u5bfc\u51fa\u3002\u6587\u4ef6\u6821\u9a8c\u4f9d\u636e\u58f0\u660e\u5927\u5c0f\u548c SHA-256\uff0c\u4e0a\u4f20\u4f7f\u7528\u9010\u6587\u4ef6\u590d\u5236\u3002uv run model prepare \u7528\u4e8e\u672c\u5730\u51c6\u5907\u3002
"},{"location":"internals/development/#ci","title":"CI \u4e0e\u6587\u6863\u5bfc\u822a","text":"flowchart TD\n A[main push\u3001Pull Request \u6216\u624b\u52a8\u89e6\u53d1] --> B[test.yml \u8fd0\u884c\u6d4b\u8bd5]\n C[v \u524d\u7f00 Tag] --> D[build.yml \u6d4b\u8bd5\u3001\u6253\u5305\u5e76\u53d1\u5e03 ZIP]\n E[main \u6587\u6863\u8def\u5f84\u53d8\u5316\u6216\u624b\u52a8\u89e6\u53d1] --> F[docs.yml \u6784\u5efa\u7ad9\u70b9\u5e76\u90e8\u7f72\u5230 Cloudflare Workers]
\u7ad9\u70b9\u5bfc\u822a\u7531 mkdocs.yml \u663e\u5f0f\u7ef4\u62a4\uff0c\u9875\u9762\u79fb\u52a8\u65f6\u540c\u6b65\u5bfc\u822a\u548c\u76f8\u5bf9\u94fe\u63a5\u3002\u8282\u70b9\u8d44\u4ea7\u7684\u811a\u672c\u804c\u8d23\u53ca\u68c0\u67e5\u5165\u53e3\u89c1\u8282\u70b9\u8d44\u4ea7\u3002
"},{"location":"internals/node-assets/","title":"\u8282\u70b9\u8d44\u4ea7","text":""},{"location":"internals/node-assets/#_2","title":"\u8d44\u4ea7\u6e05\u5355","text":"\u8282\u70b9\u7ec4\u7531 tools/nodes/groups/ \u4e2d\u7684\u6784\u5efa\u6a21\u5757\u5b9a\u4e49\u3002
\u8282\u70b9\u7ec4 \u6784\u5efa\u6a21\u5757 O Image Plane image_plane.py O Image Depth Plane image_depth_plane.py O Image Relief Plane image_relief_plane.py O Image Cutout image_cutout.py O Image Depth Cutout image_depth_cutout.py O Image Cutout Symmetry image_cutout_symmetry.py O Image Layer image_layer.py O Image Depth Layer image_depth_layer.py O Shadeless shadeless.py O Image Depth Panorama image_depth_panorama.py"},{"location":"internals/node-assets/#_3","title":"\u6784\u5efa\u8282\u70b9\u8d44\u4ea7","text":"\u751f\u4ea7\u8282\u70b9\u7ec4\u7531 uv run node-group build \u6784\u5efa\u5230 src/anyimage/assets/O_AnyImage.blend
\u8282\u70b9\u7ec4\u89c4\u5219\uff1a
- \u5b57\u6bb5\u9ed8\u8ba4\u76f4\u63a5\u8fde\u63a5\uff0c\u591a\u4e2a\u6d88\u8d39\u8005\u53ef\u590d\u7528\u540c\u4e00\u8f93\u51fa\uff1b\u6309\u6d88\u8d39\u4f4d\u7f6e\u7684\u51e0\u4f55\u3001\u57df\u3001\u7c7b\u578b\u548c\u8f93\u5165\u5c5e\u6027\u7248\u672c\u9a8c\u8bc1\u6c42\u503c\u7b49\u4ef7\u6027
- \u6240\u6709\u51e0\u4f55\u8282\u70b9\u3001\u5d4c\u5957\u7ec4\u53ca\u6d4b\u8bd5\u8f85\u52a9\u56fe\u7981\u6b62\u4f7f\u7528 Capture Attribute\uff1b\u6784\u5efa\u5b9a\u4e49\u548c\u4fdd\u5b58\u8d44\u4ea7\u9012\u5f52\u68c0\u67e5 Capture \u4e3a\u96f6
- \u57df\u8f6c\u6362\u4f7f\u7528 Evaluate on Domain \u6216\u660e\u786e\u57df\u7684\u91c7\u6837\u8282\u70b9\u8868\u8fbe\uff1b\u8de8\u51e0\u4f55\u53d8\u5316\u4f18\u5148\u8c03\u6574\u6d88\u8d39\u987a\u5e8f\u6216\u5728\u6e90\u51e0\u4f55\u4e0a\u91c7\u6837\uff0c\u660e\u786e\u7d22\u5f15\u5bf9\u5e94\u5173\u7cfb
- Store Named Attribute \u7528\u4e8e\u5b9e\u9645\u547d\u540d\u534f\u8bae\u6216\u4ecd\u9700\u8de8\u51e0\u4f55\u53d8\u5316\u4fdd\u5b58\u7684\u6700\u5c11\u6570\u636e\uff0c\u9010\u9879\u660e\u786e\u540d\u79f0\u3001\u7c7b\u578b\u3001\u57df\u3001Selection\u3001\u5199\u5165\u9636\u6bb5\u3001\u6d88\u8d39\u8005\u53ca\u5fc5\u8981\u6027\uff1b\u5185\u90e8\u4e34\u65f6\u5c5e\u6027\u4f7f\u7528
_o_ \u524d\u7f00\uff0c\u5728\u6700\u540e\u6d88\u8d39\u8005\u4e4b\u540e\u7528\u901a\u914d\u7b26 _o_* \u6e05\u7406\uff0c\u4fdd\u7559 UV\u3001\u7528\u6237\u5c5e\u6027\u548c\u5916\u90e8\u534f\u8bae\u5c5e\u6027\u3002\u6e05\u7406\u5fc5\u987b\u8d70 remove_attribute_pattern\uff1a\u6309\u7cbe\u786e\u540d\u79f0\u5220\u9664\u65f6\uff0c\u82e5\u67d0\u4e2a\u51e0\u4f55\u5206\u652f\u4ece\u672a\u5199\u5165\u8be5\u5c5e\u6027\uff0cRemove Named Attribute \u4f1a\u62a5\u51fa\u7f3a\u5931\u8b66\u544a - Group Input \u6309\u533a\u57df\u91cd\u590d\u653e\u7f6e\uff0c\u901a\u8fc7\u5b57\u6bb5\u6392\u5217\u548c\u5fc5\u8981\u7684 Reroute \u4fdd\u6301\u8fde\u7ebf\u53ef\u8bfb\uff0c\u9690\u85cf\u672a\u4f7f\u7528\u8f93\u51fa\uff1b\u5b58\u50a8\u987b\u6709\u6570\u636e\u751f\u547d\u5468\u671f\u4f9d\u636e
- \u6784\u5efa\u9636\u6bb5\u901a\u8fc7\u660e\u786e\u7684\u8282\u70b9\u6216 socket \u5f15\u7528\u63a5\u7ebf
- \u4fdd\u7559\u8282\u70b9\u9ed8\u8ba4
name \u548c\u6807\u9898\uff0c\u4e0d\u7528 label \u8986\u76d6\uff0c\u4e0d\u7528 String \u8282\u70b9\u6ce8\u89e3\u3002Frame \u4ec5\u7528\u4e8e\u786e\u6709\u5305\u88f9\u8bed\u4e49\u7684\u533a\u57df - \u5168\u63a5\u7ebf\u7684\u7b80\u5355\u6570\u5b66\u8fd0\u7b97\u53ef\u6298\u53e0\uff1b\u9700\u8981\u9605\u8bfb\u7684\u5e38\u6570\u3001\u8fd0\u7b97\u57df\u548c\u6a21\u5f0f\u4fdd\u6301\u53ef\u89c1
- \u6bd4\u8f83\u7edf\u4e00\u7528 Compare \u8282\u70b9\u5e76\u6309\u64cd\u4f5c\u6570\u6570\u636e\u7c7b\u578b\u9009\u62e9\u8f93\u5165\uff0c\u5e03\u5c14\u8fd0\u7b97\u7edf\u4e00\u7528 Boolean Math\uff0c\u4e0d\u7528 Math \u8282\u70b9\u505a\u6bd4\u8f83\u3001\u4e5f\u4e0d\u7528\u6570\u503c\u4e58\u6cd5\u4ee3\u66ff\u5e03\u5c14\u8fd0\u7b97\uff1b\u6750\u8d28\u6811\u4e0d\u652f\u6301\u8fd9\u4e24\u4e2a\u8282\u70b9\uff0c\u4ecd\u7528 Math
- \u4fee\u6539\u5668 Geometry Nodes \u7684\u8f93\u5165 socket \u9ed8\u8ba4\u4f7f\u7528
SINGLE - socket
subtype \u6309\u4e1a\u52a1\u8bed\u4e49\u8bbe\u7f6e\uff1a\u957f\u5ea6\u7528 DISTANCE\uff0c0\u20131 \u6bd4\u4f8b\u7528 FACTOR\uff0c0\u2013100 \u7528 PERCENTAGE\uff1b\u65e0\u5bf9\u5e94\u8303\u56f4\u8bed\u4e49\u65f6\u4fdd\u7559\u9ed8\u8ba4 - \u63a5\u53e3\u6216\u5e03\u5c40\u53d8\u66f4\u987b\u9a8c\u8bc1 socket \u987a\u5e8f\u4e0e\u7ed3\u6784\u3001\u672a\u4f7f\u7528\u8f93\u51fa\u9690\u85cf\u53ca\u51e0\u4f55\u6c42\u503c\uff1b\u7eaf\u5e03\u5c40\u53d8\u66f4\u6bd4\u8f83\u8fd0\u7b97\u3001\u9ed8\u8ba4\u503c\u548c\u5b9e\u9645\u8fde\u63a5\uff0c\u786e\u8ba4\u529f\u80fd\u4e0d\u53d8
"},{"location":"internals/node-assets/#_4","title":"\u6784\u5efa\u8d44\u4ea7\u811a\u672c","text":"tools/nodes/build.py \u6309\u4f9d\u8d56\u987a\u5e8f\u6784\u5efa\u8d44\u4ea7\uff0c\u8c03\u7528 arrangement/ \u7edf\u4e00\u6392\u5217\u51e0\u4f55\u8282\u70b9\u7ec4\u540e\u4fdd\u5b58\u3002common/ \u63d0\u4f9b\u5171\u7528\u6784\u5efa\u51fd\u6570\uff1anodes.py \u521b\u5efa\u63a5\u53e3\u4e0e\u8282\u70b9\uff0cdepth_surface.py\u3001cutout.py \u7b49\u7ec4\u88c5\u51e0\u4f55\uff0cshader.py \u6784\u5efa\u6750\u8d28\u7740\u8272\u8282\u70b9\uff0cmaterial_slots.py \u7ee7\u627f\u51e0\u4f55\u6750\u8d28\u69fd\uff1btools/nodes/preview/ \u5bfc\u51fa\u4ea4\u4e92\u9884\u89c8\u3002
\u4fdd\u5b58\u540e\uff0ccheck.py \u5728\u72ec\u7acb Blender \u8fdb\u7a0b\u4e2d\u91cd\u65b0\u52a0\u8f7d\u8d44\u4ea7\u5e76\u505a\u57fa\u672c\u51e0\u4f55\u6c42\u503c\u3002\u63a5\u53e3\u3001\u9ed8\u8ba4\u503c\u548c\u8be6\u7ec6\u51e0\u4f55\u884c\u4e3a\u7531 tests/ \u68c0\u67e5\u3002
uv run node-group build --blender \"/path/to/blender\"\nuv run node-group build --skip-tests\nuv run node-group check\nuv run node-group preview\n
\u811a\u672c\u6309 --blender\u3001\u73af\u5883\u53d8\u91cf BLENDER_BIN\u3001\u9879\u76ee .env\u3001PATH \u7684\u987a\u5e8f\u67e5\u627e Blender\u3002\u65e0\u6cd5\u81ea\u52a8\u627e\u5230\u65f6\uff0c\u5728\u9879\u76ee\u6839\u76ee\u5f55\u7684 .env \u4e2d\u914d\u7f6e\uff1a
BLENDER_BIN=\"/absolute/path/to/blender\"\n
"},{"location":"internals/outputs/","title":"Job \u4ea7\u7269","text":"Server \u5c06\u7ed3\u679c\u5199\u5165 Job \u76ee\u5f55\uff0c\u8fd4\u56de\u4ee5\u76f8\u5bf9\u6587\u4ef6\u540d\u4e3a\u503c\u7684\u5b57\u5178\u3002Blender \u4e3b\u7ebf\u7a0b\u901a\u8fc7 JobResult \u8bfb\u53d6\u6587\u4ef6\uff0c\u521b\u5efa\u6216\u66f4\u65b0 Image\u3001Mesh\u3001Material \u548c Object\u3002
Job \u6587\u4ef6 \u6d88\u8d39\u65b9 remove-background foreground.png \u6216 alpha.npy ImageEditTarget \u6216 HDR Alpha \u7f16\u8f91 upscale-image upscale.png \u56fe\u50cf\u66ff\u6362 generate-depth-plane-geometry depth.exr\u3001depth.json \u548c\u6cd5\u7ebf Depth / Relief Plane generate-cutout-artifacts \u6309\u8bf7\u6c42\u63d0\u4f9b\u6df1\u5ea6\u3001\u5143\u6570\u636e\u548c\u6cd5\u7ebf Cutout generate-panorama-geometry depth.exr\u3001depth.json Panorama"},{"location":"internals/outputs/#_1","title":"\u6df1\u5ea6\u4e0e\u6cd5\u7ebf\u534f\u8bae","text":"\u8fd4\u56de\u5b57\u6bb5 \u5185\u5bb9 depth float32 EXR\uff0c\u900f\u89c6\u4ea7\u7269 RGB \u4fdd\u5b58\u76f8\u673a\u7a7a\u95f4 XYZ\uff0cAlpha \u4fdd\u5b58\u6e90 Alpha \u00d7 \u6a21\u578b\u6709\u6548\u6027 depth_metadata JSON\uff0c\u5305\u542b image_size \u4e0e 3\u00d73 intrinsics tangent_normal tangent-normal.png\uff0c\u5207\u7ebf\u7a7a\u95f4\u6cd5\u7ebf object_normal object-normal.png\uff0c\u5bf9\u8c61\u7a7a\u95f4\u6cd5\u7ebf flowchart TD\n A[\u6e90 RGB \u4e0e Alpha] --> B[\u9650\u5c3a\u5bf8 RGB \u63a8\u7406]\n B --> C[GeometryFrame]\n C --> D[\u5199\u51fa\u6df1\u5ea6\u4e0e\u6cd5\u7ebf]\n A --> E[\u6e90 Alpha \u5199\u5165\u6709\u6548\u901a\u9053]\n E --> D\n D --> F[Blender \u52a0\u8f7d\u5e76 Pack]
\u53c2\u8003\u6df1\u5ea6\u7531 common/depth.py \u4ece\u4ea7\u7269\u8ba1\u7b97\uff1a\u5148\u6309 Alpha \u9608\u503c\u548c\u6709\u9650\u6b63\u6df1\u5ea6\u7b5b\u9009\u6837\u672c\uff0c\u5254\u9664\u8d85\u8fc7\u6837\u672c\u4e2d\u4f4d\u6570 1.1 \u500d\u7684\u8fdc\u5904\u80cc\u666f\uff0c\u518d\u53d6 95 \u5206\u4f4d\u6570\uff1b\u65e0\u53ef\u7528\u6837\u672c\u65f6\u8fd4\u56de\u57fa\u51c6\u503c\u3002\u52a0\u8f7d\u540e\u8bbe\u7f6e Non-Color \u548c CHANNEL_PACKED\u3002Depth Plane \u4f7f\u7528\u5bf9\u8c61\u7a7a\u95f4\u6cd5\u7ebf\uff0cRelief Plane \u4f7f\u7528\u5207\u7ebf\u7a7a\u95f4\u6cd5\u7ebf\u3002
Panorama \u7684 EXR RGB \u4fdd\u5b58\u5f84\u5411\u8ddd\u79bb\uff0cAlpha \u4fdd\u5b58\u6e90 Alpha \u4e0e\u878d\u5408\u6709\u6548\u6027\uff1b\u5143\u6570\u636e\u5305\u542b projection: equirectangular \u548c image_size\u3002
"},{"location":"internals/outputs/#_2","title":"\u989c\u8272\u4e0e\u56fe\u50cf\u7f16\u8f91","text":"common/color_image.py \u4e3a Plane\u3001Panorama \u548c Cutout \u51c6\u5907\u72ec\u7acb\u7684\u6750\u8d28\u989c\u8272\u4e0e AI \u5206\u6790\u8f93\u5165\u3002Cutout \u4f7f\u7528 Selection bounds \u5185\u7684\u6e90\u56fe\uff1b\u7f51\u683c\u521b\u5efa\u65f6\u7ec4\u5408\u6e90 Alpha \u4e0e SelectionMask\u3002\u989c\u8272\u5206\u8fa8\u7387\u4e0e\u5206\u6790\u5c3a\u5bf8\u5206\u522b\u5904\u7406\u3002
ImageEditTarget \u7edf\u4e00 Image Empty \u548c Shader Image Texture \u7684\u7f16\u8f91\u76ee\u6807\u53ca\u5171\u4eab\u5f15\u7528\u3002HDR \u53bb\u80cc\u666f\u901a\u8fc7 HdrBackgroundInput \u4fdd\u7559 Blender \u6d6e\u70b9 RGB\uff0c\u5e76\u5e94\u7528 Server \u8fd4\u56de\u7684\u8fde\u7eed Alpha\u3002
"},{"location":"internals/runtime/","title":"Job Runtime \u4e0e Server","text":"runtime.py \u914d\u7f6e BlendJob JobRuntime \u548c\u72ec\u7acb Python 3.12 Environment\u3002server/app.py \u6ce8\u518c Job\uff0cmodel_manager.py \u7ba1\u7406\u6a21\u578b\u6587\u4ef6\u4e0e\u7f13\u5b58 Session\u3002
flowchart TD\n A[Operator request] --> B[JobRuntime \u961f\u5217]\n B --> C[Server Job \u8c03\u7528\u5a92\u4f53\u4e0e\u6a21\u578b\u6a21\u5757]\n C --> D[\u5199\u5165 Job \u76ee\u5f55]\n D --> E[\u4e3b\u7ebf\u7a0b response \u5bfc\u5165\u7ed3\u679c]
Job \u5b9e\u73b0\u4e0e\u7528\u9014 download-model\u3001download-required-models app.py \u4e0b\u8f7d\u5355\u4e2a\u6216\u7f3a\u5931\u6a21\u578b remove-background jobs/remove_background.py \u751f\u6210\u900f\u660e\u524d\u666f\u6216\u8fde\u7eed Alpha upscale-image jobs/upscale.py \u751f\u6210 2\u00d7 \u56fe\u50cf generate-depth-plane-geometry jobs/depth_plane.py \u751f\u6210\u6df1\u5ea6\u3001\u5143\u6570\u636e\u548c\u6cd5\u7ebf generate-cutout-artifacts jobs/cutout.py \u6309\u8bf7\u6c42\u751f\u6210\u6df1\u5ea6\u548c\u6cd5\u7ebf generate-panorama-geometry jobs/panorama.py \u751f\u6210\u5168\u666f\u5f84\u5411\u6df1\u5ea6 media/ \u6821\u9a8c\u8f93\u5165\u56fe\u7247\u5e76\u9650\u5236\u5206\u6790\u5c3a\u5bf8\uff0cServer \u53ea\u5904\u7406\u9759\u6001\u56fe\u7247\u3002Job \u5728\u9636\u6bb5\u8fb9\u754c\u68c0\u67e5\u53d6\u6d88\uff0c\u901a\u8fc7 context.progress() \u8fd4\u56de\u8fdb\u5ea6\uff0cOperator \u6e05\u7406 Blender \u5bfc\u51fa\u7684\u4e34\u65f6\u8f93\u5165\u3002
geometry/prediction_artifacts.py \u7f29\u653e\u6e90 RGB \u540e\u8fd0\u884c\u4e00\u6b21 MoGe\uff0c\u5c06\u540c\u4e00\u9884\u6d4b\u4ea4\u7ed9\u6df1\u5ea6\u3001\u6cd5\u7ebf\u548c\u5143\u6570\u636e\u5199\u5165\u5668\uff1b\u6e90 Alpha \u5199\u5165\u6df1\u5ea6\u4e0e\u6cd5\u7ebf\u4ea7\u7269\u7684\u6709\u6548\u901a\u9053\u3002\u53c2\u8003\u6df1\u5ea6\u7531 Blender \u4fa7\u6309\u4ea7\u7269 Alpha \u8ba1\u7b97\uff0c\u6587\u4ef6\u534f\u8bae\u89c1 Job \u4ea7\u7269\u3002
"},{"location":"internals/runtime/#_1","title":"\u6a21\u578b\u4e0e\u7f13\u5b58","text":"\u7528\u9014 \u6a21\u578b Session \u5206\u7c7b Depth \u4e0e Normal MoGe-2 ViT-S / ViT-B Normal\u3001MoGe-3 ViT-L geometry Remove Background BiRefNet Lite\u3001BEN2\u3001BiRefNet HR Matting background Upscale Real-ESRGAN WDN\u3001Real-ESRGAN x4plus\u3001HAT Sharper upscale model_catalog.py \u58f0\u660e\u6587\u4ef6\u6765\u6e90\u3001\u8bb8\u53ef\u3001\u5927\u5c0f\u548c SHA-256\uff1bmodel_download.py \u4e0b\u8f7d\u5e76\u6821\u9a8c\u3002ModelManager \u6309\u6a21\u578b\u8def\u5f84\u548c\u8bbe\u5907\u7f13\u5b58 Session\uff0c\u5207\u6362\u6a21\u578b\u6216\u8bbe\u5907\u65f6\u91ca\u653e\u5bf9\u5e94\u7c7b\u522b\u3002Clear Models \u6216\u5173\u95ed Server \u65f6\u91ca\u653e\u5df2\u52a0\u8f7d\u8d44\u6e90\u3002
\u9996\u6b21\u5b89\u88c5\u901a\u8fc7 post_install() \u4e0b\u8f7d\u9ed8\u8ba4 MoGe-2 ViT-S Normal\u3001BiRefNet Lite \u4e0e Real-ESRGAN General WDN x4v3\u3002Storage Root \u9ed8\u8ba4 ~/.anyimage\uff0c\u4fdd\u5b58\u73af\u5883\u3001\u6a21\u578b\u3001Job \u4ea7\u7269\u548c\u65e5\u5fd7\u3002\u8bbe\u7f6e\u5165\u53e3\u89c1 AI \u73af\u5883\u7ba1\u7406\u3002
"},{"location":"internals/operators/","title":"Operator \u5b9e\u73b0\u7d22\u5f15","text":"\u6e90\u7801\uff08\u76f8\u5bf9 src/anyimage/\uff09 \u529f\u80fd operators/ai_setup.py AI \u73af\u5883\u7ba1\u7406 operators/clipboard_image/ \u526a\u8d34\u677f\u56fe\u7247 operators/convert_to_plane/ Plane \u4e0e Depth Plane operators/convert_to_panorama/ Panorama operators/cutout_tool/ Cutout operators/frame_tool/operators.py Frame \u591a\u56fe\u5408\u6210 operators/mask_tool.py Mask Alpha \u7f16\u8f91 operators/rectify_tool/operators.py Rectify \u900f\u89c6\u6821\u6b63 operators/remove_background.py Remove Background operators/upscale.py Upscale \u5355\u6587\u4ef6\u529f\u80fd\u6309\u4e1a\u52a1\u547d\u540d\uff1b\u590d\u6742\u529f\u80fd\u5305\u5728 operators.py \u5b9a\u4e49 Operator \u548c\u5165\u53e3\u534f\u8c03\u903b\u8f91\uff0c\u4ea4\u4e92\u5f0f\u5de5\u5177\u540c\u65f6\u5b9a\u4e49 WorkSpaceTool\uff0c\u5176\u4f59\u6a21\u5757\u627f\u8f7d\u5177\u4f53\u5b9e\u73b0\u3002\u5305\u7684 __init__.py \u6c47\u603b\u5bfc\u51fa\u4e0e CLASSES \u6ce8\u518c\u6e05\u5355\uff0c\u7c7b\u578b\u5728 operators/__init__.py \u548c\u6269\u5c55 __init__.py \u6c47\u603b\u6ce8\u518c\u3002AI Operator \u4f7f\u7528\u666e\u901a\u5b57\u5178\u63d0\u4ea4\u4efb\u52a1\uff0c\u5e76\u5728\u4e3b\u7ebf\u7a0b\u54cd\u5e94\u4e2d\u8bfb\u53d6\u6587\u4ef6\u548c\u4fee\u6539 Blender \u6570\u636e\u3002
"},{"location":"internals/operators/ai-setup/","title":"AI \u73af\u5883\u7ba1\u7406","text":"AI \u73af\u5883\u7ba1\u7406\u4ece\u5f53\u524d\u5b89\u88c5\u72b6\u6001\u51fa\u53d1\uff0c\u8865\u9f50\u72ec\u7acb\u8fd0\u884c\u73af\u5883\u548c\u5fc5\u9700\u6a21\u578b\uff0c\u5e76\u63d0\u4f9b\u8bbe\u7f6e\u5165\u53e3\u4e0e\u6a21\u578b\u7f13\u5b58\u91ca\u653e\u64cd\u4f5c\u3002
"},{"location":"internals/operators/ai-setup/#_1","title":"\u6267\u884c\u8fc7\u7a0b","text":"flowchart TD\n Entry[\"Set Up AI Server\"] --> Status[\"\u8bfb\u53d6\u73af\u5883\u4e0e\u5fc5\u9700\u6a21\u578b\u72b6\u6001\"]\n Status --> Ready{\"\u662f\u5426\u5168\u90e8\u5c31\u7eea\uff1f\"}\n Ready -- \"\u662f\" --> Done[\"\u7ed3\u675f\"]\n Ready -- \"\u5426\" --> Environment{\"\u8fd0\u884c\u73af\u5883\u662f\u5426\u5c31\u7eea\uff1f\"}\n Environment -- \"\u5426\" --> Install[\"\u5b89\u88c5\u9694\u79bb Python \u73af\u5883\"]\n Environment -- \"\u662f\" --> Download[\"\u4e0b\u8f7d\u7f3a\u5931\u7684\u5fc5\u9700\u6a21\u578b\"]\n Install --> Download --> Done
SetupAIEnvironment \u662f\u7edf\u4e00\u5165\u53e3\u3002\u9996\u6b21\u4f7f\u7528\u65f6\u5148\u5b89\u88c5\u8fd0\u884c\u73af\u5883\uff0c\u518d\u4e0b\u8f7d\u9ed8\u8ba4\u6a21\u578b\uff1b\u73af\u5883\u5df2\u7ecf\u5b58\u5728\u65f6\uff0c\u53ea\u8865\u9f50\u7f3a\u5931\u6a21\u578b\u3002\u73af\u5883\u5b89\u88c5\u7531 Blender Operator \u542f\u52a8\uff0c\u6a21\u578b\u4e0b\u8f7d\u901a\u8fc7 Job Server \u6267\u884c\u3002
"},{"location":"internals/operators/ai-setup/#_2","title":"\u8282\u70b9\u8bf4\u660e","text":""},{"location":"internals/operators/ai-setup/#_3","title":"\u8bfb\u53d6\u72b6\u6001\uff0c\u9009\u62e9\u4e0b\u4e00\u6b65","text":"\u5165\u53e3\u4f4d\u4e8e src/anyimage/operators/ai_setup.py\u3002SetupAIEnvironment \u901a\u8fc7 properties.py \u4e2d\u7684 ai_status() \u8bfb\u53d6\u73af\u5883\u548c\u6a21\u578b\u72b6\u6001\uff0c\u5e76\u6839\u636e\u7ed3\u679c\u7ed3\u675f\u3001\u5b89\u88c5\u73af\u5883\u6216\u8c03\u7528 DownloadRequiredModels\u3002\u5bf9\u8bdd\u6846\u540c\u65f6\u663e\u793a\u9884\u8ba1\u4e0b\u8f7d\u91cf\u548c\u7f3a\u5931\u6a21\u578b\u540d\u79f0\u3002
runtime.py \u63d0\u4f9b\u5f53\u524d Environment \u4e0e Server \u72b6\u6001\uff1bServer \u6b63\u5fd9\u65f6\u4e0d\u4f1a\u542f\u52a8\u65b0\u7684\u5b89\u88c5\u6d41\u7a0b\u3002OpenAIEnvironmentSettings \u6253\u5f00 AnyImage \u7684\u6269\u5c55\u9996\u9009\u9879\u3002
"},{"location":"internals/operators/ai-setup/#_4","title":"\u5b89\u88c5\u72ec\u7acb\u73af\u5883","text":"\u73af\u5883\u5c1a\u672a\u5c31\u7eea\u65f6\uff0cSetupAIEnvironment \u8c03\u7528 Runtime \u6ce8\u518c\u7684\u5b89\u88c5 Operator\u3002use_mirror \u51b3\u5b9a uv\u3001Python \u548c\u5b89\u88c5\u5305\u7684\u4e0b\u8f7d\u6e90\uff0c\u6a21\u578b\u4f7f\u7528\u6a21\u578b\u76ee\u5f55\u4e2d\u58f0\u660e\u7684\u6765\u6e90\u3002
\u5b89\u88c5\u5b8c\u6210\u540e\u901a\u8fc7 post_install() \u4e0b\u8f7d\u9ed8\u8ba4\u6a21\u578b\uff0c\u6a21\u578b\u4f9d\u8d56\u52a0\u8f7d\u4e8e\u72ec\u7acb Server \u73af\u5883\u3002
"},{"location":"internals/operators/ai-setup/#_5","title":"\u4e0b\u8f7d\u6a21\u578b","text":"ai_setup.py \u4e2d\u7684 DownloadModel \u5904\u7406\u5355\u4e2a\u6a21\u578b\uff0cDownloadRequiredModels \u5904\u7406\u9ed8\u8ba4\u5fc5\u9700\u6a21\u578b\u96c6\u5408\u3002\u4e24\u8005\u5148\u68c0\u67e5 Environment\u3001Blender Online Access \u548c\u6a21\u578b\u8bb0\u5f55\uff0c\u518d\u63d0\u4ea4 download-model \u6216 download-required-models Job\u3002
Job \u5728 server/app.py \u6ce8\u518c\uff1bserver/model_catalog.py \u4fdd\u5b58\u6a21\u578b\u540d\u79f0\u3001\u6587\u4ef6\u548c\u6765\u6e90\uff0cserver/model_download.py \u4e0b\u8f7d\u5e76\u6821\u9a8c\u6587\u4ef6\uff0cserver/model_manager.py \u7ba1\u7406\u6a21\u578b\u76ee\u5f55\u4e0e\u5df2\u52a0\u8f7d Session\u3002\u4e0b\u8f7d\u8fdb\u5ea6\u548c\u9519\u8bef\u901a\u8fc7\u540c\u4e00\u5957 BlendJob Runtime \u8fd4\u56de Blender\u3002
"},{"location":"internals/operators/ai-setup/#_6","title":"\u91ca\u653e\u6a21\u578b\u7f13\u5b58","text":"ai_setup.py \u4e2d\u7684 ClearModels \u8c03\u7528 runtime.clear_resource(\"model_manager\")\uff0c\u91ca\u653e Server \u4e2d\u5df2\u52a0\u8f7d\u7684\u6a21\u578b Session\u3002\u4e0b\u6b21\u63a8\u7406\u4ece\u6a21\u578b\u76ee\u5f55\u91cd\u65b0\u52a0\u8f7d Session\u3002
"},{"location":"internals/operators/clipboard-image/","title":"\u526a\u8d34\u677f\u56fe\u7247","text":"\u526a\u8d34\u677f\u56fe\u7247\u4ece Ctrl/Cmd + V \u5f00\u59cb\uff0c\u628a\u64cd\u4f5c\u7cfb\u7edf\u4e2d\u7684\u56fe\u7247\u53d8\u6210 Packed Blender Image\uff0c\u5e76\u653e\u5230\u5f53\u524d\u7f16\u8f91\u5668\u652f\u6301\u7684\u4f4d\u7f6e\u3002
"},{"location":"internals/operators/clipboard-image/#_2","title":"\u6267\u884c\u8fc7\u7a0b","text":"flowchart TD\n Paste[\"Ctrl/Cmd + V\"] --> Priority{\"\u521a\u6267\u884c\u8fc7 Blender Copy\uff1f\"}\n Priority -- \"\u662f\" --> Native[\"\u4ea4\u56de\u539f\u751f Paste\"]\n Priority -- \"\u5426\" --> Read[\"\u8bfb\u53d6\u7cfb\u7edf\u56fe\u7247\"]\n Read --> Image[\"\u590d\u7528\u6216\u521b\u5efa Packed Image\"]\n Image --> Target{\"\u5f53\u524d\u7f16\u8f91\u5668\"}\n Target --> View[\"Reference / Plane\"]\n Target --> Node[\"Image Node\"]\n Target --> Paint[\"Brush Texture\"]
Windows \u5feb\u6377\u952e\u4f18\u5148\u5904\u7406 Blender \u81ea\u5df1\u7684 Copy/Paste\uff0c\u7cfb\u7edf\u526a\u8d34\u677f\u51fa\u73b0\u65b0\u7684\u56fe\u7247\u5185\u5bb9\u65f6 AnyImage \u63a5\u7ba1\u7c98\u8d34\uff1bmacOS \u548c Linux \u6ca1\u6709\u7cfb\u7edf\u526a\u8d34\u677f\u5e8f\u5217\u53f7\uff0c\u59cb\u7ec8\u7531 AnyImage \u5904\u7406\u7c98\u8d34\u3002
"},{"location":"internals/operators/clipboard-image/#_3","title":"\u8282\u70b9\u8bf4\u660e","text":""},{"location":"internals/operators/clipboard-image/#blender","title":"\u5224\u65ad\u662f\u5426\u4ea4\u7ed9 Blender","text":"operators/clipboard_image/operators.py \u5b9a\u4e49 TrackNativeCopy\u3001PasteClipboardImage \u548c 3D View\u3001Node Editor \u5feb\u6377\u952e\u3002TrackNativeCopy \u8bb0\u5f55 Blender Copy \u65f6\u7684\u7cfb\u7edf\u526a\u8d34\u677f\u5e8f\u5217\u53f7\uff1b\u7c98\u8d34\u65f6\u82e5\u5e8f\u5217\u53f7\u6ca1\u6709\u53d8\u5316\uff0cPasteClipboardImage \u8fd4\u56de PASS_THROUGH\uff0c\u8ba9 Blender \u7ee7\u7eed\u5904\u7406\u5bf9\u8c61\u6216\u8282\u70b9\u7c98\u8d34\u3002
\u540c\u4e00\u6587\u4ef6\u968f\u540e\u8c03\u7528 actions.target_for_context() \u5224\u65ad\u5f53\u524d\u7f16\u8f91\u5668\u662f\u5426\u652f\u6301\u56fe\u7247\u843d\u70b9\u3002
"},{"location":"internals/operators/clipboard-image/#_4","title":"\u8bfb\u53d6\u7cfb\u7edf\u56fe\u7247","text":"clipboard.py \u8d1f\u8d23\u5e73\u53f0\u5dee\u5f02\u3002Windows \u4f9d\u6b21\u5c1d\u8bd5 PNG\u3001DIBV5 \u548c DIB\uff0cDIB \u8865\u6210 BMP\uff1bmacOS \u901a\u8fc7 osascript \u5bfc\u51fa PNG\uff1bLinux \u4f9d\u6b21\u5c1d\u8bd5 wl-paste \u548c xclip \u63d0\u4f9b\u7684\u56fe\u7247\u683c\u5f0f\u3002\u5404\u5e73\u53f0\u8f93\u51fa\u7edf\u4e00\u4e3a\u56fe\u7247\u5b57\u8282\u548c\u6269\u5c55\u540d\uff0c\u518d\u4ea4\u7ed9\u540e\u7eed\u6b65\u9aa4\u3002
"},{"location":"internals/operators/clipboard-image/#packed-image","title":"\u521b\u5efa\u6216\u590d\u7528 Packed Image","text":"actions.py \u5bf9\u56fe\u7247\u5185\u5bb9\u8ba1\u7b97 SHA-256\u3002\u76f8\u540c\u5185\u5bb9\u5df2\u7ecf\u7c98\u8d34\u8fc7\u65f6\u4f1a\u590d\u7528\u73b0\u6709 Packed Image\uff0c\u5426\u5219\u521b\u5efa\u65b0 Image \u5e76 Pack \u5230\u5f53\u524d .blend\uff0c\u907f\u514d\u4f9d\u8d56\u4e34\u65f6\u526a\u8d34\u677f\u6587\u4ef6\u3002
"},{"location":"internals/operators/clipboard-image/#_5","title":"\u653e\u5230\u5f53\u524d\u7f16\u8f91\u5668","text":"\u843d\u70b9\u4ecd\u5728 actions.py \u4e2d\u5b8c\u6210\uff1a3D View \u521b\u5efa Reference \u6216 Plane\uff0cNode Editor \u521b\u5efa\u4e0e\u5f53\u524d\u8282\u70b9\u6811\u5339\u914d\u7684 Image \u8282\u70b9\uff0c\u7ed8\u5236\u6a21\u5f0f\u628a Image \u914d\u7f6e\u4e3a\u5f53\u524d\u753b\u7b14\u7684 Texture\u3002\u9f20\u6807\u4f4d\u7f6e\u548c\u89c6\u56fe\u4f4d\u7f6e\u4e5f\u5728\u8fd9\u91cc\u6362\u7b97\u3002
Plane \u8def\u5f84\u8c03\u7528 convert_to_plane/image_plane.py \u521b\u5efa\u4e2d\u5fc3\u539f\u70b9\u57fa\u7840\u7f51\u683c\uff0c\u5e76\u4ece\u8282\u70b9\u8d44\u4ea7\u52a0\u8f7d O Image Plane\u3002actions.py \u521b\u5efa\u56fe\u50cf\u6750\u8d28\u5e76\u653e\u5165 Mesh \u7b2c 0 \u4e2a\u6750\u8d28\u69fd\uff0c\u8282\u70b9\u7ec4\u53ea\u751f\u6210\u51e0\u4f55\u3002
"},{"location":"internals/operators/convert-to-panorama/","title":"Panorama \u8f6c\u6362","text":"operators/convert_to_panorama/ \u5c06\u9759\u6001\u7b49\u8ddd\u67f1\u72b6 Image Empty \u8f6c\u6362\u4e3a\u5f84\u5411\u6df1\u5ea6\u8868\u9762\uff0c\u63d0\u4ea4\u524d\u88c1\u526a\u51fa\u6700\u5927\u5c45\u4e2d 2:1 \u533a\u57df\u3002operators.py \u63d0\u4ea4\u4efb\u52a1\uff0cobject.py \u5bfc\u5165\u5bf9\u8c61\uff0c__init__.py \u6c47\u603b\u5bfc\u51fa\u4e0e\u6ce8\u518c\u6e05\u5355\u3002
flowchart TD\n A[\u51c6\u5907\u989c\u8272\u4e0e\u5206\u6790\u56fe] --> B[generate-panorama-geometry]\n B --> C[\u91c7\u6837 12 \u4e2a\u900f\u89c6\u89c6\u56fe\u5e76\u63a8\u7406]\n C --> D[\u878d\u5408\u5f84\u5411\u8ddd\u79bb\u4e0e\u6709\u6548\u6027]\n D --> E[\u5199\u51fa depth.exr \u4e0e depth.json]\n E --> F[\u521b\u5efa\u6750\u8d28\u4e0e O Image Depth Panorama]
\u4efb\u52a1\u4f7f\u7528 Preferences \u9009\u62e9\u7684\u51e0\u4f55\u6a21\u578b\u3002\u6e90\u989c\u8272\u7531 Blender \u4fa7\u4fdd\u5b58\uff0cServer \u7684 geometry/panorama.py \u8d1f\u8d23\u89c6\u56fe\u91c7\u6837\u4e0e\u8ddd\u79bb\u878d\u5408\uff0cjobs/panorama.py \u7f16\u6392\u63a8\u7406\u548c\u4ea7\u7269\u5199\u5165\u3002
"},{"location":"internals/operators/convert-to-plane/","title":"Plane \u8f6c\u6362","text":"operators/convert_to_plane/operators.py \u63d0\u4f9b ConvertToPlane\u3001ConvertToDepthPlane\u3001ConvertToReliefPlane \u4e0e GenerateDepthPlane\u3002object.py \u5bfc\u5165\u5bf9\u8c61\u548c\u6750\u8d28\uff0cimage_plane.py \u6784\u5efa\u57fa\u7840\u77e9\u5f62\u7f51\u683c\uff0c__init__.py \u6c47\u603b\u5bfc\u51fa\u4e0e\u6ce8\u518c\u6e05\u5355\u3002
flowchart TD\n A[Image Empty] --> B[\u51c6\u5907\u6750\u8d28\u989c\u8272]\n B --> C{\u8f6c\u6362\u7c7b\u578b}\n C -- Plane --> D[\u56db\u8fb9\u5f62\u4e0e O Image Plane]\n C -- Depth \u6216 Relief --> E[\u9759\u6001\u56fe\u63d0\u4ea4\u51e0\u4f55 Job]\n E --> F[\u52a0\u8f7d\u6df1\u5ea6\u3001\u5143\u6570\u636e\u4e0e\u6cd5\u7ebf]\n F --> G[\u5bf9\u5e94\u8282\u70b9\u4fee\u6539\u5668\u4e0e\u6750\u8d28]\n D --> H[\u521b\u5efa\u5bf9\u8c61\u5e76\u66ff\u6362\u6e90 Empty]\n G --> H
\u4e09\u79cd\u8f6c\u6362\u90fd\u53ea\u63a5\u53d7\u9759\u6001\u56fe\u7247\u3002\u57fa\u7840\u7f51\u683c\u4ee5\u5c40\u90e8\u4e2d\u5fc3\u4e3a\u539f\u70b9\uff0c\u5bf9\u8c61\u77e9\u9635\u8865\u507f\u6e90 Empty \u7684\u663e\u793a\u8303\u56f4\u3002
Depth \u4e0e Relief \u4ece Preferences \u8bfb\u53d6\u51e0\u4f55\u6a21\u578b\u3001\u5206\u8fa8\u7387\u7ea7\u522b\u548c AI \u8f93\u5165\u4e0a\u9650\u3002create_depth_plane_from_result() \u5bfc\u5165\u4ea7\u7269\u5e76\u521b\u5efa\u4fee\u6539\u5668\u3002O Image Depth Plane \u4f7f\u7528\u76f8\u673a XYZ \u4e0e\u5bf9\u8c61\u7a7a\u95f4\u6cd5\u7ebf\u6784\u5efa\u6df1\u5ea6\u8868\u9762\uff1bO Image Relief Plane \u4f7f\u7528\u6df1\u5ea6 Z \u4e0e\u5207\u7ebf\u7a7a\u95f4\u6cd5\u7ebf\u6784\u5efa\u6d6e\u96d5\u3002
\u8282\u70b9\u6784\u5efa\u89c1\u8282\u70b9\u8d44\u4ea7\uff0c\u6587\u4ef6\u534f\u8bae\u89c1Job \u4ea7\u7269\u3002
"},{"location":"internals/operators/cutout-tool/","title":"Cutout","text":"Cutout \u5728\u9759\u6001 Image Empty \u4e0a\u5708\u5b9a Selection\uff0c\u6309\u8f6e\u5ed3\u521b\u5efa Flat\u3001Solid\u3001Depth Symmetry \u6216 Depth Solid\u3002\u5165\u53e3\u4f4d\u4e8e operators/cutout_tool/operators.py\uff0cShape \u83dc\u5355\u4f4d\u4e8e interaction.py\uff0c\u9884\u8bbe\u6807\u8bc6\u4e0e\u8282\u70b9\u7ec4\u5bf9\u5e94\u5173\u7cfb\u4f4d\u4e8e shape.py\u3002
flowchart TD\n A[Lasso \u6216 Polyline \u63d0\u4ea4 SelectionPath] --> B[\u9009\u62e9 Shape]\n B --> C[\u6805\u683c\u5316 SelectionMask \u5e76\u8bfb\u53d6\u6e90 RGBA]\n C --> D{\u9700\u8981 Depth \u6216 Normal\uff1f}\n D -- \u662f --> E[\u51c6\u5907 bounds \u77e9\u5f62 RGBA]\n E --> F[generate-cutout-artifacts]\n F --> G[\u52a0\u8f7d Depth\u3001Metadata \u4e0e Normal]\n D -- \u5426 --> H[\u6e90 Alpha \u4e0e SelectionMask \u7ec4\u5408]\n G --> H\n H --> I[\u8fb9\u754c\u6620\u5c04\u3001\u8f6e\u5ed3\u63d0\u53d6\u4e0e\u8d28\u91cf\u4e09\u89d2\u5316]\n I --> J[BaseShape \u4e0e o_balloon]\n J --> K[\u521b\u5efa\u6750\u8d28\u3001\u5bf9\u8c61\u4e0e\u5bf9\u5e94\u8282\u70b9\u4fee\u6539\u5668]
\u9884\u8bbe \u8282\u70b9\u7ec4 AI \u4ea7\u7269 Flat O Image Cutout\uff0cThickness 0 \u53ef\u9009\u5207\u7ebf\u7a7a\u95f4\u6cd5\u7ebf Solid O Image Cutout\uff0cThickness 1 \u53ef\u9009\u5207\u7ebf\u7a7a\u95f4\u6cd5\u7ebf Depth Symmetry O Image Depth Cutout \u4e0e O Image Cutout Symmetry \u6df1\u5ea6\u4e0e\u5bf9\u8c61\u7a7a\u95f4\u6cd5\u7ebf Depth Solid O Image Depth Cutout \u6df1\u5ea6\u4e0e\u5bf9\u8c61\u7a7a\u95f4\u6cd5\u7ebf Flat \u4e0e Solid \u53ef\u4ee5\u4e0d\u5e26 AI \u4ea7\u7269\u751f\u6210\uff1bDepth \u9884\u8bbe\u548c Normal Map \u9700\u8981\u5c31\u7eea\u7684\u51e0\u4f55\u6a21\u578b\uff0cShape \u83dc\u5355\u6309\u8be5\u72b6\u6001\u63d0\u4f9b\u9009\u9879\u3002
"},{"location":"internals/operators/cutout-tool/#_1","title":"\u8f6e\u5ed3\u4e0e\u7f51\u683c","text":"geometry.py \u4ece\u5185\u5bb9 Alpha \u63d0\u53d6\u8fde\u901a\u8f6e\u5ed3\u4e0e\u5b54\u6d1e\uff0c\u6309 Edge Length \u751f\u6210 BaseShape\u3002Edge Length \u662f\u4e16\u754c\u7a7a\u95f4\u7684\u7f51\u683c\u76ee\u6807\u8fb9\u957f\uff0cMinimum Relative Edge Length \u4f1a\u6309\u5185\u5bb9\u8303\u56f4\u63d0\u9ad8\u5176\u4e0b\u754c\u3002
mesh.py \u8d1f\u8d23\u8f6e\u5ed3\u5206\u79bb\u3001\u5b54\u6d1e\u5904\u7406\u3001\u8d28\u91cf\u4e09\u89d2\u5316\u548c\u8fb9\u754c\u652f\u6491\uff0cpolygon.py \u63d0\u4f9b\u8f6e\u5ed3\u7b80\u5316\uff0ctangle.py \u662f\u968f\u5305\u5206\u53d1\u7684 Delaunay \u4e09\u89d2\u5316\u6838\u5fc3\u3002Fine Outline \u5c55\u5f00\u65f6\u4fdd\u7559\u5c0f\u5b54\u4e0e\u7ec6\u8282\u8f6e\u5ed3\uff0c\u5173\u95ed\u65f6\u586b\u6d1e\u5e76\u7b80\u5316\u3002
balloon.py \u8d1f\u8d23 Balloon Profile\uff0c\u6309 Preferences \u9009\u62e9 Poisson \u6216 Teddy\uff0c\u751f\u6210\u6240\u6709\u9884\u8bbe\u5171\u7528\u7684 POINT \u5c5e\u6027 o_balloon\u3002boundary_padding.py \u6309 Boundary Padding \u6cbf\u7ed3\u6784\u5185\u6cd5\u7ebf\u91cd\u91c7\u6837\u8f6e\u5ed3\u9644\u8fd1\u7684\u989c\u8272\u4e0e\u6df1\u5ea6\u3002
"},{"location":"internals/operators/cutout-tool/#ai","title":"AI \u4e0e\u5bf9\u8c61\u521b\u5efa","text":"Server \u63a5\u6536 Selection bounds \u5185\u4fdd\u7559\u6e90 Alpha \u7684 RGBA\uff0c\u4e00\u6b21 MoGe \u63a8\u7406\u6309 generate_depth \u4e0e normal_mode \u8fd4\u56de\u4ea7\u7269\u3002\u6df1\u5ea6\u53c2\u8003\u533a\u57df\u4f7f\u7528\u6240\u9009 Alpha Threshold\uff0cNormal \u4f7f\u7528\u539f\u9884\u6d4b\uff1bMaximum AI Input Size \u53ea\u5f71\u54cd\u5206\u6790\u5206\u8fa8\u7387\u3002
object.py \u7684 create_shape_object() \u6d88\u8d39 BaseShape\u3001Color\u3001Depth \u548c Normal\uff0c\u52a0\u8f7d\u5bf9\u5e94\u8282\u70b9\u7ec4\u3002\u57fa\u7840\u7f51\u683c\u4f4d\u4e8e\u5c40\u90e8 XZ \u5e73\u9762\uff0c\u539a\u5ea6\u6cbf Y \u5c55\u5f00\uff1b\u5bf9\u8c61\u77e9\u9635\u628a\u7f51\u683c\u653e\u5165 Image Empty \u7684\u56fe\u7247\u5e73\u9762\uff0cDepth Symmetry \u989d\u5916\u53e0\u52a0\u5bf9\u79f0\u8282\u70b9\u7ec4\u4e0e\u65b9\u5411\u53c2\u6570\u3002Object Normal \u968f\u65b9\u5411\u540c\u6b65\u8f6c\u6362\u3002
\u6750\u8d28\u4f7f\u7528 IOR 1.2\uff0c\u989c\u8272\u4e0e\u6cd5\u7ebf\u63a5\u5165 Image Layer\uff0c\u6cd5\u7ebf\u6309\u5207\u7ebf\u6216\u5bf9\u8c61\u7a7a\u95f4\u89e3\u91ca\u3002\u8282\u70b9\u8ba1\u7b97\u89c1\u8282\u70b9\u8d44\u4ea7\u3002
"},{"location":"internals/operators/frame/","title":"Frame \u591a\u56fe\u5408\u6210","text":"operators/frame_tool/operators.py \u5b9a\u4e49 FrameImages \u548c FrameTool\u3002projection.py \u8d1f\u8d23\u89c6\u56fe\u6295\u5f71\u3001\u4ea4\u53e0\u548c\u7ed3\u679c\u5e73\u9762\u5b9a\u4f4d\uff0ccompositing.py \u8d1f\u8d23\u50cf\u7d20\u6df1\u5ea6\u6392\u5e8f\u4e0e\u8fb9\u754c\u8986\u76d6\u91c7\u6837\uff0c__init__.py \u5bfc\u51fa\u7c7b\u578b\u53ca\u6ce8\u518c\u6e05\u5355\u3002Frame \u5c06\u9009\u4e2d\u7684\u9759\u6001 Image Empty \u6309\u5f53\u524d\u89c6\u56fe\u5408\u6210\u4e3a\u4e00\u5f20\u56fe\u7247\u3002
flowchart TD\n A[\u62d6\u51fa\u5c4f\u5e55\u77e9\u5f62] --> B[\u51bb\u7ed3\u89c6\u56fe\u77e9\u9635\u5e76\u6536\u96c6\u9009\u4e2d\u9759\u6001\u56fe\u7247]\n B --> C[\u68c0\u67e5\u77e9\u5f62\u4e0e active \u56fe\u7247\u7684\u6709\u6548\u6295\u5c04\u4ea4\u96c6]\n C --> D[\u6309 Region \u4e0e Maximum Frame Resolution \u8ba1\u7b97\u8f93\u51fa\u5c3a\u5bf8]\n D --> E[\u89c2\u5bdf\u5c04\u7ebf\u6295\u5f71\u5230\u5404\u56fe\u7247\u5e73\u9762]\n E --> F[\u6309\u6837\u672c\u6df1\u5ea6\u4ece\u8fdc\u5230\u8fd1\u5408\u6210\uff0c\u7b49\u6df1\u5ea6 active \u4f18\u5148]\n F --> G[\u8fb9\u754c\u8986\u76d6\u91c7\u6837\u4e0e\u72ec\u7acb Alpha]\n G --> H[\u521b\u5efa Packed Image \u5e76\u590d\u7528 active Object]\n H --> I[\u5220\u9664\u5176\u4ed6\u53c2\u4e0e\u56fe\u7247\u5bf9\u8c61\u5e76\u63d0\u4ea4 Undo]
\u6b63\u4ea4\u89c6\u56fe\u63a5\u53d7\u6709\u9650\u6df1\u5ea6\uff0c\u900f\u89c6\u89c6\u56fe\u91c7\u6837\u89c2\u5bdf\u65b9\u5411\u524d\u65b9\u7684\u4ea4\u70b9\u3002\u4ea4\u53e0\u68c0\u67e5\u91c7\u7528\u8fde\u7eed\u6295\u5f71\u8303\u56f4\uff1b\u8f93\u51fa\u5c3a\u5bf8\u53d7 Region\u3001\u6700\u957f\u8fb9\u4e0a\u9650\u548c\u603b\u50cf\u7d20\u4e0a\u9650\u7ea6\u675f\u3002
RGB \u4e0e Alpha \u5206\u522b\u7d2f\u8ba1\uff0c\u4fdd\u7559\u88ab Mask \u9690\u85cf\u7684\u6709\u6548\u989c\u8272\u3002\u8fb9\u754c\u4f7f\u7528\u8986\u76d6\u91c7\u6837\uff0c\u5185\u90e8\u590d\u7528\u76f4\u63a5\u91c7\u6837\uff0c\u907f\u514d\u9ed1\u8fb9\u548c\u4e0d\u5fc5\u8981\u7684\u6a21\u7cca\u3002\u7ed3\u679c\u5e73\u9762\u671d\u5411\u89c2\u5bdf\u8005\uff0c\u4f4d\u7f6e\u7531 active \u56fe\u7247\u7684\u6709\u6548\u6df1\u5ea6\u786e\u5b9a\u3002
Frame \u4fdd\u7559 active \u5bf9\u8c61\u8eab\u4efd\u3001\u540d\u79f0\u548c Collection\uff1b\u56fe\u50cf\u66ff\u6362\u590d\u7528 Common \u7684\u5171\u4eab\u6570\u636e\u4e0e\u5931\u8d25\u6062\u590d\u903b\u8f91\u3002
"},{"location":"internals/operators/mask/","title":"Mask Alpha \u7f16\u8f91","text":"operators/mask_tool.py \u5b9a\u4e49 EditImageAlpha \u548c MaskTool\uff0c\u4f7f\u7528 common/viewport.py \u7684 ImageGesture \u7ba1\u7406 Lasso\u3001Brush \u4e0e Polyline\u3002
flowchart TD\n A[\u51bb\u7ed3 Scene \u7684 Gesture\u3001Mode\u3001Radius] --> B[\u5c4f\u5e55\u624b\u52bf\u4e0e Overlay]\n B --> C[\u5b8c\u6210\u540e\u6295\u5f71\u5e76\u751f\u6210\u8986\u76d6 M]\n C --> D[\u8bfb\u53d6\u6e90 RGBA]\n D --> E[\u6309\u6a21\u5f0f\u8ba1\u7b97 Alpha]\n E --> F[\u4fdd\u7559 RGB \u548c\u6e90\u753b\u5e03\u5c3a\u5bf8]\n F --> G[\u66ff\u6362 Packed Image \u5e76\u63d0\u4ea4\u4e00\u4e2a Undo]
\u6a21\u5f0f \u6e90 Alpha A \u4e0e\u8986\u76d6 M \u7684\u7ed3\u679c Set A \u00d7 M Extend max(A, M) Subtract A \u00d7 (1 \u2212 M) Brush \u62d6\u52a8\u65f6\u7ef4\u62a4\u7b80\u5316\u5c4f\u5e55\u8def\u5f84\u3001\u5706\u5f62\u5370\u8bb0\u4e0e\u8fde\u63a5\u6761\u7684\u5e76\u96c6\u9884\u89c8\uff1b\u91ca\u653e\u65f6\u4e00\u6b21\u751f\u6210\u56fe\u7247\u8986\u76d6\u3002Polyline \u4f7f\u7528\u9010\u70b9\u8def\u5f84\uff0c\u81f3\u5c11\u4e09\u4e2a\u70b9\u540e\u901a\u8fc7\u95ed\u5408\u5708\u3001\u53cc\u51fb\u6216 Enter \u5b8c\u6210\uff0cBackspace \u5220\u9664\u672b\u70b9\u3002
\u7ed3\u679c\u4fdd\u7559 Empty \u7684\u8eab\u4efd\u3001\u77e9\u9635\u3001\u663e\u793a\u5c3a\u5bf8\u548c\u504f\u79fb\u3002\u5168\u900f\u660e\u7ed3\u679c\u6709\u6548\uff0c\u53d6\u6d88\u6216\u5207\u6362\u5de5\u5177\u6e05\u7406\u672a\u63d0\u4ea4\u7684 Overlay\uff1b\u5171\u4eab Image \u901a\u8fc7\u7edf\u4e00\u66ff\u6362\u5165\u53e3\u5206\u6d41\u3002
"},{"location":"internals/operators/rectify/","title":"Rectify \u900f\u89c6\u6821\u6b63","text":"operators/rectify_tool/operators.py \u5b9a\u4e49 RectifyImagePerspective \u4e0e RectifyTool\uff0c\u5c06\u56fe\u7247\u5185\u7684\u56db\u89d2\u533a\u57df\u6821\u6b63\u4e3a\u77e9\u5f62\u3002geometry.py \u8d1f\u8d23\u56db\u89d2\u9a8c\u8bc1\u4e0e\u50cf\u7d20\u6821\u6b63\uff0cpreview.py \u8d1f\u8d23\u9884\u89c8\u56fe\u3001Overlay \u548c\u5bbd\u9ad8\u6bd4\u63a7\u5236\uff0c__init__.py \u5bfc\u51fa\u7c7b\u578b\u53ca\u6ce8\u518c\u6e05\u5355\u3002
flowchart TD\n A[\u70b9\u9009\u56db\u89d2] --> B[\u89c4\u8303\u4e3a\u51f8 Quad \u5e76\u68c0\u67e5\u56fe\u7247\u4ea4\u53e0]\n B --> C[512\u00d7512 \u9884\u89c8\u4e0e\u5bbd\u9ad8\u6bd4\u8c03\u6574]\n C --> D[\u6309\u50cf\u7d20\u5bc6\u5ea6\u548c\u8f93\u51fa\u4e0a\u9650\u786e\u5b9a\u5c3a\u5bf8]\n D --> E[\u5206\u5757 Homography \u4e0e\u9884\u4e58 Alpha \u63d2\u503c]\n E --> F[\u6309\u53ef\u89c1 Alpha \u88c1\u526a]\n F --> G[\u6620\u5c04 placement bounds \u5e76\u66ff\u6362 Packed Image]
\u56db\u89d2\u5141\u8bb8\u4efb\u610f\u70b9\u51fb\u987a\u5e8f\uff0c\u9000\u5316\u6216\u975e\u51f8\u8f93\u5165\u5728\u63d0\u4ea4\u524d\u6821\u9a8c\u3002\u9884\u89c8\u6839\u636e\u6e90\u989c\u8272\u7a7a\u95f4\u914d\u7f6e\u663e\u793a\uff0c\u50cf\u7d20\u91cd\u91c7\u6837\u590d\u7528 common/image.py\u3002\u8f93\u51fa\u6700\u957f\u8fb9\u4e0a\u9650 8192\uff0c\u603b\u50cf\u7d20\u4e0a\u9650 16,777,216\u3002
replace_empty_image() \u6839\u636e\u6821\u6b63\u533a\u57df\u7684 placement bounds \u8c03\u6574\u753b\u6846\uff0c\u4fdd\u7559\u6e90 Image \u540d\u79f0\u3001\u5bf9\u8c61\u8eab\u4efd\u548c\u5171\u4eab\u5f15\u7528\u8bed\u4e49\u3002
"},{"location":"internals/operators/remove-background/","title":"Remove Background","text":"operators/remove_background.py \u4ece Image Empty \u6216\u5f53\u524d Shader Image Texture \u51c6\u5907\u8f93\u5165\u3002RemoveImageBackground \u534f\u8c03\u8bbe\u7f6e\u4e0e\u8f93\u5165\uff0cRunBackgroundRemoval \u63d0\u4ea4 Job \u5e76\u5e94\u7528\u7ed3\u679c\u3002
flowchart TD\n A[ImageEditTarget \u53d6\u5f97\u7f16\u8f91\u76ee\u6807] --> B[\u51c6\u5907\u56fe\u50cf\u8f93\u5165]\n B --> C[remove-background Job]\n C --> D[\u6240\u9009\u80cc\u666f\u6a21\u578b\u751f\u6210\u524d\u666f Alpha]\n D --> E{\u8f93\u5165\u7c7b\u578b}\n E -- \u666e\u901a\u56fe\u7247 --> F[\u900f\u660e PNG \u524d\u666f]\n E -- HDR --> G[alpha.npy]\n F --> H[\u5e94\u7528\u7ed3\u679c\u4e0e Undo]\n G --> H
server/jobs/remove_background.py \u8bfb\u53d6\u5355\u5f20\u8f93\u5165\u5e76\u8c03\u7528 server/models/background.py\uff0c\u652f\u6301 BiRefNet \u548c BEN2\u3002\u6a21\u578b\u524d\u666f Alpha \u4e0e\u6e90 Alpha \u5408\u6210\u3002
\u666e\u901a\u7ed3\u679c\u901a\u8fc7 ImageEditTarget \u4fdd\u7559\u5171\u4eab\u56fe\u50cf\u5f15\u7528\u4e0e\u5e27\u8bbe\u7f6e\u3002HDR \u4f7f\u7528 common/hdr_image.py \u7684 HdrBackgroundInput \u51c6\u5907\u5206\u6790\u8f93\u5165\uff0c\u5e76\u5c06\u8fd4\u56de Alpha \u5e94\u7528\u4e8e\u539f\u6d6e\u70b9 RGB\u3002Operator \u8d1f\u8d23\u4e34\u65f6\u8f93\u5165\u6e05\u7406\u3002
"},{"location":"internals/operators/upscale/","title":"Upscale","text":"operators/upscale.py \u4ece Image Empty \u6216\u5f53\u524d Shader Image Texture \u751f\u6210 2\u00d7 \u7ed3\u679c\uff0c\u6e90\u56fe\u957f\u8fb9\u5fc5\u987b\u5c0f\u4e8e Maximum AI Input Size\u3002
flowchart TD\n A[\u68c0\u67e5\u6e90\u56fe\u5c3a\u5bf8\u5e76\u51bb\u7ed3\u6a21\u578b\u8bbe\u7f6e] --> B[\u51c6\u5907\u56fe\u7247\u8f93\u5165]\n B --> C[upscale-image \u5355\u5f20\u5904\u7406]\n C --> D[\u5206\u5757\u6267\u884c 4\u00d7 RGB \u63a8\u7406]\n D --> E[\u7edf\u4e00\u7f29\u653e\u4e3a\u6e90\u56fe 2\u00d7]\n E --> F[\u539f Alpha \u72ec\u7acb Lanczos \u7f29\u653e]\n F --> G[ImageEditTarget \u5e94\u7528\u7ed3\u679c\u5e76\u63d0\u4ea4 Undo]
server/models/upscale.py \u5904\u7406\u8f93\u5165\u4e0a\u9650\u548c\u6700\u7ec8\u5c3a\u5bf8\uff0connx_upscale.py \u6267\u884c Real-ESRGAN \u4e0e HAT \u6a21\u578b\u3002ModelManager \u7ba1\u7406 Session\uff1bProvider \u8d44\u6e90\u9519\u8bef\u4f1a\u91ca\u653e\u5f53\u524d Session \u5e76\u8fd4\u56de\u5904\u7406\u5efa\u8bae\u3002
"}]}
\ No newline at end of file
+{"config":{"lang":["en","zh"],"separator":"[\\s\\u200b\\u3000\\-\u3001\u3002\uff0c\uff0e\uff1f\uff01\uff1b]+","pipeline":["stemmer"],"fields":{"title":{"boost":1000.0},"text":{"boost":1.0},"tags":{"boost":1000000.0}}},"docs":[{"location":"","title":"\ud83d\uddbc\ufe0f AnyImage","text":""},{"location":"#image-is-all-you-need","title":"IMAGE is All You Need","text":"AnyImage \u662f OmooLab \u4e3a Blender \u51c6\u5907\u7684\u56fe\u7247\u5de5\u5177\u3002\u5b83\u8ba9\u56fe\u7247\u4e0d\u518d\u53ea\u662f\u53c2\u8003\u56fe\uff1a\u7c98\u8d34\u8fdb\u6765\uff0c\u9009\u51fa\u9700\u8981\u7684\u90e8\u5206\uff0c\u518d\u628a\u5b83\u53d8\u6210\u5e26\u6750\u8d28\u3001\u8f6e\u5ed3\u4e0e\u6df1\u5ea6\u7684\u573a\u666f\u5143\u7d20\u3002
"},{"location":"#_1","title":"\u4ece\u56fe\u7247\u76f4\u63a5\u5f00\u59cb","text":"\u5728 3D View \u6216 Node Editor \u4e2d\u6309 Ctrl+Shift+V\uff08macOS \u4e3a Cmd+Shift+V\uff09\uff0c\u526a\u8d34\u677f\u91cc\u7684\u56fe\u7247\u4f1a\u76f4\u63a5\u8fdb\u5165\u5f53\u524d\u5de5\u4f5c\u533a\u3002\u4e0d\u5fc5\u5148\u4fdd\u5b58\u6587\u4ef6\uff0c\u4e5f\u4e0d\u7528\u4e2d\u65ad\u6b63\u5728\u8fdb\u884c\u7684\u642d\u5efa\u3002
\u5df2\u6709\u56fe\u7247\u540c\u6837\u53ef\u4ee5\u7ee7\u7eed\u4f7f\u7528\u3002\u9009\u4e2d Image Empty \u540e\uff0c\u53f3\u952e\u6253\u5f00 AnyImage \u83dc\u5355\uff0c\u5e38\u7528\u64cd\u4f5c\u90fd\u5728\u8fd9\u91cc\u3002
"},{"location":"#_2","title":"\u4e00\u5f20\u56fe\uff0c\u591a\u79cd\u7a7a\u95f4\u8868\u8fbe","text":" - Plane / Depth Plane\uff1a\u628a\u56fe\u7247\u53d8\u6210\u5e73\u9762\u6216\u7acb\u4f53\u9762\u7247\u3002
- Cutout\uff1a\u5708\u9009\u4e3b\u4f53\uff0c\u521b\u5efa Surface\u3001Balloon \u6216 Depth Shape\u3002
- \u56fe\u7247\u5de5\u5177\uff1a\u91cd\u65b0\u53d6\u666f\u3001\u7f16\u8f91\u900f\u660e\u533a\u57df\u3001\u6821\u6b63\u900f\u89c6\u3001\u53bb\u80cc\u666f\u548c\u9ad8\u6e05\u653e\u5927\u3002
"},{"location":"#_3","title":"\u5feb\u901f\u5f00\u59cb","text":"\u6309\u4f4f\u4e0b\u65b9\u6309\u94ae\u5e76\u62d6\u5230 Blender \u7a97\u53e3\u5373\u53ef\u5b89\u88c5\u3002\u9996\u6b21\u62d6\u5165\u4f1a\u63d0\u793a\u6dfb\u52a0 AnyImage \u6269\u5c55\u4ed3\u5e93\uff0c\u786e\u8ba4\u540e\u518d\u62d6\u5165\u4e00\u6b21\u3002
\u62d6\u5165 Blender \u5b89\u88c5 Windows \u2013 78.3\u00a0MB \u2026\u6216\u4e0b\u8f7d\u540e\u901a\u8fc7 Install from Disk \u5b89\u88c5 \u62d6\u5165 Blender \u5b89\u88c5 macOS - Apple Silicon \u2013 57.5\u00a0MB \u2026\u6216\u4e0b\u8f7d\u540e\u901a\u8fc7 Install from Disk \u5b89\u88c5 \u62d6\u5165 Blender \u5b89\u88c5 Linux \u2013 71.0\u00a0MB \u2026\u6216\u4e0b\u8f7d\u540e\u901a\u8fc7 Install from Disk \u5b89\u88c5"},{"location":"getting-started/installation/","title":"\u5b89\u88c5\u4e0e\u9996\u6b21\u914d\u7f6e","text":"\u9875\u9762\u4f1a\u6309\u5f53\u524d\u7cfb\u7edf\u663e\u793a\u5bf9\u5e94\u7684\u5b89\u88c5\u5305\uff0c\u6309\u4f4f\u6309\u94ae\u62d6\u5230 Blender \u7a97\u53e3\u4efb\u610f\u4f4d\u7f6e\u5373\u53ef\u5b89\u88c5\u3002\u9996\u6b21\u62d6\u5165\u4f1a\u63d0\u793a\u6dfb\u52a0 AnyImage \u6269\u5c55\u4ed3\u5e93\uff0c\u786e\u8ba4\u540e\u91cd\u65b0\u62d6\u5165\u4e00\u6b21\uff0c\u4e4b\u540e\u5347\u7ea7\u540c\u6837\u76f4\u63a5\u62d6\u5165\u3002
\u62d6\u5165 Blender \u5b89\u88c5 Windows \u2013 78.3\u00a0MB \u2026\u6216\u4e0b\u8f7d\u540e\u901a\u8fc7 Install from Disk \u5b89\u88c5 \u62d6\u5165 Blender \u5b89\u88c5 macOS - Apple Silicon \u2013 57.5\u00a0MB \u2026\u6216\u4e0b\u8f7d\u540e\u901a\u8fc7 Install from Disk \u5b89\u88c5 \u62d6\u5165 Blender \u5b89\u88c5 Linux \u2013 71.0\u00a0MB \u2026\u6216\u4e0b\u8f7d\u540e\u901a\u8fc7 Install from Disk \u5b89\u88c5"},{"location":"getting-started/installation/#_2","title":"\u68c0\u67e5\u6269\u5c55\u504f\u597d\u8bbe\u7f6e","text":"AnyImage \u7684\u6269\u5c55\u504f\u597d\u8bbe\u7f6e\u6309\u529f\u80fd\u5206\u7ec4\u3002Environment \u533a\u5305\u542b\uff1a
- Storage Root\uff1a\u4fdd\u5b58\u8fd0\u884c\u73af\u5883\u3001\u6a21\u578b\u548c\u4efb\u52a1\u6587\u4ef6\u7684\u4f4d\u7f6e\u3002\u9ed8\u8ba4\u662f\u7528\u6237\u76ee\u5f55\u4e0b\u7684
.anyimage\uff0c\u4e00\u822c\u65e0\u9700\u4fee\u6539\u3002 - Device\uff1a\u6b63\u5f0f\u8f6c\u6362\u4efb\u52a1\u4f7f\u7528\u7684\u8ba1\u7b97\u8bbe\u5907\u3002Apple Silicon Mac \u9ed8\u8ba4\u4f7f\u7528 CPU\uff0cWindows \u9ed8\u8ba4\u4f7f\u7528 DirectML\uff1b\u4e5f\u53ef\u624b\u52a8\u9009\u62e9\u5176\u4ed6\u53ef\u7528\u8bbe\u5907\u3002
macOS arm64 \u63d0\u4f9b CPU \u4e0e CoreML\u3002CoreML \u7531\u7cfb\u7edf\u5728 Apple CPU\u3001GPU \u4e0e Neural Engine \u4e4b\u95f4\u8c03\u5ea6\uff0c\u4e0d\u662f PyTorch MPS backend\uff0c\u4e5f\u4e0d\u8868\u793a\u53ea\u4f7f\u7528 GPU\uff1b\u5b83\u7684\u5b9e\u9645\u901f\u5ea6\u53d6\u51b3\u4e8e\u6a21\u578b\u3002
Environment \u68c0\u6d4b\u540e\u663e\u793a Diagnostics\u3002Depth & Normal\u3001Remove Background\u3001Upscale \u4e0e Cutout \u662f\u9ed8\u8ba4\u5c55\u5f00\u7684\u53ef\u6298\u53e0\u529f\u80fd\u533a\uff0c\u5404\u81ea\u5305\u542b\u5bf9\u5e94\u8bbe\u7f6e\u548c\u6a21\u578b\u72b6\u6001\u3002\u5176\u4e2d\uff1a
- Default Upscale Model\uff1aUpscale \u4f7f\u7528\u7684\u6a21\u578b\uff0c\u9ed8\u8ba4\u662f General WDN x4v3\u3002
- Maximum AI Input Size\uff1aUpscale\u3001Depth \u4e0e Normal Map \u7684 AI \u8f93\u5165\u957f\u8fb9\u4e0a\u9650\uff0c\u9ed8\u8ba4 2048 px\uff1b\u989c\u8272\u8d34\u56fe\u4fdd\u7559\u539f\u59cb\u5206\u8fa8\u7387\u3002
- Maximum Cutout Mesh Resolution\uff1a\u6240\u6709 Cutout Shape \u7684\u7f51\u683c\u91c7\u6837\u957f\u8fb9\u4e0a\u9650\uff0c\u9ed8\u8ba4 1024\uff0c\u72ec\u7acb\u4e8e AI \u8f93\u5165\u5c3a\u5bf8\u3002
Depth & Normal \u63d0\u4f9b\u4e09\u6863 MoGe-2\uff0cDepth Plane \u4e0e Cutout Depth / Normal Map \u5171\u7528\u5f53\u524d\u9009\u62e9\u3002\u53ef\u9009\u6a21\u578b\u7684 Ready \u72b6\u6001\u6216 Download \u6309\u94ae\u4f4d\u4e8e\u9009\u62e9\u9879\u4e0b\u65b9\uff1bCutout \u533a\u63d0\u4f9b\u72ec\u7acb\u7f51\u683c\u4e0a\u9650\u4e0e Balloon Profile\u3002
\u5982\u679c\u51c6\u5907\u628a Storage Root \u653e\u5230\u5176\u4ed6\u78c1\u76d8\uff0c\u5efa\u8bae\u5728\u9996\u6b21\u5b89\u88c5 Environment \u4e4b\u524d\u4fee\u6539\u3002\u66f4\u6362\u76ee\u5f55\u540e\uff0c\u65e7\u76ee\u5f55\u4e2d\u7684\u73af\u5883\u548c\u6a21\u578b\u4e0d\u4f1a\u81ea\u52a8\u79fb\u52a8\u3002
"},{"location":"getting-started/installation/#ai-environment","title":"\u914d\u7f6e AI Environment","text":"\u9009\u4e2d Image Empty\uff0c\u5728\u53f3\u952e AnyImage \u5b50\u83dc\u5355\u4e2d\u70b9\u51fb Set Up AI Environment\u2026\uff1b\u4e5f\u53ef\u4ee5\u5728 AnyImage \u6269\u5c55\u504f\u597d\u8bbe\u7f6e\u4e2d\u70b9\u51fb\u540c\u540d\u6309\u94ae\u3002
\u786e\u8ba4\u5b89\u88c5\u524d\uff0c\u5bf9\u8bdd\u6846\u4f1a\u8bf4\u660e\u4ee5\u4e0b\u5185\u5bb9\uff1a
- \u5b89\u88c5\u72ec\u7acb Python\u3001ONNX Runtime \u4e0e\u652f\u6301\u5305\uff0c\u5e76\u4e0b\u8f7d MoGe-2 ViT-S Normal\u3001BEN2 Base \u548c Real-ESRGAN General WDN x4v3\u3002
- \u9ed8\u8ba4\u6a21\u578b\u5408\u8ba1\u7ea6 360 MB\uff1b\u8fde\u540c Environment \u9884\u8ba1\u9700\u8981\u7ea6 600 MB \u4e0b\u8f7d\u91cf\u548c\u7ea6 1 GB \u78c1\u76d8\u7a7a\u95f4\u3002
- \u6839\u636e\u7f51\u7edc\u901f\u5ea6\uff0c\u9996\u6b21\u5b89\u88c5\u901a\u5e38\u9700\u8981 5\u201320 \u5206\u949f\u3002
- Use Mirror \u53ea\u8ba9 uv\u3001Python \u548c Python \u5305\u4f7f\u7528\u56fd\u5185\u955c\u50cf\uff1b\u6a21\u578b\u4e0b\u8f7d\u6e90\u4fdd\u6301\u4e0d\u53d8\u3002
\u5b89\u88c5\u8fc7\u7a0b\u4e2d\u8bf7\u4fdd\u6301 Blender \u6253\u5f00\u3002\u72b6\u6001\u680f\u4f1a\u663e\u793a\u5f53\u524d\u9636\u6bb5\u3001\u8fdb\u5ea6\u548c\u4e0b\u8f7d\u901f\u5ea6\u3002
\u5982\u679c Environment \u5df2\u5b89\u88c5\u4f46\u4efb\u4e00\u9ed8\u8ba4\u6a21\u578b\u7f3a\u5931\uff0c\u5165\u53e3\u4f1a\u6539\u4e3a Download Required Models\u2026\uff1b\u5bf9\u8bdd\u6846\u5217\u51fa\u7f3a\u5931\u6a21\u578b\u548c\u4e0b\u8f7d\u4f53\u79ef\uff0c\u786e\u8ba4\u540e\u53ea\u4e0b\u8f7d\u7f3a\u5931\u6a21\u578b\uff0c\u4e0d\u4f1a\u91cd\u88c5 Environment \u6216\u91cd\u590d\u4e0b\u8f7d\u5df2\u5c31\u7eea\u5185\u5bb9\u3002
"},{"location":"getting-started/installation/#_3","title":"\u786e\u8ba4\u5b89\u88c5\u5b8c\u6210","text":"\u5b8c\u6210\u540e\u53ef\u4ee5\u7528\u4ee5\u4e0b\u65b9\u5f0f\u786e\u8ba4\uff1a
- AnyImage \u6269\u5c55\u504f\u597d\u8bbe\u7f6e\u4e2d\u7684 MoGe-2 ViT-S Normal\u3001BEN2 Base \u548c Real-ESRGAN General WDN x4v3 \u663e\u793a Ready\u3002
- \u9009\u4e2d Image Empty \u540e\uff0c\u53f3\u952e\u83dc\u5355\u5e95\u90e8\u663e\u793a AI Environment Settings\u2026\u3002
\u70b9\u51fb Convert to Depth Plane\u3001Remove Background \u6216 Upscale \u65f6\uff0cAnyImage \u4f1a\u6839\u636e\u72b6\u6001\u8fdb\u5165 Set Up AI Environment\u2026 \u6216 Download Required Models\u2026\u3002\u666e\u901a Plane\u3001Image \u7f16\u8f91\u548c\u57fa\u7840 Cutout Surface / Balloon \u76f4\u63a5\u5728 Blender \u4e2d\u6267\u884c\u3002
"},{"location":"getting-started/installation/#_4","title":"\u4e0b\u4e00\u6b65","text":"\u7ee7\u7eed\u9605\u8bfb\u4e94\u5206\u949f\u4e0a\u624b\uff0c\u7528\u4e00\u5f20\u56fe\u7247\u5b8c\u6210\u7b2c\u4e00\u6b21\u8f6c\u6362\u3002
"},{"location":"internals/","title":"\u5185\u90e8\u5b9e\u73b0\u603b\u89c8","text":"AnyImage \u5728 Blender \u4e3b\u7ebf\u7a0b\u5904\u7406\u4ea4\u4e92\u3001\u50cf\u7d20\u7f16\u8f91\u548c\u6570\u636e\u521b\u5efa\uff0c\u901a\u8fc7 BlendJob \u628a\u6a21\u578b\u63a8\u7406\u4ea4\u7ed9\u72ec\u7acb Job Server\u3002
\u4e3b\u9898 \u5bf9\u5e94\u804c\u8d23 \u7a0b\u5e8f\u67b6\u6784 \u8fdb\u7a0b\u3001\u6ce8\u518c\u3001\u914d\u7f6e\u4e0e\u4e3b\u7ebf\u7a0b\u8fb9\u754c Common Blender \u4fa7\u56fe\u50cf\u3001\u624b\u52bf\u3001\u51e0\u4f55\u4e0e AI \u516c\u5171\u80fd\u529b Runtime \u4e0e Server Environment\u3001Job\u3001\u6a21\u578b\u4e0b\u8f7d\u4e0e Session \u751f\u547d\u5468\u671f Job \u4ea7\u7269 \u6587\u4ef6\u534f\u8bae\u3001\u76f8\u673a\u5750\u6807\u548c Blender \u6d88\u8d39\u65b9\u5f0f Operator \u7d22\u5f15 \u6309\u5b9e\u9645\u7528\u6237\u529f\u80fd\u67e5\u627e\u5b9e\u73b0 \u8282\u70b9\u8d44\u4ea7 \u8d44\u4ea7\u3001\u6e90\u7801\u804c\u8d23\u3001\u6784\u5efa\u548c\u9a8c\u8bc1 \u5f00\u53d1\u4e0e\u53d1\u5e03 \u6d4b\u8bd5\u7ec4\u7ec7\u3001\u5de5\u5177\u547d\u4ee4\u4e0e\u53d1\u5e03\u6d41\u7a0b \u6e90\u7801\u4f4d\u4e8e src/anyimage/\uff0c\u5f00\u53d1\u5de5\u5177\u4f4d\u4e8e tools/\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u4f4d\u4e8e tests/\u3002\u6269\u5c55\u7ea7\u8bbe\u7f6e\u7531 preferences.py \u5b9a\u4e49\uff0c\u8fd0\u884c\u65f6\u8d44\u6e90\u7531 runtime.py \u63a5\u5165 BlendJob\u3002
"},{"location":"internals/architecture/","title":"\u7a0b\u5e8f\u67b6\u6784","text":"\u6a21\u5757 \u804c\u8d23 __init__.py \u6ce8\u518c\u7c7b\u578b\u3001\u5de5\u5177\u3001\u83dc\u5355\u3001\u5feb\u6377\u952e\u4e0e Runtime menu.py\u3001panel.py Image Empty \u4e0e Shader Image Texture \u4e0a\u4e0b\u6587\u83dc\u5355\u4e0e Job Server \u9762\u677f preferences.py \u6269\u5c55\u8bbe\u7f6e\u53ca\u8bfb\u53d6\u5165\u53e3 properties.py Scene \u624b\u52bf\u72b6\u6001\u3001\u6a21\u578b\u72b6\u6001\u67e5\u8be2\u3001\u679a\u4e3e\u4e0e Operator \u5c5e\u6027\u6784\u9020 tools.py 3D View WorkspaceTool \u58f0\u660e\u3001\u987a\u5e8f\u4e0e\u6ce8\u518c keymaps.py \u6269\u5c55\u5feb\u6377\u952e\u7684\u6ce8\u518c\u4e0e\u6e05\u7406 common/ Blender \u4fa7\u516c\u5171\u80fd\u529b operators/ \u4ea4\u4e92\u3001\u4efb\u52a1\u53c2\u6570\u3001\u7ed3\u679c\u5bfc\u5165\u548c Undo server/ \u72ec\u7acb\u73af\u5883\u5185\u7684\u5a92\u4f53\u5904\u7406\u3001\u63a8\u7406\u548c\u4ea7\u7269\u5199\u51fa"},{"location":"internals/architecture/#_2","title":"\u6ce8\u518c\u4e0e\u914d\u7f6e","text":"\u9876\u5c42\u5165\u53e3\u6ce8\u518c\u7c7b\u578b\u540e\uff0c\u901a\u8fc7 tools.py \u7edf\u4e00\u6ce8\u518c WorkspaceTool\uff0c\u901a\u8fc7 keymaps.py \u7edf\u4e00\u6ce8\u518c\u5feb\u6377\u952e\u3002\u6ce8\u9500\u6309\u76f8\u53cd\u751f\u547d\u5468\u671f\u5173\u95ed Runtime\u3001\u5feb\u6377\u952e\u4e0e\u5de5\u5177\uff0c\u518d\u79fb\u9664\u83dc\u5355\u548c Scene \u5c5e\u6027\uff0c\u6309 CLASSES \u9006\u5e8f\u6ce8\u9500\u7c7b\u578b\u3002\u8bbe\u5907\u3001\u5b58\u50a8\u76ee\u5f55\u3001\u6a21\u578b\u3001\u6750\u8d28\u663e\u793a\u9002\u914d\u548c\u529f\u80fd\u4e0a\u9650\u7edf\u4e00\u901a\u8fc7 preferences.py \u8bfb\u53d6\u3002
Maximum AI Input Size \u9650\u5236\u6a21\u578b\u5206\u6790\u8f93\u5165\u548c Upscale \u53ef\u63d0\u4ea4\u6e90\u56fe\u7684\u957f\u8fb9\uff1bMaximum Frame Resolution \u9650\u5236 Frame \u8f93\u51fa\u957f\u8fb9\uff1bMinimum Relative Edge Length \u4e0e Boundary Padding \u63a7\u5236 Cutout \u7684\u7f51\u683c\u5bc6\u5ea6\u548c\u8f6e\u5ed3\u8fb9\u754c\u91c7\u6837\u3002
"},{"location":"internals/architecture/#_3","title":"\u6267\u884c\u8fb9\u754c","text":"flowchart TD\n A[Operator \u5728\u4e3b\u7ebf\u7a0b\u8bfb\u53d6 Blender \u6570\u636e] --> B[\u51c6\u5907\u8f93\u5165\u6587\u4ef6]\n B --> C[request \u8fd4\u56de\u666e\u901a\u5b57\u5178]\n C --> D[BlendJob \u961f\u5217\u6267\u884c Server Job]\n D --> E[\u6a21\u578b\u4e0e\u5a92\u4f53\u5904\u7406\u5199\u5165 Job \u76ee\u5f55]\n E --> F[\u4e3b\u7ebf\u7a0b response \u52a0\u8f7d\u7ed3\u679c]\n F --> G[\u63d0\u4ea4 Image \u6216 Object \u4fee\u6539\u53ca Undo]\n G --> H[\u6e05\u7406\u4e34\u65f6\u8f93\u5165]
Plane\u3001Frame\u3001Mask\u3001Rectify \u548c\u65e0\u9700 AI \u7684 Cutout \u5728 Blender \u5185\u6267\u884c\u3002Server \u7684 jobs/ \u7f16\u6392\u4efb\u52a1\uff0cmodels/ \u8d1f\u8d23\u6a21\u578b\u9002\u914d\uff0cgeometry/ \u5904\u7406\u6df1\u5ea6\u4e0e\u6cd5\u7ebf\u4ea7\u7269\u3002Server \u6a21\u5757\u901a\u8fc7\u5185\u90e8\u76f8\u5bf9\u5bfc\u5165\u5171\u4eab\u80fd\u529b\uff0cBlender \u4fa7\u901a\u8fc7 common/ \u590d\u7528\u3002
MoGe-2 \u4e0e MoGe-3 \u8f93\u51fa\u7edf\u4e00\u4e3a GeometryFrame\uff1a\u5305\u542b Depth\u3001Validity\u3001Intrinsics\uff0c\u4ee5\u53ca\u6309\u9700\u63d0\u4f9b\u7684 Normal \u548c Points\u3002\u4ea7\u7269\u5199\u5165\u5668\u6d88\u8d39\u540c\u4e00\u4e2a Frame\uff0c\u4fdd\u6301\u6df1\u5ea6\u3001\u6cd5\u7ebf\u548c\u76f8\u673a\u6570\u636e\u4e00\u81f4\u3002\u53c2\u89c1 Runtime \u4e0e \u4ea7\u7269\u534f\u8bae\u3002
"},{"location":"internals/common/","title":"Blender \u516c\u5171\u80fd\u529b","text":"src/anyimage/common/ \u6309\u4e1a\u52a1\u804c\u8d23\u63d0\u4f9b\u516c\u5171\u51fd\u6570\uff0c\u8c03\u7528\u65b9\u4ece\u5bf9\u5e94\u6a21\u5757\u76f4\u63a5\u5bfc\u5165\u3002
\u6a21\u5757 \u804c\u8d23\u4e0e\u4e3b\u8981\u5165\u53e3 ai.py \u73af\u5883\u548c\u6a21\u578b\u5c31\u7eea\u68c0\u67e5\u3001\u8f93\u5165\u8def\u5f84\u6821\u9a8c\u3001production_device()\u3001moge2_parameters() \u4e0e\u5b89\u88c5 UI image.py image_rgba()\u3001Image User \u5e27\u8bbe\u7f6e\u8bfb\u53d6\u3001Job \u8f93\u5165\u51c6\u5907\u3001\u50cf\u7d20\u91c7\u6837\u3001\u7ed3\u679c Image \u548c replace_empty_image() color_image.py \u6750\u8d28\u989c\u8272\u4e0e AI \u5206\u6790\u8f93\u5165\u7684\u51c6\u5907\u548c\u6e05\u7406 hdr_image.py HDR \u53bb\u80cc\u666f\u5206\u6790\u8f93\u5165\u53ca\u6d6e\u70b9\u989c\u8272\u4fdd\u7559 image_target.py Image Empty \u4e0e Shader Image Texture \u7f16\u8f91\u76ee\u6807 selection.py SelectionPath\u3001SelectionMask\u3001non-zero winding \u6805\u683c\u5316\u4e0e Alpha \u4fee\u6574 viewport.py \u539f\u751f\u70b9\u9009\u3001\u5c4f\u5e55\u6295\u5f71\u3001ImageGesture\u3001Lasso / Brush / Polyline \u4e0e Overlay depth.py \u6df1\u5ea6\u56fe\u7247\u548c\u5143\u6570\u636e\u52a0\u8f7d\u3001\u76f8\u673a\u5750\u6807\u4e0e\u663e\u793a\u8303\u56f4\u7684\u5c3a\u5ea6\u6362\u7b97 material.py Image Layer\u3001Normal\u3001Alpha\u3001Shadeless \u4e0e Depth \u6750\u8d28 object.py Modifier \u8f93\u5165\u8bbe\u7f6e\u4e0e\u7ed3\u679c\u5bf9\u8c61\u6fc0\u6d3b\u3001\u6e90\u5bf9\u8c61\u66ff\u6362 node.py node_asset_path() \u4e0e load_node_group()"},{"location":"internals/common/#_1","title":"\u56fe\u50cf\u751f\u547d\u5468\u671f","text":"\u4e1a\u52a1\u50cf\u7d20\u91c7\u7528 Top-down RGBA\uff0cimage_pixels() \u4f7f\u7528 Blender \u50cf\u7d20\u987a\u5e8f\u3002\u9884\u4e58\u91c7\u6837\u7528\u4e8e\u6295\u5f71\u63d2\u503c\uff1b\u6587\u4ef6\u6216 Packed \u56fe\u50cf\u7684\u4e1a\u52a1\u8bfb\u53d6\u4fdd\u7559\u9690\u85cf RGB\u3002ImageEditTarget \u6821\u9a8c\u76ee\u6807\u8eab\u4efd\u540e\u7ecf replace_empty_image() \u6216 replace_texture_image() \u63d0\u4ea4\uff1a\u672a\u5171\u4eab\u7684 Image \u539f\u5730\u66ff\u6362\u5185\u5bb9\uff0c\u5171\u4eab\u65f6\u6539\u7528\u65b0\u7684 Image \u6570\u636e\u5757\uff0c\u5931\u8d25\u65f6\u56de\u6eda\u6e90\u6570\u636e\u3002
prepare_image_input() \u8fd4\u56de\u8def\u5f84\u53ca\u4e34\u65f6\u6807\u8bb0\uff1bcleanup_image_input() \u4e0e\u521b\u5efa\u65b9\u914d\u5bf9\u3002color_image.py \u7684 prepare_material_color_input() \u51c6\u5907\u6750\u8d28\u989c\u8272\uff0cmaterial_analysis_input() \u63d0\u4f9b\u5206\u6790\u8f93\u5165\uff1bCutout \u6309\u51e0\u4f55 bounds \u88c1\u5207\u3002
"},{"location":"internals/common/#selection","title":"\u624b\u52bf\u4e0e Selection","text":"flowchart TD\n A[\u539f\u751f\u5bf9\u8c61\u70b9\u9009] --> B[ImageGesture \u51bb\u7ed3\u6e90\u56fe\u4e0e\u4ea4\u4e92\u72b6\u6001]\n B --> C[\u5c4f\u5e55\u8def\u5f84\u4e0e Overlay]\n C --> D[\u63d0\u4ea4\u65f6\u6295\u5f71\u5230\u56fe\u7247\u7a7a\u95f4]\n D --> E[SelectionPath]\n E --> F[\u5c40\u90e8 non-zero winding \u6805\u683c\u5316]\n F --> G[SelectionMask values \u4e0e bounds]\n G --> H[Mask Alpha \u8fd0\u7b97\u6216 Cutout \u5185\u5bb9\u8f6e\u5ed3]
Brush \u7684\u5706\u5f62\u5370\u8bb0\u548c\u8fde\u63a5\u6761\u7531 brush_footprint_polygons() \u751f\u6210\uff0c\u4f9b\u9884\u89c8\u4e0e\u63d0\u4ea4\u5171\u7528\u3002\u62d6\u52a8\u65f6\u7ef4\u62a4\u5c4f\u5e55\u8def\u5f84\u4e0e\u5c40\u90e8 Overlay\uff0c\u63d0\u4ea4\u65f6\u751f\u6210\u8986\u76d6\u503c\u3002Mask\u3001Rectify \u4e0e Cutout \u7684\u7a7a\u547d\u4e2d\u4fdd\u7559 active Image Empty\uff1b\u70b9\u4e2d\u53e6\u4e00\u5bf9\u8c61\u65f6\u5b8c\u6210\u539f\u751f\u9009\u62e9\u3002
"},{"location":"internals/common/#_2","title":"\u6750\u8d28\u3001\u8282\u70b9\u4e0e\u5bf9\u8c61","text":"create_image_material() \u6309 Shadeless\u3001Normal \u548c Depth \u7ec4\u5408\u8282\u70b9\u3001\u8fde\u63a5\u989c\u8272\u4e0e Alpha\uff1b\u6750\u8d28\u663e\u793a\u9002\u914d\u8bfb\u53d6\u5f53\u524d Preferences\u3002set_modifier_input() \u6309\u5b9e\u9645 RNA \u8f93\u5165\u5f62\u5f0f\u8bbe\u7f6e\u503c\uff0cfinalize_object_result() \u5b8c\u6210\u7ed3\u679c\u5bf9\u8c61\u6fc0\u6d3b\u548c\u6e90\u5bf9\u8c61\u5904\u7406\u3002Image \u66ff\u6362\u8def\u5f84\u4fdd\u7559 Empty \u7684\u77e9\u9635\u3001\u663e\u793a\u5c3a\u5bf8\u3001\u504f\u79fb\u548c Image User \u5e27\u8bbe\u7f6e\u3002
Geometry Nodes \u4ece src/anyimage/assets/O_AnyImage.blend \u6309\u516c\u5f00\u540d\u79f0\u52a0\u8f7d\u3002\u6784\u5efa\u4e0e\u5e03\u5c40\u804c\u8d23\u89c1\u8282\u70b9\u8d44\u4ea7\uff0c\u6df1\u5ea6\u5b57\u6bb5\u89c1Job \u4ea7\u7269\u3002
"},{"location":"internals/development/","title":"\u5f00\u53d1\u4e0e\u53d1\u5e03","text":"\u4ed3\u5e93\u4f7f\u7528 CPython 3.11 \u4e0e bpy==4.5.3 \u6d4b\u8bd5 Blender \u4ee3\u7801\uff1bAI Server \u4f7f\u7528 runtime.py \u58f0\u660e\u7684\u72ec\u7acb Python 3.12 Environment\u3002
uv sync\nuv run pytest\n
"},{"location":"internals/development/#_2","title":"\u6d4b\u8bd5\u7ec4\u7ec7","text":"\u6d4b\u8bd5\u8303\u56f4 \u6587\u4ef6 \u6269\u5c55\u6ce8\u518c\u3001\u8bbe\u7f6e\u3001\u5b89\u88c5\u548c Job \u4ea4\u4e92 test_addon_registration.py\u3001test_preferences.py\u3001test_ai_setup.py\u3001test_job_operator.py Frame\u3001Mask\u3001Rectify\u3001Plane\u3001Cutout \u5bf9\u5e94 test_*_tool.py\u3001test_*_operators.py \u4e0e\u5bf9\u8c61\u3001\u6295\u5f71\u3001\u7f51\u683c\u6d4b\u8bd5 \u56fe\u50cf\u8eab\u4efd\u3001Alpha\u3001\u6750\u8d28\u4e0e Undo \u56fe\u50cf\u7f16\u8f91\u96c6\u6210\u3001\u5171\u4eab\u66ff\u6362\u3001\u6750\u8d28\u9002\u914d\u4e0e Undo \u6d4b\u8bd5 Server test_job_server.py\u3001test_server_jobs.py\u3001test_input_validation.py\u3001test_geometry_artifacts.py \u6a21\u578b test_model_manager.py\u3001\u4e0b\u8f7d\u3001\u63a8\u7406\u4e0e\u5404 ONNX \u6a21\u578b\u6d4b\u8bd5 \u8282\u70b9\u8d44\u4ea7 \u5e03\u5c40\u4e0e\u63a5\u53e3\u7b49\u4ef7\u3001\u51e0\u4f55\u6c42\u503c\u3001Cutout \u4e0e\u4e34\u65f6\u5c5e\u6027\u6e05\u7406 \u5de5\u5177\u4e0e\u5305\u534f\u8bae \u6269\u5c55 Manifest\u3001\u6253\u5305\u3001\u6a21\u578b\u540c\u6b65\u4e0e\u8282\u70b9\u542f\u52a8\u5668 Blender Stub \u5171\u7528 tests/support/blender.py\uff1bServer \u548c\u5b9e\u9645 Blender \u51e0\u4f55 fixture \u6309\u4f7f\u7528\u8303\u56f4\u5b58\u653e\u5728\u5bf9\u5e94 support \u6a21\u5757\u3002\u6d4b\u8bd5\u547d\u540d\u63cf\u8ff0\u529f\u80fd\u3001\u89e6\u53d1\u6761\u4ef6\u4e0e\u53ef\u89c2\u5bdf\u7ed3\u679c\u3002
"},{"location":"internals/development/#_3","title":"\u53d1\u5e03\u547d\u4ee4","text":"\u547d\u4ee4 \u804c\u8d23 uv run pack \u751f\u6210 Windows\u3001macOS arm64\u3001Linux \u6269\u5c55\u5305 uv run pack --prepare \u4e3a\u672c\u673a\u540c\u6b65\u6269\u5c55 wheel \u4e0e Manifest uv run --group blender node-group build \u6784\u5efa\u3001\u9a8c\u8bc1\u8282\u70b9\u8d44\u4ea7\u5e76\u8fd0\u884c\u8282\u70b9\u6d4b\u8bd5 uv run model sync \u51c6\u5907\u3001\u6821\u9a8c\u5e76\u4e0a\u4f20\u6a21\u578b\u58f0\u660e\u7684\u6587\u4ef6 uv run docs -dev \u672c\u5730\u9884\u89c8\u6587\u6863 uv run docs \u901a\u8fc7 Mike \u53d1\u5e03\u9879\u76ee\u7248\u672c\u5e76\u66f4\u65b0 latest tools/pack.py \u4ece pyproject.toml \u8bfb\u53d6\u4f9d\u8d56\uff0c\u6309\u5e73\u53f0\u4e0e Blender Python \u7248\u672c\u89e3\u6790 wheel\uff0c\u4f7f\u7528 Blender \u63d0\u4f9b\u7684 NumPy\u3002\u4ea7\u7269\u547d\u540d\u4e3a AnyImage.v<version>.<platform>.zip\uff0c\u5199\u5165 dist/\u3002\u672c\u5730 BlendJob wheel \u5185\u5bb9\u53d8\u5316\u540e\u8fd0\u884c uv lock --refresh\uff0c\u5e76\u6838\u5bf9\u9501\u6587\u4ef6\u3001Manifest \u4e0e\u6253\u5305\u6d4b\u8bd5\u3002
tools/models/cli.py \u6839\u636e\u6a21\u578b\u76ee\u5f55\u9009\u62e9\u4e0a\u6e38 ONNX \u6216\u672c\u5730\u5bfc\u51fa\u6d41\u7a0b\uff1btools/models/exports.py \u5904\u7406\u5bf9\u5e94 PyTorch \u6743\u91cd\u5bfc\u51fa\u3002\u6587\u4ef6\u6821\u9a8c\u4f9d\u636e\u58f0\u660e\u5927\u5c0f\u548c SHA-256\uff0c\u4e0a\u4f20\u4f7f\u7528\u9010\u6587\u4ef6\u590d\u5236\u3002uv run model prepare \u7528\u4e8e\u672c\u5730\u51c6\u5907\u3002
"},{"location":"internals/development/#ci","title":"CI \u4e0e\u6587\u6863\u5bfc\u822a","text":"flowchart TD\n A[main push\u3001Pull Request \u6216\u624b\u52a8\u89e6\u53d1] --> B[test.yml \u8fd0\u884c\u6d4b\u8bd5]\n C[v \u524d\u7f00 Tag] --> D[build.yml \u6d4b\u8bd5\u3001\u6253\u5305\u5e76\u53d1\u5e03 ZIP]\n E[main \u6587\u6863\u8def\u5f84\u53d8\u5316\u6216\u624b\u52a8\u89e6\u53d1] --> F[docs.yml \u6784\u5efa\u7ad9\u70b9\u5e76\u90e8\u7f72\u5230 Cloudflare Workers]
\u7ad9\u70b9\u5bfc\u822a\u7531 mkdocs.yml \u663e\u5f0f\u7ef4\u62a4\uff0c\u9875\u9762\u79fb\u52a8\u65f6\u540c\u6b65\u5bfc\u822a\u548c\u76f8\u5bf9\u94fe\u63a5\u3002\u8282\u70b9\u8d44\u4ea7\u7684\u811a\u672c\u804c\u8d23\u53ca\u68c0\u67e5\u5165\u53e3\u89c1\u8282\u70b9\u8d44\u4ea7\u3002
"},{"location":"internals/node-assets/","title":"\u8282\u70b9\u8d44\u4ea7","text":""},{"location":"internals/node-assets/#_2","title":"\u8d44\u4ea7\u6e05\u5355","text":"\u8282\u70b9\u7ec4\u7531 nodes/groups/ \u4e2d\u7684\u6784\u5efa\u6a21\u5757\u5b9a\u4e49\uff0c\u5171\u7528\u6784\u5efa\u903b\u8f91\u4f4d\u4e8e nodes/common/\u3002
\u8282\u70b9\u7ec4 \u6784\u5efa\u6a21\u5757 O Image Plane image_plane.py O Image Depth Plane image_depth_plane.py O Image Relief Plane image_relief_plane.py O Image Cutout image_cutout.py O Image Depth Cutout image_depth_cutout.py O Image Cutout Symmetry image_cutout_symmetry.py O Image Layer image_layer.py O Image Depth Layer image_depth_layer.py O Shadeless shadeless.py O Image Depth Panorama image_depth_panorama.py"},{"location":"internals/node-assets/#_3","title":"\u6784\u5efa\u8282\u70b9\u8d44\u4ea7","text":"\u751f\u4ea7\u8282\u70b9\u7ec4\u7531 uv run --group blender node-group build \u6784\u5efa\u5230 src/anyimage/assets/O_AnyImage.blend\u3002\u8be5\u6587\u4ef6\u662f Git \u5ffd\u7565\u7684\u53d1\u5e03\u6784\u5efa\u4ea7\u7269\uff1bCI \u4e0e\u672c\u5730\u53d1\u5e03\u90fd\u4ece\u8282\u70b9\u6e90\u7801\u91cd\u65b0\u751f\u6210\u3002
\u8282\u70b9\u7ec4\u89c4\u5219\uff1a
- \u5b57\u6bb5\u9ed8\u8ba4\u76f4\u63a5\u8fde\u63a5\uff0c\u591a\u4e2a\u6d88\u8d39\u8005\u53ef\u590d\u7528\u540c\u4e00\u8f93\u51fa\uff1b\u6309\u6d88\u8d39\u4f4d\u7f6e\u7684\u51e0\u4f55\u3001\u57df\u3001\u7c7b\u578b\u548c\u8f93\u5165\u5c5e\u6027\u7248\u672c\u9a8c\u8bc1\u6c42\u503c\u7b49\u4ef7\u6027
- \u6240\u6709\u51e0\u4f55\u8282\u70b9\u3001\u5d4c\u5957\u7ec4\u53ca\u6d4b\u8bd5\u8f85\u52a9\u56fe\u7981\u6b62\u4f7f\u7528 Capture Attribute\uff1b\u6784\u5efa\u5b9a\u4e49\u548c\u4fdd\u5b58\u8d44\u4ea7\u9012\u5f52\u68c0\u67e5 Capture \u4e3a\u96f6
- \u57df\u8f6c\u6362\u4f7f\u7528 Evaluate on Domain \u6216\u660e\u786e\u57df\u7684\u91c7\u6837\u8282\u70b9\u8868\u8fbe\uff1b\u8de8\u51e0\u4f55\u53d8\u5316\u4f18\u5148\u8c03\u6574\u6d88\u8d39\u987a\u5e8f\u6216\u5728\u6e90\u51e0\u4f55\u4e0a\u91c7\u6837\uff0c\u660e\u786e\u7d22\u5f15\u5bf9\u5e94\u5173\u7cfb
- Store Named Attribute \u7528\u4e8e\u5b9e\u9645\u547d\u540d\u534f\u8bae\u6216\u4ecd\u9700\u8de8\u51e0\u4f55\u53d8\u5316\u4fdd\u5b58\u7684\u6700\u5c11\u6570\u636e\uff0c\u9010\u9879\u660e\u786e\u540d\u79f0\u3001\u7c7b\u578b\u3001\u57df\u3001Selection\u3001\u5199\u5165\u9636\u6bb5\u3001\u6d88\u8d39\u8005\u53ca\u5fc5\u8981\u6027\uff1b\u5185\u90e8\u4e34\u65f6\u5c5e\u6027\u4f7f\u7528
_o_ \u524d\u7f00\uff0c\u5728\u6700\u540e\u6d88\u8d39\u8005\u4e4b\u540e\u7528\u901a\u914d\u7b26 _o_* \u6e05\u7406\uff0c\u4fdd\u7559 UV\u3001\u7528\u6237\u5c5e\u6027\u548c\u5916\u90e8\u534f\u8bae\u5c5e\u6027\u3002\u6e05\u7406\u5fc5\u987b\u8d70 remove_attribute_pattern\uff1a\u6309\u7cbe\u786e\u540d\u79f0\u5220\u9664\u65f6\uff0c\u82e5\u67d0\u4e2a\u51e0\u4f55\u5206\u652f\u4ece\u672a\u5199\u5165\u8be5\u5c5e\u6027\uff0cRemove Named Attribute \u4f1a\u62a5\u51fa\u7f3a\u5931\u8b66\u544a - Group Input \u6309\u533a\u57df\u91cd\u590d\u653e\u7f6e\uff0c\u901a\u8fc7\u5b57\u6bb5\u6392\u5217\u548c\u5fc5\u8981\u7684 Reroute \u4fdd\u6301\u8fde\u7ebf\u53ef\u8bfb\uff0c\u9690\u85cf\u672a\u4f7f\u7528\u8f93\u51fa\uff1b\u5b58\u50a8\u987b\u6709\u6570\u636e\u751f\u547d\u5468\u671f\u4f9d\u636e
- \u6784\u5efa\u9636\u6bb5\u901a\u8fc7\u660e\u786e\u7684\u8282\u70b9\u6216 socket \u5f15\u7528\u63a5\u7ebf
- \u4fdd\u7559\u8282\u70b9\u9ed8\u8ba4
name \u548c\u6807\u9898\uff0c\u4e0d\u7528 label \u8986\u76d6\uff0c\u4e0d\u7528 String \u8282\u70b9\u6ce8\u89e3\u3002Frame \u4ec5\u7528\u4e8e\u786e\u6709\u5305\u88f9\u8bed\u4e49\u7684\u533a\u57df - \u5168\u63a5\u7ebf\u7684\u7b80\u5355\u6570\u5b66\u8fd0\u7b97\u53ef\u6298\u53e0\uff1b\u9700\u8981\u9605\u8bfb\u7684\u5e38\u6570\u3001\u8fd0\u7b97\u57df\u548c\u6a21\u5f0f\u4fdd\u6301\u53ef\u89c1
- \u6bd4\u8f83\u7edf\u4e00\u7528 Compare \u8282\u70b9\u5e76\u6309\u64cd\u4f5c\u6570\u6570\u636e\u7c7b\u578b\u9009\u62e9\u8f93\u5165\uff0c\u5e03\u5c14\u8fd0\u7b97\u7edf\u4e00\u7528 Boolean Math\uff0c\u4e0d\u7528 Math \u8282\u70b9\u505a\u6bd4\u8f83\u3001\u4e5f\u4e0d\u7528\u6570\u503c\u4e58\u6cd5\u4ee3\u66ff\u5e03\u5c14\u8fd0\u7b97\uff1b\u6750\u8d28\u6811\u4e0d\u652f\u6301\u8fd9\u4e24\u4e2a\u8282\u70b9\uff0c\u4ecd\u7528 Math
- \u4fee\u6539\u5668 Geometry Nodes \u7684\u8f93\u5165 socket \u9ed8\u8ba4\u4f7f\u7528
SINGLE - socket
subtype \u6309\u4e1a\u52a1\u8bed\u4e49\u8bbe\u7f6e\uff1a\u957f\u5ea6\u7528 DISTANCE\uff0c0\u20131 \u6bd4\u4f8b\u7528 FACTOR\uff0c0\u2013100 \u7528 PERCENTAGE\uff1b\u65e0\u5bf9\u5e94\u8303\u56f4\u8bed\u4e49\u65f6\u4fdd\u7559\u9ed8\u8ba4 - \u63a5\u53e3\u6216\u5e03\u5c40\u53d8\u66f4\u987b\u9a8c\u8bc1 socket \u987a\u5e8f\u4e0e\u7ed3\u6784\u3001\u672a\u4f7f\u7528\u8f93\u51fa\u9690\u85cf\u53ca\u51e0\u4f55\u6c42\u503c\uff1b\u7eaf\u5e03\u5c40\u53d8\u66f4\u6bd4\u8f83\u8fd0\u7b97\u3001\u9ed8\u8ba4\u503c\u548c\u5b9e\u9645\u8fde\u63a5\uff0c\u786e\u8ba4\u529f\u80fd\u4e0d\u53d8
"},{"location":"internals/node-assets/#_4","title":"\u6784\u5efa\u8d44\u4ea7\u811a\u672c","text":"tools/nodes/build.py \u6309\u4f9d\u8d56\u987a\u5e8f\u52a0\u8f7d nodes/groups/ \u7684\u5b9a\u4e49\uff0c\u8c03\u7528 arrangement/ \u7edf\u4e00\u6392\u5217\u51e0\u4f55\u8282\u70b9\u7ec4\u540e\u4fdd\u5b58\u3002nodes/common/ \u63d0\u4f9b\u5171\u7528\u6784\u5efa\u51fd\u6570\uff1anodes.py \u521b\u5efa\u63a5\u53e3\u4e0e\u8282\u70b9\uff0cdepth_surface.py\u3001cutout.py \u7b49\u7ec4\u88c5\u51e0\u4f55\uff0cshader.py \u6784\u5efa\u6750\u8d28\u7740\u8272\u8282\u70b9\uff0cmaterial_slots.py \u7ee7\u627f\u51e0\u4f55\u6750\u8d28\u69fd\uff1btools/nodes/preview/ \u5bfc\u51fa\u4ea4\u4e92\u9884\u89c8\u3002
\u547d\u4ee4\u901a\u8fc7\u5f53\u524d uv Python \u7684\u72ec\u7acb\u5b50\u8fdb\u7a0b\u6267\u884c\u6784\u5efa\u3001\u68c0\u67e5\u548c\u9884\u89c8\uff0cbpy \u7531 blender dependency group \u63d0\u4f9b\u3002\u4fdd\u5b58\u540e\uff0ccheck.py \u91cd\u65b0\u52a0\u8f7d\u8d44\u4ea7\u5e76\u505a\u57fa\u672c\u51e0\u4f55\u6c42\u503c\uff1btests/nodes/ \u8986\u76d6\u8282\u70b9\u5b9a\u4e49\u884c\u4e3a\uff0ctests/tools/nodes/ \u8986\u76d6\u5de5\u5177\u884c\u4e3a\u3002CI \u4f7f\u7528\u540c\u4e00\u5165\u53e3\u5148\u751f\u6210\u8d44\u4ea7\uff0c\u518d\u8fd0\u884c\u5e38\u89c4\u6d4b\u8bd5\u548c\u6253\u5305\u3002
uv run --group blender node-group build\nuv run --group blender node-group build --skip-tests\nuv run --group blender node-group check\nuv run --group blender node-group preview\n
"},{"location":"internals/outputs/","title":"Job \u4ea7\u7269","text":"Server \u5c06\u7ed3\u679c\u5199\u5165 Job \u76ee\u5f55\uff0c\u8fd4\u56de\u4ee5\u76f8\u5bf9\u6587\u4ef6\u540d\u4e3a\u503c\u7684\u5b57\u5178\u3002Blender \u4e3b\u7ebf\u7a0b\u901a\u8fc7 JobResult \u8bfb\u53d6\u6587\u4ef6\uff0c\u521b\u5efa\u6216\u66f4\u65b0 Image\u3001Mesh\u3001Material \u548c Object\u3002
Job \u6587\u4ef6 \u6d88\u8d39\u65b9 remove-background foreground.png \u6216 alpha.npy ImageEditTarget \u6216 HDR Alpha \u7f16\u8f91 upscale-image upscale.png \u56fe\u50cf\u66ff\u6362 generate-depth-plane-geometry depth.exr\u3001depth.json \u548c\u6cd5\u7ebf Depth / Relief Plane generate-cutout-artifacts \u6309\u8bf7\u6c42\u63d0\u4f9b\u6df1\u5ea6\u3001\u5143\u6570\u636e\u548c\u6cd5\u7ebf Cutout generate-panorama-geometry depth.exr\u3001depth.json Panorama"},{"location":"internals/outputs/#_1","title":"\u6df1\u5ea6\u4e0e\u6cd5\u7ebf\u534f\u8bae","text":"\u8fd4\u56de\u5b57\u6bb5 \u5185\u5bb9 depth float32 EXR\uff0c\u900f\u89c6\u4ea7\u7269 RGB \u4fdd\u5b58\u76f8\u673a\u7a7a\u95f4 XYZ\uff0cAlpha \u4fdd\u5b58\u6e90 Alpha \u00d7 \u6a21\u578b\u6709\u6548\u6027 depth_metadata JSON\uff0c\u5305\u542b image_size \u4e0e 3\u00d73 intrinsics tangent_normal tangent-normal.png\uff0c\u5207\u7ebf\u7a7a\u95f4\u6cd5\u7ebf object_normal object-normal.png\uff0c\u5bf9\u8c61\u7a7a\u95f4\u6cd5\u7ebf flowchart TD\n A[\u6e90 RGB \u4e0e Alpha] --> B[\u9650\u5c3a\u5bf8 RGB \u63a8\u7406]\n B --> C[GeometryFrame]\n C --> D[\u5199\u51fa\u6df1\u5ea6\u4e0e\u6cd5\u7ebf]\n A --> E[\u6e90 Alpha \u5199\u5165\u6709\u6548\u901a\u9053]\n E --> D\n D --> F[Blender \u52a0\u8f7d\u5e76 Pack]
\u53c2\u8003\u6df1\u5ea6\u7531 common/depth.py \u4ece\u4ea7\u7269\u8ba1\u7b97\uff1a\u5148\u6309 Alpha \u9608\u503c\u548c\u6709\u9650\u6b63\u6df1\u5ea6\u7b5b\u9009\u6837\u672c\uff0c\u5254\u9664\u8d85\u8fc7\u6837\u672c\u4e2d\u4f4d\u6570 1.1 \u500d\u7684\u8fdc\u5904\u80cc\u666f\uff0c\u518d\u53d6 95 \u5206\u4f4d\u6570\uff1b\u65e0\u53ef\u7528\u6837\u672c\u65f6\u8fd4\u56de\u57fa\u51c6\u503c\u3002\u52a0\u8f7d\u540e\u8bbe\u7f6e Non-Color \u548c CHANNEL_PACKED\u3002Depth Plane \u4f7f\u7528\u5bf9\u8c61\u7a7a\u95f4\u6cd5\u7ebf\uff0cRelief Plane \u4f7f\u7528\u5207\u7ebf\u7a7a\u95f4\u6cd5\u7ebf\u3002
Panorama \u7684 EXR RGB \u4fdd\u5b58\u5f84\u5411\u8ddd\u79bb\uff0cAlpha \u4fdd\u5b58\u6e90 Alpha \u4e0e\u878d\u5408\u6709\u6548\u6027\uff1b\u5143\u6570\u636e\u5305\u542b projection: equirectangular \u548c image_size\u3002
"},{"location":"internals/outputs/#_2","title":"\u989c\u8272\u4e0e\u56fe\u50cf\u7f16\u8f91","text":"common/color_image.py \u4e3a Plane\u3001Panorama \u548c Cutout \u51c6\u5907\u72ec\u7acb\u7684\u6750\u8d28\u989c\u8272\u4e0e AI \u5206\u6790\u8f93\u5165\u3002Cutout \u4f7f\u7528 Selection bounds \u5185\u7684\u6e90\u56fe\uff1b\u7f51\u683c\u521b\u5efa\u65f6\u7ec4\u5408\u6e90 Alpha \u4e0e SelectionMask\u3002\u989c\u8272\u5206\u8fa8\u7387\u4e0e\u5206\u6790\u5c3a\u5bf8\u5206\u522b\u5904\u7406\u3002
ImageEditTarget \u7edf\u4e00 Image Empty \u548c Shader Image Texture \u7684\u7f16\u8f91\u76ee\u6807\u53ca\u5171\u4eab\u5f15\u7528\u3002HDR \u53bb\u80cc\u666f\u901a\u8fc7 HdrBackgroundInput \u4fdd\u7559 Blender \u6d6e\u70b9 RGB\uff0c\u5e76\u5e94\u7528 Server \u8fd4\u56de\u7684\u8fde\u7eed Alpha\u3002
"},{"location":"internals/runtime/","title":"Job Runtime \u4e0e Server","text":"runtime.py \u914d\u7f6e BlendJob JobRuntime \u548c\u72ec\u7acb Python 3.12 Environment\u3002server/app.py \u6ce8\u518c Job\uff0cmodel_manager.py \u7ba1\u7406\u6a21\u578b\u6587\u4ef6\u4e0e\u7f13\u5b58 Session\u3002
flowchart TD\n A[Operator request] --> B[JobRuntime \u961f\u5217]\n B --> C[Server Job \u8c03\u7528\u5a92\u4f53\u4e0e\u6a21\u578b\u6a21\u5757]\n C --> D[\u5199\u5165 Job \u76ee\u5f55]\n D --> E[\u4e3b\u7ebf\u7a0b response \u5bfc\u5165\u7ed3\u679c]
Job \u5b9e\u73b0\u4e0e\u7528\u9014 download-model\u3001download-required-models app.py \u4e0b\u8f7d\u5355\u4e2a\u6216\u7f3a\u5931\u6a21\u578b remove-background jobs/remove_background.py \u751f\u6210\u900f\u660e\u524d\u666f\u6216\u8fde\u7eed Alpha upscale-image jobs/upscale.py \u751f\u6210 2\u00d7 \u56fe\u50cf generate-depth-plane-geometry jobs/depth_plane.py \u751f\u6210\u6df1\u5ea6\u3001\u5143\u6570\u636e\u548c\u6cd5\u7ebf generate-cutout-artifacts jobs/cutout.py \u6309\u8bf7\u6c42\u751f\u6210\u6df1\u5ea6\u548c\u6cd5\u7ebf generate-panorama-geometry jobs/panorama.py \u751f\u6210\u5168\u666f\u5f84\u5411\u6df1\u5ea6 media/ \u6821\u9a8c\u8f93\u5165\u56fe\u7247\u5e76\u9650\u5236\u5206\u6790\u5c3a\u5bf8\uff0cServer \u53ea\u5904\u7406\u9759\u6001\u56fe\u7247\u3002Job \u5728\u9636\u6bb5\u8fb9\u754c\u68c0\u67e5\u53d6\u6d88\uff0c\u901a\u8fc7 context.progress() \u8fd4\u56de\u8fdb\u5ea6\uff0cOperator \u6e05\u7406 Blender \u5bfc\u51fa\u7684\u4e34\u65f6\u8f93\u5165\u3002
geometry/prediction_artifacts.py \u7f29\u653e\u6e90 RGB \u540e\u8fd0\u884c\u4e00\u6b21 MoGe\uff0c\u5c06\u540c\u4e00\u9884\u6d4b\u4ea4\u7ed9\u6df1\u5ea6\u3001\u6cd5\u7ebf\u548c\u5143\u6570\u636e\u5199\u5165\u5668\uff1b\u6e90 Alpha \u5199\u5165\u6df1\u5ea6\u4e0e\u6cd5\u7ebf\u4ea7\u7269\u7684\u6709\u6548\u901a\u9053\u3002\u53c2\u8003\u6df1\u5ea6\u7531 Blender \u4fa7\u6309\u4ea7\u7269 Alpha \u8ba1\u7b97\uff0c\u6587\u4ef6\u534f\u8bae\u89c1 Job \u4ea7\u7269\u3002
"},{"location":"internals/runtime/#_1","title":"\u6a21\u578b\u4e0e\u7f13\u5b58","text":"\u7528\u9014 \u6a21\u578b Session \u5206\u7c7b Depth \u4e0e Normal MoGe-2 ViT-S / ViT-B Normal\u3001MoGe-3 ViT-L geometry Remove Background BiRefNet Lite\u3001BEN2\u3001BiRefNet HR Matting background Upscale Real-ESRGAN WDN\u3001Real-ESRGAN x4plus\u3001HAT Sharper upscale model_catalog.py \u58f0\u660e\u6587\u4ef6\u6765\u6e90\u3001\u8bb8\u53ef\u3001\u5927\u5c0f\u548c SHA-256\uff1bmodel_download.py \u4e0b\u8f7d\u5e76\u6821\u9a8c\u3002ModelManager \u6309\u6a21\u578b\u8def\u5f84\u548c\u8bbe\u5907\u7f13\u5b58 Session\uff0c\u5207\u6362\u6a21\u578b\u6216\u8bbe\u5907\u65f6\u91ca\u653e\u5bf9\u5e94\u7c7b\u522b\u3002Clear Models \u6216\u5173\u95ed Server \u65f6\u91ca\u653e\u5df2\u52a0\u8f7d\u8d44\u6e90\u3002
\u9996\u6b21\u5b89\u88c5\u901a\u8fc7 post_install() \u4e0b\u8f7d\u9ed8\u8ba4 MoGe-2 ViT-S Normal\u3001BiRefNet Lite \u4e0e Real-ESRGAN General WDN x4v3\u3002Storage Root \u9ed8\u8ba4 ~/.anyimage\uff0c\u4fdd\u5b58\u73af\u5883\u3001\u6a21\u578b\u3001Job \u4ea7\u7269\u548c\u65e5\u5fd7\u3002\u8bbe\u7f6e\u5165\u53e3\u89c1 AI \u73af\u5883\u7ba1\u7406\u3002
"},{"location":"internals/operators/","title":"Operator \u5b9e\u73b0\u7d22\u5f15","text":"\u6e90\u7801\uff08\u76f8\u5bf9 src/anyimage/\uff09 \u529f\u80fd operators/ai_setup.py AI \u73af\u5883\u7ba1\u7406 operators/clipboard_image/ \u526a\u8d34\u677f\u56fe\u7247 operators/convert_to_plane/ Plane \u4e0e Depth Plane operators/convert_to_panorama/ Panorama operators/cutout_tool/ Cutout operators/frame_tool/operators.py Frame \u591a\u56fe\u5408\u6210 operators/mask_tool.py Mask Alpha \u7f16\u8f91 operators/rectify_tool/operators.py Rectify \u900f\u89c6\u6821\u6b63 operators/remove_background.py Remove Background operators/upscale.py Upscale \u5355\u6587\u4ef6\u529f\u80fd\u6309\u4e1a\u52a1\u547d\u540d\uff1b\u590d\u6742\u529f\u80fd\u5305\u5728 operators.py \u5b9a\u4e49 Operator \u548c\u5165\u53e3\u534f\u8c03\u903b\u8f91\uff0c\u5176\u4f59\u6a21\u5757\u627f\u8f7d\u5177\u4f53\u5b9e\u73b0\u3002\u5305\u7684 __init__.py \u6c47\u603b\u5bfc\u51fa\u4e0e CLASSES \u6ce8\u518c\u6e05\u5355\uff0c\u7c7b\u578b\u5728 operators/__init__.py \u548c\u6269\u5c55 __init__.py \u6c47\u603b\u6ce8\u518c\u3002\u4ea4\u4e92\u5f0f\u5de5\u5177\u7684 WorkspaceTool \u7edf\u4e00\u5b9a\u4e49\u548c\u6ce8\u518c\u4e8e tools.py\u3002AI Operator \u4f7f\u7528\u666e\u901a\u5b57\u5178\u63d0\u4ea4\u4efb\u52a1\uff0c\u5e76\u5728\u4e3b\u7ebf\u7a0b\u54cd\u5e94\u4e2d\u8bfb\u53d6\u6587\u4ef6\u548c\u4fee\u6539 Blender \u6570\u636e\u3002
"},{"location":"internals/operators/ai-setup/","title":"AI \u73af\u5883\u7ba1\u7406","text":"AI \u73af\u5883\u7ba1\u7406\u4ece\u5f53\u524d\u5b89\u88c5\u72b6\u6001\u51fa\u53d1\uff0c\u8865\u9f50\u72ec\u7acb\u8fd0\u884c\u73af\u5883\u548c\u5fc5\u9700\u6a21\u578b\uff0c\u5e76\u63d0\u4f9b\u8bbe\u7f6e\u5165\u53e3\u4e0e\u6a21\u578b\u7f13\u5b58\u91ca\u653e\u64cd\u4f5c\u3002
"},{"location":"internals/operators/ai-setup/#_1","title":"\u6267\u884c\u8fc7\u7a0b","text":"flowchart TD\n Entry[\"Set Up AI Server\"] --> Status[\"\u8bfb\u53d6\u73af\u5883\u4e0e\u5fc5\u9700\u6a21\u578b\u72b6\u6001\"]\n Status --> Ready{\"\u662f\u5426\u5168\u90e8\u5c31\u7eea\uff1f\"}\n Ready -- \"\u662f\" --> Done[\"\u7ed3\u675f\"]\n Ready -- \"\u5426\" --> Environment{\"\u8fd0\u884c\u73af\u5883\u662f\u5426\u5c31\u7eea\uff1f\"}\n Environment -- \"\u5426\" --> Install[\"\u5b89\u88c5\u9694\u79bb Python \u73af\u5883\"]\n Environment -- \"\u662f\" --> Download[\"\u4e0b\u8f7d\u7f3a\u5931\u7684\u5fc5\u9700\u6a21\u578b\"]\n Install --> Download --> Done
SetupAIEnvironment \u662f\u7edf\u4e00\u5165\u53e3\u3002\u9996\u6b21\u4f7f\u7528\u65f6\u5148\u5b89\u88c5\u8fd0\u884c\u73af\u5883\uff0c\u518d\u4e0b\u8f7d\u9ed8\u8ba4\u6a21\u578b\uff1b\u73af\u5883\u5df2\u7ecf\u5b58\u5728\u65f6\uff0c\u53ea\u8865\u9f50\u7f3a\u5931\u6a21\u578b\u3002\u73af\u5883\u5b89\u88c5\u7531 Blender Operator \u542f\u52a8\uff0c\u6a21\u578b\u4e0b\u8f7d\u901a\u8fc7 Job Server \u6267\u884c\u3002
"},{"location":"internals/operators/ai-setup/#_2","title":"\u8282\u70b9\u8bf4\u660e","text":""},{"location":"internals/operators/ai-setup/#_3","title":"\u8bfb\u53d6\u72b6\u6001\uff0c\u9009\u62e9\u4e0b\u4e00\u6b65","text":"\u5165\u53e3\u4f4d\u4e8e src/anyimage/operators/ai_setup.py\u3002SetupAIEnvironment \u901a\u8fc7 properties.py \u4e2d\u7684 ai_status() \u8bfb\u53d6\u73af\u5883\u548c\u6a21\u578b\u72b6\u6001\uff0c\u5e76\u6839\u636e\u7ed3\u679c\u7ed3\u675f\u3001\u5b89\u88c5\u73af\u5883\u6216\u8c03\u7528 DownloadRequiredModels\u3002\u5bf9\u8bdd\u6846\u540c\u65f6\u663e\u793a\u9884\u8ba1\u4e0b\u8f7d\u91cf\u548c\u7f3a\u5931\u6a21\u578b\u540d\u79f0\u3002
runtime.py \u63d0\u4f9b\u5f53\u524d Environment \u4e0e Server \u72b6\u6001\uff1bServer \u6b63\u5fd9\u65f6\u4e0d\u4f1a\u542f\u52a8\u65b0\u7684\u5b89\u88c5\u6d41\u7a0b\u3002OpenAIEnvironmentSettings \u6253\u5f00 AnyImage \u7684\u6269\u5c55\u9996\u9009\u9879\u3002
"},{"location":"internals/operators/ai-setup/#_4","title":"\u5b89\u88c5\u72ec\u7acb\u73af\u5883","text":"\u73af\u5883\u5c1a\u672a\u5c31\u7eea\u65f6\uff0cSetupAIEnvironment \u8c03\u7528 Runtime \u6ce8\u518c\u7684\u5b89\u88c5 Operator\u3002use_mirror \u51b3\u5b9a uv\u3001Python \u548c\u5b89\u88c5\u5305\u7684\u4e0b\u8f7d\u6e90\uff0c\u6a21\u578b\u4f7f\u7528\u6a21\u578b\u76ee\u5f55\u4e2d\u58f0\u660e\u7684\u6765\u6e90\u3002
\u5b89\u88c5\u5b8c\u6210\u540e\u901a\u8fc7 post_install() \u4e0b\u8f7d\u9ed8\u8ba4\u6a21\u578b\uff0c\u6a21\u578b\u4f9d\u8d56\u52a0\u8f7d\u4e8e\u72ec\u7acb Server \u73af\u5883\u3002
"},{"location":"internals/operators/ai-setup/#_5","title":"\u4e0b\u8f7d\u6a21\u578b","text":"ai_setup.py \u4e2d\u7684 DownloadModel \u5904\u7406\u5355\u4e2a\u6a21\u578b\uff0cDownloadRequiredModels \u5904\u7406\u9ed8\u8ba4\u5fc5\u9700\u6a21\u578b\u96c6\u5408\u3002\u4e24\u8005\u5148\u68c0\u67e5 Environment\u3001Blender Online Access \u548c\u6a21\u578b\u8bb0\u5f55\uff0c\u518d\u63d0\u4ea4 download-model \u6216 download-required-models Job\u3002
Job \u5728 server/app.py \u6ce8\u518c\uff1bserver/model_catalog.py \u4fdd\u5b58\u6a21\u578b\u540d\u79f0\u3001\u6587\u4ef6\u548c\u6765\u6e90\uff0cserver/model_download.py \u4e0b\u8f7d\u5e76\u6821\u9a8c\u6587\u4ef6\uff0cserver/model_manager.py \u7ba1\u7406\u6a21\u578b\u76ee\u5f55\u4e0e\u5df2\u52a0\u8f7d Session\u3002\u4e0b\u8f7d\u8fdb\u5ea6\u548c\u9519\u8bef\u901a\u8fc7\u540c\u4e00\u5957 BlendJob Runtime \u8fd4\u56de Blender\u3002
"},{"location":"internals/operators/ai-setup/#_6","title":"\u91ca\u653e\u6a21\u578b\u7f13\u5b58","text":"ai_setup.py \u4e2d\u7684 ClearModels \u8c03\u7528 runtime.clear_resource(\"model_manager\")\uff0c\u91ca\u653e Server \u4e2d\u5df2\u52a0\u8f7d\u7684\u6a21\u578b Session\u3002\u4e0b\u6b21\u63a8\u7406\u4ece\u6a21\u578b\u76ee\u5f55\u91cd\u65b0\u52a0\u8f7d Session\u3002
"},{"location":"internals/operators/clipboard-image/","title":"\u526a\u8d34\u677f\u56fe\u7247","text":"\u526a\u8d34\u677f\u56fe\u7247\u4ece Ctrl/Cmd + V \u5f00\u59cb\uff0c\u628a\u64cd\u4f5c\u7cfb\u7edf\u4e2d\u7684\u56fe\u7247\u53d8\u6210 Packed Blender Image\uff0c\u5e76\u653e\u5230\u5f53\u524d\u7f16\u8f91\u5668\u652f\u6301\u7684\u4f4d\u7f6e\u3002
"},{"location":"internals/operators/clipboard-image/#_2","title":"\u6267\u884c\u8fc7\u7a0b","text":"flowchart TD\n Paste[\"Ctrl/Cmd + V\"] --> Priority{\"\u521a\u6267\u884c\u8fc7 Blender Copy\uff1f\"}\n Priority -- \"\u662f\" --> Native[\"\u4ea4\u56de\u539f\u751f Paste\"]\n Priority -- \"\u5426\" --> Read[\"\u8bfb\u53d6\u7cfb\u7edf\u56fe\u7247\"]\n Read --> Image[\"\u590d\u7528\u6216\u521b\u5efa Packed Image\"]\n Image --> Target{\"\u5f53\u524d\u7f16\u8f91\u5668\"}\n Target --> View[\"Reference / Plane\"]\n Target --> Node[\"Image Node\"]\n Target --> Paint[\"Brush Texture\"]
Windows \u5feb\u6377\u952e\u4f18\u5148\u5904\u7406 Blender \u81ea\u5df1\u7684 Copy/Paste\uff0c\u7cfb\u7edf\u526a\u8d34\u677f\u51fa\u73b0\u65b0\u7684\u56fe\u7247\u5185\u5bb9\u65f6 AnyImage \u63a5\u7ba1\u7c98\u8d34\uff1bmacOS \u548c Linux \u6ca1\u6709\u7cfb\u7edf\u526a\u8d34\u677f\u5e8f\u5217\u53f7\uff0c\u59cb\u7ec8\u7531 AnyImage \u5904\u7406\u7c98\u8d34\u3002
"},{"location":"internals/operators/clipboard-image/#_3","title":"\u8282\u70b9\u8bf4\u660e","text":""},{"location":"internals/operators/clipboard-image/#blender","title":"\u5224\u65ad\u662f\u5426\u4ea4\u7ed9 Blender","text":"operators/clipboard_image/operators.py \u5b9a\u4e49 TrackNativeCopy\u3001PasteClipboardImage \u548c 3D View\u3001Node Editor \u5feb\u6377\u952e\u3002TrackNativeCopy \u8bb0\u5f55 Blender Copy \u65f6\u7684\u7cfb\u7edf\u526a\u8d34\u677f\u5e8f\u5217\u53f7\uff1b\u7c98\u8d34\u65f6\u82e5\u5e8f\u5217\u53f7\u6ca1\u6709\u53d8\u5316\uff0cPasteClipboardImage \u8fd4\u56de PASS_THROUGH\uff0c\u8ba9 Blender \u7ee7\u7eed\u5904\u7406\u5bf9\u8c61\u6216\u8282\u70b9\u7c98\u8d34\u3002
\u540c\u4e00\u6587\u4ef6\u968f\u540e\u8c03\u7528 actions.target_for_context() \u5224\u65ad\u5f53\u524d\u7f16\u8f91\u5668\u662f\u5426\u652f\u6301\u56fe\u7247\u843d\u70b9\u3002
"},{"location":"internals/operators/clipboard-image/#_4","title":"\u8bfb\u53d6\u7cfb\u7edf\u56fe\u7247","text":"clipboard.py \u8d1f\u8d23\u5e73\u53f0\u5dee\u5f02\u3002Windows \u4f9d\u6b21\u5c1d\u8bd5 PNG\u3001DIBV5 \u548c DIB\uff0cDIB \u8865\u6210 BMP\uff1bmacOS \u901a\u8fc7 osascript \u5bfc\u51fa PNG\uff1bLinux \u4f9d\u6b21\u5c1d\u8bd5 wl-paste \u548c xclip \u63d0\u4f9b\u7684\u56fe\u7247\u683c\u5f0f\u3002\u5404\u5e73\u53f0\u8f93\u51fa\u7edf\u4e00\u4e3a\u56fe\u7247\u5b57\u8282\u548c\u6269\u5c55\u540d\uff0c\u518d\u4ea4\u7ed9\u540e\u7eed\u6b65\u9aa4\u3002
"},{"location":"internals/operators/clipboard-image/#packed-image","title":"\u521b\u5efa\u6216\u590d\u7528 Packed Image","text":"actions.py \u5bf9\u56fe\u7247\u5185\u5bb9\u8ba1\u7b97 SHA-256\u3002\u76f8\u540c\u5185\u5bb9\u5df2\u7ecf\u7c98\u8d34\u8fc7\u65f6\u4f1a\u590d\u7528\u73b0\u6709 Packed Image\uff0c\u5426\u5219\u521b\u5efa\u65b0 Image \u5e76 Pack \u5230\u5f53\u524d .blend\uff0c\u907f\u514d\u4f9d\u8d56\u4e34\u65f6\u526a\u8d34\u677f\u6587\u4ef6\u3002
"},{"location":"internals/operators/clipboard-image/#_5","title":"\u653e\u5230\u5f53\u524d\u7f16\u8f91\u5668","text":"\u843d\u70b9\u4ecd\u5728 actions.py \u4e2d\u5b8c\u6210\uff1a3D View \u521b\u5efa Reference \u6216 Plane\uff0cNode Editor \u521b\u5efa\u4e0e\u5f53\u524d\u8282\u70b9\u6811\u5339\u914d\u7684 Image \u8282\u70b9\uff0c\u7ed8\u5236\u6a21\u5f0f\u628a Image \u914d\u7f6e\u4e3a\u5f53\u524d\u753b\u7b14\u7684 Texture\u3002\u9f20\u6807\u4f4d\u7f6e\u548c\u89c6\u56fe\u4f4d\u7f6e\u4e5f\u5728\u8fd9\u91cc\u6362\u7b97\u3002
Plane \u8def\u5f84\u8c03\u7528 convert_to_plane/image_plane.py \u521b\u5efa\u4e2d\u5fc3\u539f\u70b9\u57fa\u7840\u7f51\u683c\uff0c\u5e76\u4ece\u8282\u70b9\u8d44\u4ea7\u52a0\u8f7d O Image Plane\u3002actions.py \u521b\u5efa\u56fe\u50cf\u6750\u8d28\u5e76\u653e\u5165 Mesh \u7b2c 0 \u4e2a\u6750\u8d28\u69fd\uff0c\u8282\u70b9\u7ec4\u53ea\u751f\u6210\u51e0\u4f55\u3002
"},{"location":"internals/operators/convert-to-panorama/","title":"Panorama \u8f6c\u6362","text":"operators/convert_to_panorama/ \u5c06\u9759\u6001\u7b49\u8ddd\u67f1\u72b6 Image Empty \u8f6c\u6362\u4e3a\u5f84\u5411\u6df1\u5ea6\u8868\u9762\uff0c\u63d0\u4ea4\u524d\u88c1\u526a\u51fa\u6700\u5927\u5c45\u4e2d 2:1 \u533a\u57df\u3002operators.py \u63d0\u4ea4\u4efb\u52a1\uff0cobject.py \u5bfc\u5165\u5bf9\u8c61\uff0c__init__.py \u6c47\u603b\u5bfc\u51fa\u4e0e\u6ce8\u518c\u6e05\u5355\u3002
flowchart TD\n A[\u51c6\u5907\u989c\u8272\u4e0e\u5206\u6790\u56fe] --> B[generate-panorama-geometry]\n B --> C[\u91c7\u6837 12 \u4e2a\u900f\u89c6\u89c6\u56fe\u5e76\u63a8\u7406]\n C --> D[\u878d\u5408\u5f84\u5411\u8ddd\u79bb\u4e0e\u6709\u6548\u6027]\n D --> E[\u5199\u51fa depth.exr \u4e0e depth.json]\n E --> F[\u521b\u5efa\u6750\u8d28\u4e0e O Image Depth Panorama]
\u4efb\u52a1\u4f7f\u7528 Preferences \u9009\u62e9\u7684\u51e0\u4f55\u6a21\u578b\u3002\u6e90\u989c\u8272\u7531 Blender \u4fa7\u4fdd\u5b58\uff0cServer \u7684 geometry/panorama.py \u8d1f\u8d23\u89c6\u56fe\u91c7\u6837\u4e0e\u8ddd\u79bb\u878d\u5408\uff0cjobs/panorama.py \u7f16\u6392\u63a8\u7406\u548c\u4ea7\u7269\u5199\u5165\u3002
"},{"location":"internals/operators/convert-to-plane/","title":"Plane \u8f6c\u6362","text":"operators/convert_to_plane/operators.py \u63d0\u4f9b ConvertToPlane\u3001ConvertToDepthPlane\u3001ConvertToReliefPlane \u4e0e GenerateDepthPlane\u3002object.py \u5bfc\u5165\u5bf9\u8c61\u548c\u6750\u8d28\uff0cimage_plane.py \u6784\u5efa\u57fa\u7840\u77e9\u5f62\u7f51\u683c\uff0c__init__.py \u6c47\u603b\u5bfc\u51fa\u4e0e\u6ce8\u518c\u6e05\u5355\u3002
flowchart TD\n A[Image Empty] --> B[\u51c6\u5907\u6750\u8d28\u989c\u8272]\n B --> C{\u8f6c\u6362\u7c7b\u578b}\n C -- Plane --> D[\u56db\u8fb9\u5f62\u4e0e O Image Plane]\n C -- Depth \u6216 Relief --> E[\u9759\u6001\u56fe\u63d0\u4ea4\u51e0\u4f55 Job]\n E --> F[\u52a0\u8f7d\u6df1\u5ea6\u3001\u5143\u6570\u636e\u4e0e\u6cd5\u7ebf]\n F --> G[\u5bf9\u5e94\u8282\u70b9\u4fee\u6539\u5668\u4e0e\u6750\u8d28]\n D --> H[\u521b\u5efa\u5bf9\u8c61\u5e76\u66ff\u6362\u6e90 Empty]\n G --> H
\u4e09\u79cd\u8f6c\u6362\u90fd\u53ea\u63a5\u53d7\u9759\u6001\u56fe\u7247\u3002\u57fa\u7840\u7f51\u683c\u4ee5\u5c40\u90e8\u4e2d\u5fc3\u4e3a\u539f\u70b9\uff0c\u5bf9\u8c61\u77e9\u9635\u8865\u507f\u6e90 Empty \u7684\u663e\u793a\u8303\u56f4\u3002
Depth \u4e0e Relief \u4ece Preferences \u8bfb\u53d6\u51e0\u4f55\u6a21\u578b\u3001\u5206\u8fa8\u7387\u7ea7\u522b\u548c AI \u8f93\u5165\u4e0a\u9650\u3002create_depth_plane_from_result() \u5bfc\u5165\u4ea7\u7269\u5e76\u521b\u5efa\u4fee\u6539\u5668\u3002O Image Depth Plane \u4f7f\u7528\u76f8\u673a XYZ \u4e0e\u5bf9\u8c61\u7a7a\u95f4\u6cd5\u7ebf\u6784\u5efa\u6df1\u5ea6\u8868\u9762\uff1bO Image Relief Plane \u4f7f\u7528\u6df1\u5ea6 Z \u4e0e\u5207\u7ebf\u7a7a\u95f4\u6cd5\u7ebf\u6784\u5efa\u6d6e\u96d5\u3002
\u8282\u70b9\u6784\u5efa\u89c1\u8282\u70b9\u8d44\u4ea7\uff0c\u6587\u4ef6\u534f\u8bae\u89c1Job \u4ea7\u7269\u3002
"},{"location":"internals/operators/cutout-tool/","title":"Cutout","text":"Cutout \u5728\u9759\u6001 Image Empty \u4e0a\u5708\u5b9a Selection\uff0c\u6309\u8f6e\u5ed3\u521b\u5efa Flat\u3001Solid\u3001Depth Symmetry \u6216 Depth Solid\u3002Operator \u5165\u53e3\u4f4d\u4e8e operators/cutout_tool/operators.py\uff0cWorkspaceTool \u58f0\u660e\u4f4d\u4e8e tools.py\uff0cShape \u83dc\u5355\u4f4d\u4e8e interaction.py\uff0c\u9884\u8bbe\u6807\u8bc6\u4e0e\u8282\u70b9\u7ec4\u5bf9\u5e94\u5173\u7cfb\u4f4d\u4e8e shape.py\u3002
flowchart TD\n A[Lasso \u6216 Polyline \u63d0\u4ea4 SelectionPath] --> B[\u9009\u62e9 Shape]\n B --> C[\u6805\u683c\u5316 SelectionMask \u5e76\u8bfb\u53d6\u6e90 RGBA]\n C --> D{\u9700\u8981 Depth \u6216 Normal\uff1f}\n D -- \u662f --> E[\u51c6\u5907 bounds \u77e9\u5f62 RGBA]\n E --> F[generate-cutout-artifacts]\n F --> G[\u52a0\u8f7d Depth\u3001Metadata \u4e0e Normal]\n D -- \u5426 --> H[\u6e90 Alpha \u4e0e SelectionMask \u7ec4\u5408]\n G --> H\n H --> I[\u8fb9\u754c\u6620\u5c04\u3001\u8f6e\u5ed3\u63d0\u53d6\u4e0e\u8d28\u91cf\u4e09\u89d2\u5316]\n I --> J[BaseShape \u4e0e o_balloon]\n J --> K[\u521b\u5efa\u6750\u8d28\u3001\u5bf9\u8c61\u4e0e\u5bf9\u5e94\u8282\u70b9\u4fee\u6539\u5668]
\u9884\u8bbe \u8282\u70b9\u7ec4 AI \u4ea7\u7269 Flat O Image Cutout\uff0cThickness 0 \u53ef\u9009\u5207\u7ebf\u7a7a\u95f4\u6cd5\u7ebf Solid O Image Cutout\uff0cThickness 1 \u53ef\u9009\u5207\u7ebf\u7a7a\u95f4\u6cd5\u7ebf Depth Symmetry O Image Depth Cutout \u4e0e O Image Cutout Symmetry \u6df1\u5ea6\u4e0e\u5bf9\u8c61\u7a7a\u95f4\u6cd5\u7ebf Depth Solid O Image Depth Cutout \u6df1\u5ea6\u4e0e\u5bf9\u8c61\u7a7a\u95f4\u6cd5\u7ebf Flat \u4e0e Solid \u53ef\u4ee5\u4e0d\u5e26 AI \u4ea7\u7269\u751f\u6210\uff1bDepth \u9884\u8bbe\u548c Normal Map \u9700\u8981\u5c31\u7eea\u7684\u51e0\u4f55\u6a21\u578b\uff0cShape \u83dc\u5355\u6309\u8be5\u72b6\u6001\u63d0\u4f9b\u9009\u9879\u3002
"},{"location":"internals/operators/cutout-tool/#_1","title":"\u8f6e\u5ed3\u4e0e\u7f51\u683c","text":"geometry.py \u4ece\u5185\u5bb9 Alpha \u63d0\u53d6\u8fde\u901a\u8f6e\u5ed3\u4e0e\u5b54\u6d1e\uff0c\u6309 Edge Length \u751f\u6210 BaseShape\u3002Edge Length \u662f\u4e16\u754c\u7a7a\u95f4\u7684\u7f51\u683c\u76ee\u6807\u8fb9\u957f\uff0cMinimum Relative Edge Length \u4f1a\u6309\u5185\u5bb9\u8303\u56f4\u63d0\u9ad8\u5176\u4e0b\u754c\u3002
mesh.py \u8d1f\u8d23\u8f6e\u5ed3\u5206\u79bb\u3001\u5b54\u6d1e\u5904\u7406\u3001\u8d28\u91cf\u4e09\u89d2\u5316\u548c\u8fb9\u754c\u652f\u6491\uff0cpolygon.py \u63d0\u4f9b\u8f6e\u5ed3\u7b80\u5316\uff0ctangle.py \u662f\u968f\u5305\u5206\u53d1\u7684 Delaunay \u4e09\u89d2\u5316\u6838\u5fc3\u3002Fine Outline \u5c55\u5f00\u65f6\u4fdd\u7559\u5c0f\u5b54\u4e0e\u7ec6\u8282\u8f6e\u5ed3\uff0c\u5173\u95ed\u65f6\u586b\u6d1e\u5e76\u7b80\u5316\u3002
balloon.py \u8d1f\u8d23 Balloon Profile\uff0c\u6309 Preferences \u9009\u62e9 Poisson \u6216 Teddy\uff0c\u751f\u6210\u6240\u6709\u9884\u8bbe\u5171\u7528\u7684 POINT \u5c5e\u6027 o_balloon\u3002boundary_padding.py \u6309 Boundary Padding \u6cbf\u7ed3\u6784\u5185\u6cd5\u7ebf\u91cd\u91c7\u6837\u8f6e\u5ed3\u9644\u8fd1\u7684\u989c\u8272\u4e0e\u6df1\u5ea6\u3002
"},{"location":"internals/operators/cutout-tool/#ai","title":"AI \u4e0e\u5bf9\u8c61\u521b\u5efa","text":"Server \u63a5\u6536 Selection bounds \u5185\u4fdd\u7559\u6e90 Alpha \u7684 RGBA\uff0c\u4e00\u6b21 MoGe \u63a8\u7406\u6309 generate_depth \u4e0e normal_mode \u8fd4\u56de\u4ea7\u7269\u3002\u6df1\u5ea6\u53c2\u8003\u533a\u57df\u4f7f\u7528\u6240\u9009 Alpha Threshold\uff0cNormal \u4f7f\u7528\u539f\u9884\u6d4b\uff1bMaximum AI Input Size \u53ea\u5f71\u54cd\u5206\u6790\u5206\u8fa8\u7387\u3002
object.py \u7684 create_shape_object() \u6d88\u8d39 BaseShape\u3001Color\u3001Depth \u548c Normal\uff0c\u52a0\u8f7d\u5bf9\u5e94\u8282\u70b9\u7ec4\u3002\u57fa\u7840\u7f51\u683c\u4f4d\u4e8e\u5c40\u90e8 XZ \u5e73\u9762\uff0c\u539a\u5ea6\u6cbf Y \u5c55\u5f00\uff1b\u5bf9\u8c61\u77e9\u9635\u628a\u7f51\u683c\u653e\u5165 Image Empty \u7684\u56fe\u7247\u5e73\u9762\uff0cDepth Symmetry \u989d\u5916\u53e0\u52a0\u5bf9\u79f0\u8282\u70b9\u7ec4\u4e0e\u65b9\u5411\u53c2\u6570\u3002Object Normal \u968f\u65b9\u5411\u540c\u6b65\u8f6c\u6362\u3002
\u6750\u8d28\u4f7f\u7528 IOR 1.2\uff0c\u989c\u8272\u4e0e\u6cd5\u7ebf\u63a5\u5165 Image Layer\uff0c\u6cd5\u7ebf\u6309\u5207\u7ebf\u6216\u5bf9\u8c61\u7a7a\u95f4\u89e3\u91ca\u3002\u8282\u70b9\u8ba1\u7b97\u89c1\u8282\u70b9\u8d44\u4ea7\u3002
"},{"location":"internals/operators/frame/","title":"Frame \u591a\u56fe\u5408\u6210","text":"operators/frame_tool/operators.py \u5b9a\u4e49 FrameImages\u3002projection.py \u8d1f\u8d23\u89c6\u56fe\u6295\u5f71\u3001\u4ea4\u53e0\u548c\u7ed3\u679c\u5e73\u9762\u5b9a\u4f4d\uff0ccompositing.py \u8d1f\u8d23\u50cf\u7d20\u6df1\u5ea6\u6392\u5e8f\u4e0e\u8fb9\u754c\u8986\u76d6\u91c7\u6837\uff0c__init__.py \u5bfc\u51fa Operator \u53ca\u6ce8\u518c\u6e05\u5355\u3002tools.py \u5b9a\u4e49\u5bf9\u5e94\u7684 FrameTool\u3002Frame \u5c06\u9009\u4e2d\u7684\u9759\u6001 Image Empty \u6309\u5f53\u524d\u89c6\u56fe\u5408\u6210\u4e3a\u4e00\u5f20\u56fe\u7247\u3002
flowchart TD\n A[\u62d6\u51fa\u5c4f\u5e55\u77e9\u5f62] --> B[\u51bb\u7ed3\u89c6\u56fe\u77e9\u9635\u5e76\u6536\u96c6\u9009\u4e2d\u9759\u6001\u56fe\u7247]\n B --> C[\u68c0\u67e5\u77e9\u5f62\u4e0e active \u56fe\u7247\u7684\u6709\u6548\u6295\u5c04\u4ea4\u96c6]\n C --> D[\u6309 Region \u4e0e Maximum Frame Resolution \u8ba1\u7b97\u8f93\u51fa\u5c3a\u5bf8]\n D --> E[\u89c2\u5bdf\u5c04\u7ebf\u6295\u5f71\u5230\u5404\u56fe\u7247\u5e73\u9762]\n E --> F[\u6309\u6837\u672c\u6df1\u5ea6\u4ece\u8fdc\u5230\u8fd1\u5408\u6210\uff0c\u7b49\u6df1\u5ea6 active \u4f18\u5148]\n F --> G[\u8fb9\u754c\u8986\u76d6\u91c7\u6837\u4e0e\u72ec\u7acb Alpha]\n G --> H[\u521b\u5efa Packed Image \u5e76\u590d\u7528 active Object]\n H --> I[\u5220\u9664\u5176\u4ed6\u53c2\u4e0e\u56fe\u7247\u5bf9\u8c61\u5e76\u63d0\u4ea4 Undo]
\u6b63\u4ea4\u89c6\u56fe\u63a5\u53d7\u6709\u9650\u6df1\u5ea6\uff0c\u900f\u89c6\u89c6\u56fe\u91c7\u6837\u89c2\u5bdf\u65b9\u5411\u524d\u65b9\u7684\u4ea4\u70b9\u3002\u4ea4\u53e0\u68c0\u67e5\u91c7\u7528\u8fde\u7eed\u6295\u5f71\u8303\u56f4\uff1b\u8f93\u51fa\u5c3a\u5bf8\u53d7 Region\u3001\u6700\u957f\u8fb9\u4e0a\u9650\u548c\u603b\u50cf\u7d20\u4e0a\u9650\u7ea6\u675f\u3002
RGB \u4e0e Alpha \u5206\u522b\u7d2f\u8ba1\uff0c\u4fdd\u7559\u88ab Mask \u9690\u85cf\u7684\u6709\u6548\u989c\u8272\u3002\u8fb9\u754c\u4f7f\u7528\u8986\u76d6\u91c7\u6837\uff0c\u5185\u90e8\u590d\u7528\u76f4\u63a5\u91c7\u6837\uff0c\u907f\u514d\u9ed1\u8fb9\u548c\u4e0d\u5fc5\u8981\u7684\u6a21\u7cca\u3002\u7ed3\u679c\u5e73\u9762\u671d\u5411\u89c2\u5bdf\u8005\uff0c\u4f4d\u7f6e\u7531 active \u56fe\u7247\u7684\u6709\u6548\u6df1\u5ea6\u786e\u5b9a\u3002
Frame \u4fdd\u7559 active \u5bf9\u8c61\u8eab\u4efd\u3001\u540d\u79f0\u548c Collection\uff1b\u56fe\u50cf\u66ff\u6362\u590d\u7528 Common \u7684\u5171\u4eab\u6570\u636e\u4e0e\u5931\u8d25\u6062\u590d\u903b\u8f91\u3002
"},{"location":"internals/operators/mask/","title":"Mask Alpha \u7f16\u8f91","text":"operators/mask_tool.py \u5b9a\u4e49 EditImageAlpha\uff0c\u4f7f\u7528 common/viewport.py \u7684 ImageGesture \u7ba1\u7406 Lasso\u3001Brush \u4e0e Polyline\uff1btools.py \u5b9a\u4e49\u5bf9\u5e94\u7684 MaskTool\u3002
flowchart TD\n A[\u51bb\u7ed3 Scene \u7684 Gesture\u3001Mode\u3001Radius] --> B[\u5c4f\u5e55\u624b\u52bf\u4e0e Overlay]\n B --> C[\u5b8c\u6210\u540e\u6295\u5f71\u5e76\u751f\u6210\u8986\u76d6 M]\n C --> D[\u8bfb\u53d6\u6e90 RGBA]\n D --> E[\u6309\u6a21\u5f0f\u8ba1\u7b97 Alpha]\n E --> F[\u4fdd\u7559 RGB \u548c\u6e90\u753b\u5e03\u5c3a\u5bf8]\n F --> G[\u66ff\u6362 Packed Image \u5e76\u63d0\u4ea4\u4e00\u4e2a Undo]
\u6a21\u5f0f \u6e90 Alpha A \u4e0e\u8986\u76d6 M \u7684\u7ed3\u679c Set A \u00d7 M Extend max(A, M) Subtract A \u00d7 (1 \u2212 M) Brush \u62d6\u52a8\u65f6\u7ef4\u62a4\u7b80\u5316\u5c4f\u5e55\u8def\u5f84\u3001\u5706\u5f62\u5370\u8bb0\u4e0e\u8fde\u63a5\u6761\u7684\u5e76\u96c6\u9884\u89c8\uff1b\u91ca\u653e\u65f6\u4e00\u6b21\u751f\u6210\u56fe\u7247\u8986\u76d6\u3002Polyline \u4f7f\u7528\u9010\u70b9\u8def\u5f84\uff0c\u81f3\u5c11\u4e09\u4e2a\u70b9\u540e\u901a\u8fc7\u95ed\u5408\u5708\u3001\u53cc\u51fb\u6216 Enter \u5b8c\u6210\uff0cBackspace \u5220\u9664\u672b\u70b9\u3002
\u7ed3\u679c\u4fdd\u7559 Empty \u7684\u8eab\u4efd\u3001\u77e9\u9635\u3001\u663e\u793a\u5c3a\u5bf8\u548c\u504f\u79fb\u3002\u5168\u900f\u660e\u7ed3\u679c\u6709\u6548\uff0c\u53d6\u6d88\u6216\u5207\u6362\u5de5\u5177\u6e05\u7406\u672a\u63d0\u4ea4\u7684 Overlay\uff1b\u5171\u4eab Image \u901a\u8fc7\u7edf\u4e00\u66ff\u6362\u5165\u53e3\u5206\u6d41\u3002
"},{"location":"internals/operators/rectify/","title":"Rectify \u900f\u89c6\u6821\u6b63","text":"operators/rectify_tool/operators.py \u5b9a\u4e49 RectifyImagePerspective\uff0c\u5c06\u56fe\u7247\u5185\u7684\u56db\u89d2\u533a\u57df\u6821\u6b63\u4e3a\u77e9\u5f62\u3002geometry.py \u8d1f\u8d23\u56db\u89d2\u9a8c\u8bc1\u4e0e\u50cf\u7d20\u6821\u6b63\uff0cpreview.py \u8d1f\u8d23\u9884\u89c8\u56fe\u3001Overlay \u548c\u5bbd\u9ad8\u6bd4\u63a7\u5236\uff0c__init__.py \u5bfc\u51fa Operator \u53ca\u6ce8\u518c\u6e05\u5355\uff1btools.py \u5b9a\u4e49\u5bf9\u5e94\u7684 RectifyTool\u3002
flowchart TD\n A[\u70b9\u9009\u56db\u89d2] --> B[\u89c4\u8303\u4e3a\u51f8 Quad \u5e76\u68c0\u67e5\u56fe\u7247\u4ea4\u53e0]\n B --> C[512\u00d7512 \u9884\u89c8\u4e0e\u5bbd\u9ad8\u6bd4\u8c03\u6574]\n C --> D[\u6309\u50cf\u7d20\u5bc6\u5ea6\u548c\u8f93\u51fa\u4e0a\u9650\u786e\u5b9a\u5c3a\u5bf8]\n D --> E[\u5206\u5757 Homography \u4e0e\u9884\u4e58 Alpha \u63d2\u503c]\n E --> F[\u6309\u53ef\u89c1 Alpha \u88c1\u526a]\n F --> G[\u6620\u5c04 placement bounds \u5e76\u66ff\u6362 Packed Image]
\u56db\u89d2\u5141\u8bb8\u4efb\u610f\u70b9\u51fb\u987a\u5e8f\uff0c\u9000\u5316\u6216\u975e\u51f8\u8f93\u5165\u5728\u63d0\u4ea4\u524d\u6821\u9a8c\u3002\u9884\u89c8\u6839\u636e\u6e90\u989c\u8272\u7a7a\u95f4\u914d\u7f6e\u663e\u793a\uff0c\u50cf\u7d20\u91cd\u91c7\u6837\u590d\u7528 common/image.py\u3002\u8f93\u51fa\u6700\u957f\u8fb9\u4e0a\u9650 8192\uff0c\u603b\u50cf\u7d20\u4e0a\u9650 16,777,216\u3002
replace_empty_image() \u6839\u636e\u6821\u6b63\u533a\u57df\u7684 placement bounds \u8c03\u6574\u753b\u6846\uff0c\u4fdd\u7559\u6e90 Image \u540d\u79f0\u3001\u5bf9\u8c61\u8eab\u4efd\u548c\u5171\u4eab\u5f15\u7528\u8bed\u4e49\u3002
"},{"location":"internals/operators/remove-background/","title":"Remove Background","text":"operators/remove_background.py \u4ece Image Empty \u6216\u5f53\u524d Shader Image Texture \u51c6\u5907\u8f93\u5165\u3002RemoveImageBackground \u534f\u8c03\u8bbe\u7f6e\u4e0e\u8f93\u5165\uff0cRunBackgroundRemoval \u63d0\u4ea4 Job \u5e76\u5e94\u7528\u7ed3\u679c\u3002
flowchart TD\n A[ImageEditTarget \u53d6\u5f97\u7f16\u8f91\u76ee\u6807] --> B[\u51c6\u5907\u56fe\u50cf\u8f93\u5165]\n B --> C[remove-background Job]\n C --> D[\u6240\u9009\u80cc\u666f\u6a21\u578b\u751f\u6210\u524d\u666f Alpha]\n D --> E{\u8f93\u5165\u7c7b\u578b}\n E -- \u666e\u901a\u56fe\u7247 --> F[\u900f\u660e PNG \u524d\u666f]\n E -- HDR --> G[alpha.npy]\n F --> H[\u5e94\u7528\u7ed3\u679c\u4e0e Undo]\n G --> H
server/jobs/remove_background.py \u8bfb\u53d6\u5355\u5f20\u8f93\u5165\u5e76\u8c03\u7528 server/models/background.py\uff0c\u652f\u6301 BiRefNet \u548c BEN2\u3002\u6a21\u578b\u524d\u666f Alpha \u4e0e\u6e90 Alpha \u5408\u6210\u3002
\u666e\u901a\u7ed3\u679c\u901a\u8fc7 ImageEditTarget \u4fdd\u7559\u5171\u4eab\u56fe\u50cf\u5f15\u7528\u4e0e\u5e27\u8bbe\u7f6e\u3002HDR \u4f7f\u7528 common/hdr_image.py \u7684 HdrBackgroundInput \u51c6\u5907\u5206\u6790\u8f93\u5165\uff0c\u5e76\u5c06\u8fd4\u56de Alpha \u5e94\u7528\u4e8e\u539f\u6d6e\u70b9 RGB\u3002Operator \u8d1f\u8d23\u4e34\u65f6\u8f93\u5165\u6e05\u7406\u3002
"},{"location":"internals/operators/upscale/","title":"Upscale","text":"operators/upscale.py \u4ece Image Empty \u6216\u5f53\u524d Shader Image Texture \u751f\u6210 2\u00d7 \u7ed3\u679c\uff0c\u6e90\u56fe\u957f\u8fb9\u5fc5\u987b\u5c0f\u4e8e Maximum AI Input Size\u3002
flowchart TD\n A[\u68c0\u67e5\u6e90\u56fe\u5c3a\u5bf8\u5e76\u51bb\u7ed3\u6a21\u578b\u8bbe\u7f6e] --> B[\u51c6\u5907\u56fe\u7247\u8f93\u5165]\n B --> C[upscale-image \u5355\u5f20\u5904\u7406]\n C --> D[\u5206\u5757\u6267\u884c 4\u00d7 RGB \u63a8\u7406]\n D --> E[\u7edf\u4e00\u7f29\u653e\u4e3a\u6e90\u56fe 2\u00d7]\n E --> F[\u539f Alpha \u72ec\u7acb Lanczos \u7f29\u653e]\n F --> G[ImageEditTarget \u5e94\u7528\u7ed3\u679c\u5e76\u63d0\u4ea4 Undo]
server/models/upscale.py \u5904\u7406\u8f93\u5165\u4e0a\u9650\u548c\u6700\u7ec8\u5c3a\u5bf8\uff0connx_upscale.py \u6267\u884c Real-ESRGAN \u4e0e HAT \u6a21\u578b\u3002ModelManager \u7ba1\u7406 Session\uff1bProvider \u8d44\u6e90\u9519\u8bef\u4f1a\u91ca\u653e\u5f53\u524d Session \u5e76\u8fd4\u56de\u5904\u7406\u5efa\u8bae\u3002
"},{"location":"en/#image-is-all-you-need","title":"IMAGE is All You Need","text":"AnyImage is an image toolkit for Blender by OmooLab. It turns images into more than references: paste an image, select what you need, and transform it into a scene element with materials, contours, and depth.
"},{"location":"en/#start-directly-from-an-image","title":"Start directly from an image","text":"Press Ctrl+Shift+V in the 3D View or Node Editor (Cmd+Shift+V on macOS) to paste an image from the clipboard directly into the current workspace. There is no need to save the image first or interrupt your workflow.
You can also continue working with existing images. Select an Image Empty, right-click to open the AnyImage menu, and access the most common actions from there.
"},{"location":"en/#one-image-multiple-spatial-forms","title":"One image, multiple spatial forms","text":" - Plane / Depth Plane: Turn an image into a flat or dimensional plane.
- Cutout: Select a subject and create a Surface, Balloon, or Depth Shape.
- Image tools: Reframe images, edit transparent areas, correct perspective, remove backgrounds, and upscale.
"},{"location":"en/#quick-start","title":"Quick start","text":"Drag the button below into the Blender window to install. The first drag prompts you to add the AnyImage extension repository. Confirm it, then drag the button again.
Drag into Blender to install Windows \u2013 78.3\u00a0MB \u2026or download and use Install from Disk Drag into Blender to install macOS - Apple Silicon \u2013 57.5\u00a0MB \u2026or download and use Install from Disk Drag into Blender to install Linux \u2013 71.0\u00a0MB \u2026or download and use Install from Disk"}]}
\ No newline at end of file
diff --git a/1.0.x/sitemap.xml b/1.0.x/sitemap.xml
index 97f93a0..7368f55 100755
--- a/1.0.x/sitemap.xml
+++ b/1.0.x/sitemap.xml
@@ -2,280 +2,280 @@
https://docs.omoolab.xyz/anyimage/1.0.x/
- 2026-09-18
+ 2026-09-22
daily
https://docs.omoolab.xyz/anyimage/1.0.x/getting-started/installation/
- 2026-09-18
+ 2026-09-22
daily
https://docs.omoolab.xyz/anyimage/1.0.x/internals/
- 2026-09-18
+ 2026-09-22
daily
https://docs.omoolab.xyz/anyimage/1.0.x/internals/architecture/
- 2026-09-18
+ 2026-09-22
daily
https://docs.omoolab.xyz/anyimage/1.0.x/internals/common/
- 2026-09-18
+ 2026-09-22
daily
https://docs.omoolab.xyz/anyimage/1.0.x/internals/development/
- 2026-09-18
+ 2026-09-22
daily
https://docs.omoolab.xyz/anyimage/1.0.x/internals/node-assets/
- 2026-09-18
+ 2026-09-22
daily
https://docs.omoolab.xyz/anyimage/1.0.x/internals/outputs/
- 2026-09-18
+ 2026-09-22
daily
https://docs.omoolab.xyz/anyimage/1.0.x/internals/runtime/
- 2026-09-18
+ 2026-09-22
daily
https://docs.omoolab.xyz/anyimage/1.0.x/internals/operators/
- 2026-09-18
+ 2026-09-22
daily
https://docs.omoolab.xyz/anyimage/1.0.x/internals/operators/ai-setup/
- 2026-09-18
+ 2026-09-22
daily
https://docs.omoolab.xyz/anyimage/1.0.x/internals/operators/clipboard-image/
- 2026-09-18
+ 2026-09-22
daily
https://docs.omoolab.xyz/anyimage/1.0.x/internals/operators/convert-to-panorama/
- 2026-09-18
+ 2026-09-22
daily
https://docs.omoolab.xyz/anyimage/1.0.x/internals/operators/convert-to-plane/
- 2026-09-18
+ 2026-09-22
daily
https://docs.omoolab.xyz/anyimage/1.0.x/internals/operators/cutout-tool/
- 2026-09-18
+ 2026-09-22
daily
https://docs.omoolab.xyz/anyimage/1.0.x/internals/operators/frame/
- 2026-09-18
+ 2026-09-22
daily
https://docs.omoolab.xyz/anyimage/1.0.x/internals/operators/mask/
- 2026-09-18
+ 2026-09-22
daily
https://docs.omoolab.xyz/anyimage/1.0.x/internals/operators/rectify/
- 2026-09-18
+ 2026-09-22
daily
https://docs.omoolab.xyz/anyimage/1.0.x/internals/operators/remove-background/
- 2026-09-18
+ 2026-09-22
daily
https://docs.omoolab.xyz/anyimage/1.0.x/internals/operators/upscale/
- 2026-09-18
+ 2026-09-22
daily
https://docs.omoolab.xyz/anyimage/1.0.x/en/
- 2026-09-18
+ 2026-09-22
daily
https://docs.omoolab.xyz/anyimage/1.0.x/en/getting-started/installation/
- 2026-09-18
+ 2026-09-22
daily
https://docs.omoolab.xyz/anyimage/1.0.x/en/internals/
- 2026-09-18
+ 2026-09-22
daily
https://docs.omoolab.xyz/anyimage/1.0.x/en/internals/architecture/
- 2026-09-18
+ 2026-09-22
daily
https://docs.omoolab.xyz/anyimage/1.0.x/en/internals/common/
- 2026-09-18
+ 2026-09-22
daily
https://docs.omoolab.xyz/anyimage/1.0.x/en/internals/development/
- 2026-09-18
+ 2026-09-22
daily
https://docs.omoolab.xyz/anyimage/1.0.x/en/internals/node-assets/
- 2026-09-18
+ 2026-09-22
daily
https://docs.omoolab.xyz/anyimage/1.0.x/en/internals/outputs/
- 2026-09-18
+ 2026-09-22
daily
https://docs.omoolab.xyz/anyimage/1.0.x/en/internals/runtime/
- 2026-09-18
+ 2026-09-22
daily
https://docs.omoolab.xyz/anyimage/1.0.x/en/internals/operators/
- 2026-09-18
+ 2026-09-22
daily
https://docs.omoolab.xyz/anyimage/1.0.x/en/internals/operators/ai-setup/
- 2026-09-18
+ 2026-09-22
daily
https://docs.omoolab.xyz/anyimage/1.0.x/en/internals/operators/clipboard-image/
- 2026-09-18
+ 2026-09-22
daily
https://docs.omoolab.xyz/anyimage/1.0.x/en/internals/operators/convert-to-panorama/
- 2026-09-18
+ 2026-09-22
daily
https://docs.omoolab.xyz/anyimage/1.0.x/en/internals/operators/convert-to-plane/
- 2026-09-18
+ 2026-09-22
daily
https://docs.omoolab.xyz/anyimage/1.0.x/en/internals/operators/cutout-tool/
- 2026-09-18
+ 2026-09-22
daily
https://docs.omoolab.xyz/anyimage/1.0.x/en/internals/operators/frame/
- 2026-09-18
+ 2026-09-22
daily
https://docs.omoolab.xyz/anyimage/1.0.x/en/internals/operators/mask/
- 2026-09-18
+ 2026-09-22
daily
https://docs.omoolab.xyz/anyimage/1.0.x/en/internals/operators/rectify/
- 2026-09-18
+ 2026-09-22
daily
https://docs.omoolab.xyz/anyimage/1.0.x/en/internals/operators/remove-background/
- 2026-09-18
+ 2026-09-22
daily
https://docs.omoolab.xyz/anyimage/1.0.x/en/internals/operators/upscale/
- 2026-09-18
+ 2026-09-22
daily
diff --git a/1.0.x/sitemap.xml.gz b/1.0.x/sitemap.xml.gz
index aa89864..b7ac383 100755
Binary files a/1.0.x/sitemap.xml.gz and b/1.0.x/sitemap.xml.gz differ