whiteboard-mask-animation
将中文文章或分镜制作成暖米黄纸张底的白板手绘遮罩动画。适用于需要“文章拆图、生成线稿、自动识别绘制模块、在预览界面调整区域与方向、确认后生成 MP4”的任务,或用户提到白板手绘、遮罩揭示、绘制区域、手部轨迹、动画预览。
Informações da origem
- Repositório
- geeklee/whiteboard-mask-animation
- Última atividade na origem
- 26 de julho de 2026 às 15:26
- Idioma detectado do SKILL.md
- chinês
- Estrelas
- 19
- Forks
- 8
Opções de instalação
Por padrão, está selecionado o prompt que primeiro revisa a origem. Você pode mudar para um comando direto ou baixar uma cópia local.
Revise os arquivos de origem
Leia o SKILL.md e os arquivos complementares exibidos pelo SkillsMP antes de decidir se vai instalar.
Exibindo SKILL.md
SKILL.md
Instruções da origem · Visualização somente leitura- name
- whiteboard-mask-animation
- description
- 将中文文章或分镜制作成暖米黄纸张底的白板手绘遮罩动画。适用于需要“文章拆图、生成线稿、自动识别绘制模块、在预览界面调整区域与方向、确认后生成 MP4”的任务,或用户提到白板手绘、遮罩揭示、绘制区域、手部轨迹、动画预览。
# 白板遮罩动画
使用遮罩逐步揭示静态配图,并让指定手部素材的笔尖跟随遮罩边缘,形成手绘动画效果。所有面向用户的说明、分镜、配置和界面文字必须使用中文。
## 默认实现参数
| 项目 | 默认要求 |
|---|---|
| 纸张背景 | 生成图使用暖米黄旧纸色(建议 `#F5EBD7`);预览和视频都取原图距四角内缩 2 像素的平均色。 |
| 绘制速度 | `150 像素/秒`;横向按宽度、纵向按高度自动换算时长。 |
| 未绘制区域 | 通过离屏遮罩的 `destination-out` 擦除后续区域与保护区,不得提前露出。 |
| 编辑框 | 默认显示全部编号编辑框;编辑框不属于动画画面内容。 |
| 视频底色 | 使用纸张底色取样,禁止白底。 |
## 统一出图视觉规范(强制)
所有场景的源图必须遵循同一套视觉语言;在生成图片前,将以下要求完整写入出图提示词,并在生成后检查是否满足:
- **风格与构图:** 极简手绘插图、纯素描草图风格、类似 Notion 的克制涂鸦美学。以概念表达为主,不追求写实;构图简洁、背景干净、大量留白,整体情感平和、清晰,系列内的线条、人物和配色保持一致。
- **颜色与材质:** 使用米色纸张背景 `#F5EBD7`、深灰色草图线条;仅可用橙色 `#FFA500` 作为少量概念性点缀色。不得使用其他强调色、高饱和度配色或复杂纹理。
- **人物与对象:** 人物统一使用无脸圆形头的人像;对象以简洁轮廓、少量线条和留白表达,强调关系、变化或核心概念,而非真实比例、材质与细节。
- **绝对禁止:** 任何文字、词语、字母、数字、字体或标签;写实感、摄影细节、3D 效果、绘画质感;复杂场景、密集背景、繁复装饰和高饱和度画面。
## 工作流程
1. 读取文章,先输出配图策略,不生成图片。每幕只表达一个核心意思,建议每张图承载 25-35 秒口播。
2. 用户确认策略后,按“统一出图视觉规范”生成 16:9 暖米黄色旧纸张底线稿图。背景使用 `#F5EBD7`,主体之间保留充足留白,便于自动拆分;不得生成文字、复杂照片、重叠对象或与该规范冲突的视觉元素。
3. 在标注前,必须先阅读图片对应的文章/分镜,再实际查看图片,并获取原图的像素宽高;不得只根据文章臆测画面,也不得只按画面位置机械排序。先提炼文章的叙事事件,再将图片中的可见主体对应到事件,按“场景铺垫 → 关键人物/物体 → 动作冲突或变化 → 反应/结果”的语义顺序安排绘制。随后创建 `<图片名>.annotation.json`。
4. 生成区域预览图。预览台与 MP4 渲染器必须使用同一套遮罩规则:在任意时间点,只允许已开始绘制的模块在其当前揭示范围内显示;尚未开始的模块必须完全隐藏。若背景与前景元素互相遮挡,给前一模块添加 `protectedRegions`,并从其遮罩中扣除这些区域,避免提前露线。
5. 启动预览台,让用户播放、拖动时间轴、调整区域四边和四角、修改方向与时序。
6. 只有用户确认后才运行渲染器输出 MP4,并抽查开场、中段和结尾帧。
## 目录约定
在用户项目中创建:
```text
assets/whiteboard/<项目名>/
scene-01-<名称>.png
scene-01-<名称>.annotation.json
scene-01-<名称>-whiteboard.mp4
```
图片与配置必须同名:`foo.png` 对应 `foo.annotation.json`。预览台据此自动加载配置。
## 标注规则
## 语义排序与像素级标注(必须执行)
1. **阅读依据:** 标注前必须同时具备文章/分镜与已查看的原图。若缺少任一项,先向用户索取,不得生成标注。
2. **顺序依据:** `sequence`、`startMs` 和 `label` 必须反映文章中的事件先后,而不是仅按从左到右、从上到下或视觉显眼程度排序。例如“猴子山抢香蕉”应先揭示假山场景,再揭示小猴与香蕉,随后揭示大猴抢夺,最后揭示围观小朋友的反应。
3. **坐标依据:** 每个模块必须输出原图坐标系中的整数像素 `x`、`y`、`width`、`height`;坐标原点为左上角,禁止百分比、比例坐标、估算坐标或省略尺寸。`canvas.width` 与 `canvas.height` 必须等于实际原图像素尺寸。
4. **模块字段:** 每个元素必须包含 `sequence`、`narrativeRole`、`region`、`reveal` 和 `handPath`。其中 `narrativeRole` 用中文说明它在文章中的叙事作用,`sequence` 为从 1 开始且连续的整数。
5. **校验:** 生成预览前检查每个区域是否在原图画布内、是否覆盖对应可见主体、是否与文章事件相符;重叠主体要使用 `protectedRegions` 保护后绘制模块,避免语义靠后的元素提前露出。
## 按路径长度保持匀速
- 默认绘制速度为 `150 像素/秒`。`durationMs = round(绘制距离像素 ÷ 150 × 1000)`;纵向使用 `region.height`,横向使用 `region.width`。方向改变时必须重新计算。
- 预览台在用户拖动区域大小或切换方向后,自动重算时长;时长字段仅展示计算结果,不能保留旧的固定时长。
- 首个模块从 `300-500ms` 开始;下一个模块从前一模块的 `startMs + durationMs + 100-200ms` 开始。这样不论区域大小和方向如何变化,笔尖的视觉移动速度一致。
## 笔尖抖动(绘制感)
匀速不变量只约束遮罩揭示,不约束手的装饰移动。笔尖位置 = 揭示边缘位置 + 垂直方向微抖。预览台与渲染器必须使用完全相同的公式,否则成片与预览错位:
- 行笔主轴严格跟随遮罩边缘(线性 `amount`),保证 150 像素/秒不变量不被破坏。
- 垂直方向叠加两层正弦抖动,并用 `sin(π·amount)` 包络,使起笔、收笔时抖动归零、笔尖干净落在揭示边缘,行笔中段有轻微左右晃动。
- 抖动相位 `seed = region.x * 0.13 + region.y * 0.27`,由模块坐标决定,保证每个模块抖动不同步、且逐帧可复现。
- 横向绘制(`left_to_right` / `right_to_left`)时抖动加在 `y`;纵向绘制(`top_to_bottom` / `bottom_to_top`)时抖动加在 `x`。
## 预览与渲染遮罩不变量(必须执行)
- 在时间 `t`,模块仅可显示其 `reveal.startMs ≤ t` 后、且不超过当前揭示进度的像素;未开始模块的任何线条、填充或图像内容都不得出现。
- 前一模块的遮罩必须扣除全部后续模块的 `region`,并额外扣除其 `reveal.protectedRegions`。后者用于处理矩形区域过大、主体交叠或背景线条可能泄露的情况。
- `protectedRegions` 采用与 `region` 相同的原图整数像素坐标。每个保护区属于较早模块,但只可由对应的后续模块在其自身 `startMs` 后揭示。
- 白板动画预览台和 MP4 渲染器必须实现完全相同的“绘制当前区域 → 扣除后续区域 → 扣除 protectedRegions → 显示源图”顺序;两者任一处缺失都视为未通过预览检查。
- **浏览器预览实现:** 在离屏 `mask` 画布中先按当前揭示进度绘制源图,再以 `globalCompositeOperation='destination-out'` 逐个擦除全部后续 `region` 与 `protectedRegions`,最后将该离屏画布合成到主画布。不得将“当前区域 + 多个待扣除矩形”放进同一个 `clip('evenodd')` 路径:后续矩形彼此重叠时,奇偶规则会把重叠部分反转为可见,导致第 3、4 个区域提前出现。
- **编辑框与画面分离:** 编号区域框是编辑辅助层,可默认显示全部模块并允许用户隐藏;它不属于源图揭示结果,也不得改变遮罩、时间顺序或 MP4 内容。
- **纸张底色取样:** 预览台和 MP4 渲染器都从原图距四角内缩 2 像素的位置取平均色,作为未绘制区域的底色;禁止填充纯白。两端必须使用同一组取样坐标,避免预览与视频出现色差。
- `character`、`object`、`structure`:优先 `top_to_bottom`。
- 标题、道路、箭头、时间线:优先 `left_to_right`。
- 数字增长、柱状图、向上箭头:优先 `bottom_to_top`。
- 反向关系或向左箭头:使用 `right_to_left`。
- 复杂主体拆成 2-4 个模块;不要整张图片一次揭示。
- 遮罩区域比元素边界多留 18-24 像素,防止首帧漏线。
## 配置示例
```json
{
"sceneId": "scene-01",
"canvas": { "width": 1920, "height": 1080 },
"storyBasis": "文章中该画面的事件摘要",
"sceneDurationMs": 6000,
"elements": [
{
"id": "character",
"label": "人物",
"sequence": 1,
"narrativeRole": "文章中首先出现的主体",
"type": "character",
"region": { "x": 240, "y": 180, "width": 360, "height": 620 },
"reveal": { "direction": "top_to_bottom", "startMs": 400, "durationMs": 4133, "maskPaddingPx": 22 },
"handPath": { "start": [420, 190], "end": [420, 790], "easing": "easeInOut" }
}
]
}
```
## 使用脚本
- 使用 `scripts/render_annotation_preview.py` 生成区域编号与方向预览图。
- 使用 `scripts/render_mask_whiteboard.py` 渲染单幕 MP4。必须传入图片、同名配置、输出视频和 `assets/drawing-hand.png`。
- 使用 `scripts/preview_server.py` 配合 `assets/preview.html` 启动预览台。预览台可从项目素材库选择图片,也可通过“从文件选择”打开系统文件对话框。选中本地图片后,复制图片和其同目录的同名 `.annotation.json` 到项目导入区,再自动加载配置。
## 质量检查
渲染前确认:
- 首帧为干净的暖米黄色旧纸张底,没有提前露出线条。
- 已阅读对应文章/分镜并实际查看原图;`canvas` 与原图像素尺寸一致,所有 `region` 均为整数像素坐标。
- `sequence`、`startMs` 与文章事件顺序一致;预览图中的编号、标签和区域来自同一份标注 JSON。
- 在开场、任意重叠模块的中段和所有模块完成后三个时间点检查:未绘制模块均不可见,重叠保护区不会漏出,最终帧显示完整原图。
- 所有模块均在画布内,绘制顺序与口播一致。
- 笔尖贴近正在推进的遮罩边缘。
- 所有模块结束后,停留至少 0.5 秒完整原图。
- 复杂遮挡采用保护区,结尾仍显示完整原图。
- 两个模块区域重叠时,后绘制模块拥有重叠部分的显示权;前一个模块的遮罩必须扣除该重叠区,不能提前露出后一个模块。
如用户要求修改效果,先回到预览台调整配置,不要直接反复渲染视频。
Ver no GitHub