# 🎬 ComfyUI AE Animation
## 🎥 演示视频
[](https://www.bilibili.com/video/BV1yW28B3ETN)
**👉 [点击这里观看完整演示视频](https://www.bilibili.com/video/BV1yW28B3ETN)**
---
> ⚠️ **预览版说明**:本项目目前为预览版本,功能正在持续开发中。后续会持续增加新功能和优化体验,欢迎反馈和建议!
---
## 🙏 特别鸣谢
特别感谢 [**Terry Jia (jtydhr88)**](https://github.com/jtydhr88) 在项目开发过程中给予的宝贵帮助和关键思路指导!
---
## 📝 更新日志
### 🚀 V3.0 大版本更新(2025-12-09)
#### 🎮 新增 Camera图层交互
- ✅ **Camera图层可选择**:选中Camera后,鼠标/键盘交互直接控制摄像机
- ✅ **统一交互逻辑**:Camera与普通图层操作一致(滚轮缩放/旋转方向键移动)
- ✅ **3D旋转后端同步**:图层rotationX/Y/Z正确输出到最终渲染
- ✅ **摄像机Z轴预览**:推拉效果实时预览,前后端数据对齐
- ✅ **前景跟随摄像机**:camera-only模式下前景正确跟随摄像机XY/旋转
#### 🖼️ 新增 GPU渲染引擎
- ✅ **WebGPU加速**:全新GPU渲染管线,大幅提升渲染性能
- ✅ **全景背景渲染**:独立Buffer管理,支持纹理重复
- ✅ **实时预览同步**:GPU预览与后端输出完全一致
#### 🎥 新增 三维摄像机系统
- ✅ **完整摄像机参数**:`cam_pos_x/y/z`、`cam_yaw/pitch/roll`、`cam_fov`
- ✅ **透视投影算法**:根据图层深度动态计算旋转效果
- ✅ **GPU/Canvas统一**:两种渲染器行为完全一致
- 📚 **使用指南**:[三维摄像机使用指南](docs/3D_CAMERA_GUIDE.md)
#### 🔧 架构重构
- ✅ **Vue 3重写**:使用Composition API完全重构前端
- ✅ **组件化架构**:提高可维护性和可扩展性
- ✅ **性能优化**:渲染性能和交互响应大幅提升
---
## 📋 项目简介
**ComfyUI AE Animation** 是一个单节点版的 After Effects 风格时间轴编辑器,为 ComfyUI 提供强大的动画制作能力。
### ✨ 核心功能
- 🎨 **多图层管理**:支持前景/背景图层管理,灵活组织动画元素
- 🎯 **关键帧动画**:位置、缩放、旋转、透明度等属性关键帧动画
- 🎥 **三维摄像机**:完整的 3D 摄像机系统,支持位置、旋转、FOV 控制,创建真实的透视效果
- 🖌️ **Mask 编辑**:画笔工具创建自定义遮罩,精确控制图层显示区域
- 📍 **路径动画**:贝塞尔路径工具创建平滑的运动轨迹
- ✂️ **AI Extract**:智能背景提取,自动创建前景图层
- 🎞️ **实时预览**:Canvas 实时渲染预览,所见即所得
- ⚙️ **参数控制**:UI 内直接调整分辨率、FPS、总帧数等项目参数
---
## 🚀 快速开始
### 安装
#### 方式一:ComfyUI Manager(推荐)
1. 打开 ComfyUI Manager
2. 在搜索框中输入 `ComfyUI-AE-Animation` 或 `AE Animation`
3. 点击安装
4. 重启 ComfyUI
#### 方式二:Git Clone
```bash
cd ComfyUI/custom_nodes
git clone https://github.com/wallen0322/ComfyUI-AE-Animation.git
# 重启 ComfyUI
```
### 首次使用
1. **启动节点**
- 重启 ComfyUI 后,右上角会出现 **AE Timeline** 按钮
- 点击按钮会自动创建并选中 `AE Animation` 节点,并打开时间轴 UI
- 或者直接在节点面板添加 `AE Animation` 节点,然后点击按钮打开 UI
2. **设置项目参数**
- 在 UI 顶部直接输入 **Width**、**Height**、**FPS**、**Frames**
- 点击 **Save** 按钮将参数同步回节点 widgets
- 建议分辨率:1920×1080、1280×720 等标准尺寸
3. **添加图层**
- 点击 **+FG** 添加前景图层(通过文件选择器选择本地图片)
- 点击 **+BG** 添加背景图层
- 或者通过节点输入端连接图像(自动识别为图层)
4. **开始创作**
- 选择图层,调整 X、Y、Scale、Rotation、Opacity 等属性
- 在时间轴上添加关键帧,创建动画
- 使用工具进行 Mask、路径、Extract 等操作
---
## 📖 详细使用说明
### 🎛️ 界面布局
#### 顶部工具栏
- **项目操作区**(左侧)
- `Save Proj`:保存工程文件(JSON 格式),包含所有图层、关键帧、Mask 等数据
- `Load Proj`:加载之前保存的工程文件
- `Clear Cache`:清理未使用图层的图片缓存,释放内存
- **运行控制区**(中间)
- `Refresh`:刷新界面
- `▶ Run Node`:运行节点,生成动画序列
- `保存到节点`:将当前设置保存到节点 widgets
- **图层操作区**(右侧)
- `+FG`:添加前景图层
- `+BG`:添加背景图层
- `✕`:关闭时间轴 UI
#### 左侧属性面板(Inspector)
**图层信息卡片**
- 显示当前选中图层的名称和类型(FG/BG)
- 显示图层资源状态(Image Asset / Empty Asset)
**变换属性(Transform)**
- **X / Y**:图层位置坐标(相对于画布中心)
- **Scale**:缩放比例(1.0 = 100%,可调整到 0.1~10.0)
- **Rotate**:旋转角度(0~360 度)
- **Opacity**:透明度滑块(0~100%)
**工具区(Tools)**
- **Mask**:启用 Mask 画笔模式,在画布上涂抹创建遮罩
- **Erase**:启用擦除模式,擦除 Mask 区域
- **Path**:创建贝塞尔路径,生成路径动画
- **Extract**:背景提取工具,从背景中提取区域创建新前景层
**画笔设置**
- **Mask Brush**:Mask 画笔大小(1~100px)
- **Extract Brush**:Extract 画笔大小(1~100px)
**应用/清除**
- `Apply`:应用当前工具的效果
- `Clear`:清除当前工具的效果
#### 中间画布区域(Viewport)
**顶部工具栏**
- 显示项目信息:`宽度×高度 @ 帧率fps`
- 画布适配模式:
- `Fit`:保持宽高比,完整显示(可能有黑边)
- `Fill`:保持宽高比,填充画布(可能裁切)
- `Stretch`:拉伸填充(可能变形)
- 显示总时长:`Duration 00:00:XX`
**画布区域**
- 实时预览当前时间点的画面
- 支持鼠标拖拽移动图层
- 支持滚轮缩放图层
- 显示网格背景,方便对齐
#### 底部时间轴(Timeline)
**顶部控制栏**
- **关键帧操作**(左侧)
- `+ Key`:在当前时间点添加关键帧
- `Del Key`:删除当前时间点的关键帧
- `Clear All`:清除当前图层所有关键帧
- **播放控制**(中间)
- 时间显示:`00:00:XX`(当前播放时间)
- `⏮`:跳转到开始(时间 = 0)
- `▶ / ❚❚`:播放/暂停(空格键快捷键)
- 时间滑块:拖拽调整当前时间
- **缩放控制**(右侧)
- `Zoom`:时间轴缩放滑块,调整时间轴显示范围
**图层列表**(左侧)
- 显示所有图层,按顺序排列
- 点击图层名称选中图层
- `▸ / ▾`:展开/折叠图层详细信息
- `👁`:显示/隐藏图层
- `🔒`:锁定/解锁图层
- 图层类型标识:`B`(Background)或 `F`(Foreground)
**时间轨道**(右侧)
- 显示时间标尺(0s, 1s, 2s...)
- 每个图层对应一条轨道
- 轨道上的彩色条表示图层在时间轴上的存在范围
- 关键帧标记:`◆` 菱形标记表示关键帧位置
- 播放头:红色竖线表示当前播放时间
---
### 🎨 详细操作指南
#### 1. 画布交互操作
**基础图层操作**
| 操作 | 效果 |
|------|------|
| 鼠标左键拖拽 | 移动图层位置(X/Y) |
| 方向键 ←→↑↓ | 微调图层位置(步进 1px) |
| Shift + 方向键 | 快速移动(步进 10px) |
| Ctrl + ↑↓ | 调整图层 Z 轴深度(步进 10) |
| R 键 | 重置图层变换(位置、缩放、旋转、透明度) |
**滚轮变换操作**(需选中图层)
| 操作 | 效果 |
|------|------|
| 滚轮 | 缩放图层(Scale) |
| Shift + 滚轮 | X 轴旋转(RotationX,3D 翻转效果) |
| Ctrl + 滚轮 | Y 轴旋转(RotationY,3D 翻转效果) |
| Alt + 滚轮 | Z 轴旋转(RotationZ,平面旋转) |
| Ctrl + Shift + 滚轮 | 调整 Z 轴位置(深度) |
**3D 摄像机模式**(启用 Camera,未启用 Pano)
| 操作 | 效果 |
|------|------|
| 左键拖拽(无选中图层) | 摄像机轨道旋转(Yaw/Pitch) |
| Shift + 左键拖拽 | 摄像机滚转(Roll) |
| 中键拖拽 | 摄像机平移(Pos X/Y) |
| 右键拖拽 | 摄像机推拉(Pos Z) |
| 滚轮(无选中图层) | 摄像机推拉(Pos Z) |
**全景模式**(启用 Pano)
| 操作 | 效果 |
|------|------|
| 中键/右键拖拽 | 全景旋转(Yaw/Pitch) |
| 左键拖拽(无选中图层或 Alt) | 平移偏移(Offset X/Y) |
| 滚轮(无选中图层) | 调整视野角度(FOV) |
**工具模式操作**(Mask/Extract)
| 操作 | 效果 |
|------|------|
| 左键拖拽 | 绘制区域 |
| Shift + 左键 | 擦除区域 |
| 右键拖拽 | 擦除区域 |
| Alt + 左键 | 擦除区域 |
#### 2. 图层管理
**添加图层**
- 点击顶部 `+FG` 或 `+BG` 按钮
- 在文件选择器中选择图片文件
- 图片会自动压缩到项目分辨率,优化性能
**选择图层**
- 在时间轴左侧图层列表中点击图层名称
- 或使用下拉菜单选择图层
- 选中后,左侧属性面板会显示该图层的属性
**调整图层属性**
- 在左侧属性面板的 Transform 区域直接输入数值
- 或在画布上直接拖拽图层(调整 X、Y)
- 使用滚轮缩放图层(调整 Scale)
- 使用修饰键 + 滚轮调整旋转(见上方交互表格)
**图层排序**
- 在时间轴图层列表中使用 `▲` / `▼` 按钮调整图层顺序
- 图层顺序影响渲染顺序(上层覆盖下层)
**删除图层**
- 在图层列表中点击删除按钮(如果可用)
- 或通过节点输入端断开连接
#### 3. 关键帧动画
**添加关键帧**
1. 在时间轴上拖拽播放头到目标时间点
2. 选择要动画的图层
3. 调整图层属性(X、Y、Scale、Rotate、Opacity)
4. 点击 `+ Key` 按钮添加关键帧
5. 重复步骤 1-4,在不同时间点添加关键帧
**编辑关键帧**
- 点击时间轴上的关键帧标记(◆)选中关键帧
- 调整图层属性,关键帧会自动更新
- 或直接拖拽关键帧标记调整时间位置
**删除关键帧**
- 点击时间轴上的关键帧标记
- 点击 `Del Key` 按钮删除
- 或点击 `Clear All` 清除所有关键帧
**播放预览**
- 点击 `▶` 按钮开始播放
- 点击 `❚❚` 暂停播放
- 使用空格键快速播放/暂停
- 拖拽时间滑块手动调整时间
#### 4. Mask 遮罩功能
**创建 Mask**
1. 选择前景图层
2. 点击 `Mask` 工具按钮
3. 调整 `Mask Brush` 画笔大小
4. 在画布上涂抹要遮罩的区域
- 白色区域:不透明(显示)
- 黑色区域:透明(隐藏)
5. 点击 `Apply` 应用 Mask
**编辑 Mask**
- 继续涂抹添加遮罩区域
- 按住 `Shift` 键或右键擦除遮罩区域
- 调整画笔大小适应不同区域
**清除 Mask**
- 点击 `Clear` 按钮清除当前图层的 Mask
#### 5. 路径动画
**创建路径**
1. 选择要动画的图层
2. 点击 `Path` 工具按钮
3. 在画布上依次点击 4 个点:
- 起点
- 控制点 1
- 控制点 2
- 终点
4. 拖动控制点调整路径形状
5. 点击 `Apply` 生成路径关键帧动画
**编辑路径**
- 拖动路径上的控制点调整形状
- 路径会自动更新关键帧
#### 6. Extract 背景提取
**提取背景区域**
1. 确保已加载背景图层
2. 点击 `Extract` 工具按钮
3. 调整 `Extract Brush` 画笔大小
4. 在背景上涂抹要提取的区域
- 按住 `Shift` 键或右键擦除错误涂抹
5. 点击 `Apply` 应用提取
**提取效果**
- 背景的选中区域会自动应用模糊效果
- 选中的内容会创建为新的前景图层(命名为 `extracted_X`)
- 新图层可以独立调整位置、缩放、旋转等属性
- 可以添加关键帧实现动画效果
- 支持多次提取创建多个图层
**应用场景**
- 人物抠图后对原背景进行背景虚化
- 提取背景的某个元素单独动画
- 创建景深效果(前景清晰,背景模糊)
#### 7. 三维摄像机(新功能)
**启用摄像机**
1. 在项目设置面板中找到 "🎥 3D 摄像机" 部分
2. 勾选 "启用" 复选框
3. 摄像机参数立即生效
**摄像机参数**
- **位置**
- X:水平位置(左右移动)
- Y:垂直位置(上下移动)
- Z (距离):摄像机与场景的距离(默认 1000)
- **旋转**
- Yaw (Y轴):左右旋转(水平旋转)
- Pitch (X轴):上下旋转(俯仰)
- Roll (Z轴):滚转(画面倾斜)
- **投影**
- FOV:视野角度(1°-179°,默认 90°)
**创建 3D 效果**
1. 为不同图层设置不同的 Z 值
- 前景图层:Z = -200 到 200
- 中景图层:Z = 0
- 背景图层:Z = 200 到 500
2. 调整摄像机旋转参数观察透视效果
3. 添加关键帧创建摄像机动画
**应用场景**
- 视差滚动效果
- 摄像机推拉镜头
- 环绕旋转动画
- 景深效果
📚 **详细指南**:查看 [三维摄像机使用指南](docs/3D_CAMERA_GUIDE.md)
⚠️ **预览说明**:
- UI预览使用2D近似,仅供参考
- 最终渲染使用完整3D透视投影
- 全景模式需要启用摄像机
- 详见 [3D预览限制说明](docs/3D_PREVIEW_LIMITATIONS.md)
#### 8. 画布操作
**缩放画布**
- 使用右上角的 `Zoom` 滑块(25%~200%)
- 适合处理竖屏分辨率,避免裁切
**适配模式**
- `Fit`:保持宽高比,完整显示(推荐用于预览)
- `Fill`:保持宽高比,填充画布(推荐用于导出)
- `Stretch`:拉伸填充(可能变形,不推荐)
**拖拽图层**
- 在画布上直接拖拽图层调整位置
- 实时更新 X、Y 属性值
**缩放图层**
- 使用鼠标滚轮缩放图层
- 实时更新 Scale 属性值
---
## 🔧 节点说明
### AE Animation 节点
**输入参数**(可在 UI 顶部调节,同步回节点)
- `width`:项目宽度(像素)
- `height`:项目高度(像素)
- `fps`:帧率(1~120)
- `total_frames`:总帧数
**隐藏参数**(UI 内部使用,保留但不显示)
- `mask_expansion`:Mask 扩展/收缩(-10~10)
- `mask_feather`:Mask 羽化(0~20)
- `layers_keyframes`:图层和关键帧数据(JSON)
- `start_frame`:开始帧
- `end_frame`:结束帧
**输入连接**
- `background_image`:背景图片(可选)
- `foreground_images`:前景图片(可选,支持批量输入)
**输出**
- `frames`:渲染的图像序列(IMAGE 类型)
- `mask_frames`:前景遮罩序列(MASK 类型)
---
## 💾 数据管理
### 保存工程
- 点击 `Save Proj` 按钮
- 选择保存位置,输入文件名
- 工程文件包含:
- 所有图层信息(名称、类型、属性)
- 所有关键帧数据
- Mask 数据
- 路径数据
- Extract 图层数据
- 项目参数(分辨率、FPS、总帧数)
### 加载工程
- 点击 `Load Proj` 按钮
- 选择之前保存的工程文件
- 所有数据会自动恢复
### 保存到节点
- 点击 `保存到节点` 按钮
- 当前设置会写回节点 widgets
- 工作流保存后,重新加载会恢复节点状态
---
## ⚡ 性能优化
### 自动优化
- **图片压缩**:导入的图片自动压缩到项目分辨率
- **懒加载**:图片按需加载,避免浏览器崩溃
- **预览限制**:预览画布最大 1920×1080,大分辨率项目保持流畅
### 手动优化
- **清理缓存**:点击 `Clear Cache` 释放未使用图层的图片内存
- **减少图层数量**:删除不需要的图层
- **降低预览分辨率**:在 UI 中设置较小的分辨率进行预览
---
## ⌨️ 快捷键速查
| 快捷键 | 功能 |
|--------|------|
| 空格键 | 播放/暂停动画 |
| 方向键 | 移动图层位置 |
| Shift + 方向键 | 快速移动(10px) |
| Ctrl + ↑↓ | 调整 Z 轴深度 |
| 滚轮 | 缩放图层 |
| Shift + 滚轮 | X 轴旋转 |
| Ctrl + 滚轮 | Y 轴旋转 |
| Alt + 滚轮 | Z 轴旋转 |
| R 键 | 重置图层变换 |
| Delete/Backspace | 删除图层 |
> 📖 完整交互操作说明请参考 [详细操作指南 - 画布交互操作](#1-画布交互操作)
---
## 🐛 已知问题与注意事项
### 注意事项
1. **项目尺寸**:建议在 UI 内调整分辨率,预览限制 1920×1080,导出使用实际分辨率
2. **图层数量**:前景图层数量 = 节点输入的前景图片 + Extract 创建的图层 + 本地导入图层
3. **Mask 分辨率**:Mask 会自动缩放到图层原始尺寸
4. **Extract 图层**:创建后会自动缩放到项目尺寸,scale=1 即为全屏显示
5. **内存管理**:大量图层时使用清理缓存功能释放内存
6. **外部图层**:通过节点输入口连接的 foreground_images 会自动显示在 UI 中
### 预览版限制
- 部分功能可能仍在开发中
- UI 和交互可能会持续优化
- 性能优化会持续改进
- 欢迎反馈问题和建议
---
## 🛠️ 开发/构建
### 前端开发
前端位于 `frontend/` 目录,使用 Vue 3 + Vite 构建:
```bash
cd frontend
npm install
npm run dev # 开发模式
npm run build # 构建生产版本
```
构建产物输出到 `js/vue-dist/` 目录。
### 项目结构
```
ComfyUI-AE-Animation/
├── frontend/ # Vue 3 前端源码
│ ├── src/
│ │ ├── TimelineApp.vue # 主应用组件
│ │ └── components/ # 子组件
│ └── package.json
├── js/
│ └── vue-dist/ # 构建产物(已编译)
├── ae_animation_core.py # 核心节点逻辑
└── __init__.py # ComfyUI 节点注册
```
静态目录 `WEB_DIRECTORY=./js`,前端脚本/样式通过 `/extensions/ComfyUI-AE-Animation/vue-dist/...` 提供。
---
## 📄 许可证
Apache License 2.0
## 👤 作者
wallen0322
## 🤝 贡献
欢迎提交 Issue 和 Pull Request!
---
**享受动效创作的乐趣!** 🎬✨