SRT白板动画防线条提前露出的核心技巧srt-whiteboard-animation的遮罩不变量与protectedRegions【免费下载链接】srt-whiteboard-animation将 SRT 字幕做成暖米黄纸张底的流式笔迹白板手绘动画 skillmask 分区遮罩编排 stream 连续笔迹ink→color。项目地址: https://gitcode.com/gh_mirrors/sr/srt-whiteboard-animationsrt-whiteboard-animation 是一个把 SRT 字幕做成暖米黄纸张底白板手绘动画的开源 Skill分区遮罩编排负责谁先画、谁后画stream 连续笔迹负责每一笔怎么落墨先 ink 铺线稿再 color 添彩。多区域按字幕依次出场时最尴尬的画面 bug 就是线条提前露出——下一幕的香蕉还没出场轮廓已经先画好了。本文讲清楚这个项目用遮罩不变量和protectedRegions两个机制如何从根上消灭这类穿帮。为什么白板动画会提前露出白板动画的精髓是按字幕讲故事小猴坐假山、大猴抢香蕉、小朋友围观三个画面元素跟着 SRT 字幕依次被画出来。但画面元素往往画在同一个矩形框里——比如中间主体的方框既罩住了抢香蕉的大猴也可能罩住小猴的尾巴和背景里的草丛线条。如果渲染器只是在这个矩形框里自由作画那么在画第一个区域时后续区域的线条会顺着笔刷一起被画出来观众看到的是下一幕内容提前抢跑叙事节奏瞬间穿帮。上图就是项目示例 examples/scene-01-monkey-mountain-banana.annotation.json 对应的原图三个区域左侧场景、中间主体、右侧反应各自一个region矩形按时序 1→2→3 出场。遮罩不变量一行规则说清不许露SKILL.md 中把这条规则称为遮罩不变量orchestration layer必须执行它只有两条时间约束在时间 t模块仅可显示reveal.startMs ≤ t之后、且不超过当前作画进度的像素未开始模块的任何线条、填充都不得出现。空间约束每个区域的允许掩码allowed mask 本区域矩形region− 所有后续模块的region− 本模块的protectedRegions。stream 落墨被严格限制在允许掩码内因此后续区域天然不会被碰到。一句话先画的人作画范围会自动咬掉后画人的地盘。这不是靠时间轴错开就能解决的——即使startMs完全串行空间上重叠的矩形依然会让笔迹越界。必须靠空间掩码兜底。允许掩码 当前区域 − 后续区域 − protectedRegions用示例标注里的三个区域看就明白了画区域 1左侧假山时允许掩码 左侧矩形 − 中间矩形 − 右侧矩形画区域 2中间大猴时允许掩码 中间矩形 − 右侧矩形画区域 3 时没有后续区域掩码就是完整矩形。渲染器 scripts/render_stream_whiteboard.py 的_allowed_mask方法就是这条规则的实现见 scripts/render_stream_whiteboard.py先填本区域矩形再把每个后续区域的矩形挖掉最后把protectedRegions挖掉。之后起笔揭墨、块填充、添彩刷色_reveal_ink_segment/_ink_stamp_cell/_color_stamp/_wash_contour每一步都 allowed取交集墨迹物理上画不进被挖掉的像素。浏览器预览台 assets/preview.html 用 Canvas 的destination-out混合模式做同一套演示见 assets/preview.html画区域时先把后续区域和保护区从蒙版上挖掉所见即所得地核对这个时间点画面里不该有什么。protectedRegions给重叠主体上延迟揭幕的保险自动扣除后续region已经能处理矩形之间的遮挡但有两种情况它管不了矩形太大region框得比实际主体宽框里混进了本该后面才出现的背景线条主体交叠两个主体的线条物理上纠缠在一起单靠矩形边界切不干净。这时就在较早出场的元素reveal.protectedRegions里标出需要延后显示的小矩形。坐标使用与原图一致的整数像素格式和region相同reveal: { direction: top_to_bottom, startMs: 300, durationMs: 2600, maskPaddingPx: 22, protectedRegions: [ { x: 480, y: 300, width: 120, height: 200 } ] }示例标注里三个区域的protectedRegions都是空数组见 examples/scene-01-monkey-mountain-banana.annotation.json因为三个矩形本身没有重叠而 SKILL.md 的强制要求是重叠主体用protectedRegions保护——只要预览图里看到主体交叠就应该补上保护区见 SKILL.md 遮罩不变量章节。渲染器怎么执行这条不变量整条链路的分工是这样的细节可对照 scripts/stream_render.py 与 scripts/render_stream_whiteboard.py按 startMs 排序区域render_to先sorted(elements, keystartMs)保证作画顺序与字幕叙事一致补静态帧fill_static把上一个区域结束到本区域startMs之间的空档写为静止画面——这段时间里画布上没有任何未开始区域的内容算允许掩码_allowed_mask挖掉后续区域与保护区掩码内落墨起笔揭墨与添彩默认--color-fill contour-wipe每一步都与掩码取交集凝视收尾全部画完后自动补到sceneDurationMs结尾停留至少 0.5 秒完整原图由 scripts/render_stream_whiteboard.py 的gaze_until保证。所以防提前露出不是靠某一帧的擦除特效而是渲染顺序 空间掩码双保险未开始的区域从第一帧起就不存在于墨迹可达的范围内。质量自检开场、中段、结尾三个时间点README.md 的质量检查清单给了一个很实用的验收方法——成片只需抽查三个时间点时间点检查什么开场首帧干净的暖米黄纸张底没有任何提前露出的线条任意重叠模块中段未开始区域与protectedRegions保护区均不可见所有模块完成后最终帧显示完整原图结尾停留 ≥ 0.5 秒如果自检发现问题不要反复重跑渲染——按 SKILL.md 的工作流回到 assets/preview.html 预览台调整region、protectedRegions、startMs并保存再用 scripts/render_annotation_preview.py 重新生成区域编号检查图核对确认无误后再渲染。小结遮罩不变量解决时间上的穿帮未开始的区域在startMs之前完全隐藏允许掩码区域 − 后续区域 − 保护区解决空间上的穿帮笔迹物理上画不进别人的地盘protectedRegions是兜底保险专治矩形过大、主体交叠、背景线条泄露三个时间点抽查开场/中段/结尾是验收成片的最快方法。把这三件事做对你的 SRT 白板动画就能做到每一笔都踩在字幕节拍上线条永远不抢跑。【免费下载链接】srt-whiteboard-animation将 SRT 字幕做成暖米黄纸张底的流式笔迹白板手绘动画 skillmask 分区遮罩编排 stream 连续笔迹ink→color。项目地址: https://gitcode.com/gh_mirrors/sr/srt-whiteboard-animation创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
