图像转动画像素艺术
结果必须忠于原始素材:修复因缩小至像素尺寸而损坏的部分,绝不发明细节。在运动中,断裂是敌人:任何跳变、撕裂、闪烁或抖动的像素都必须避免。Claude无法观看GIF,因此每次展示前都要进行定量检查,而非仅凭“静止时看起来没问题”。
如果用户在CLAUDE.md或其所指向的文件中保留了像素艺术偏好,请先读取;这些偏好将覆盖本文件的默认设置。需要Aseprite MCP:references/aseprite-mcp.md。在到达相应阶段时,请阅读:references/still-recipe.md、references/motion-and-breaks.md。
工作流程
每次检查都是一条消息:一张并排图像(原始 | 之前 | 之后,或一张GIF加一份裁剪的翻页书)以及一个问题。每次更改前将当前文件复制为_vN,这样如果某轮被拒绝,可以从该副本还原。每一轮只进行所要求的改动,不做任何其他事情。
- 简要说明。 在规划之前先询问需求:哪些部分移动、移动多少、移动速度多快、哪些部分保持静止、哪些部分需要保护。编写一份简短的规划文件(半页),并获得确认。当用户批准规划后,此阶段完成。
- 源图像。 裁剪或调整源图像大小,使其尺寸正好为目标精灵的3倍(大约200-260像素宽)。脚本假定为3倍。
- 静态图像(先运行
1_still.lua,然后使用2_local_rerender.lua和3_join_outline.lua进行修复)。根据still-recipe.md为当前图像测量参数。按顺序检查:手部,然后是面部和眼睛,接着是轮廓、金属和背景。当每个部分获得批准,并且静态图像保存为*_still_FINAL后,此阶段完成。 - 眨眼姿态(运行
4_blink_poses.lua,眼睛跨度手动追踪,比例为14x)。在一次检查中展示全部四个姿态以及一张眨眼GIF,按照motion-and-breaks.md构建。获得批准后完成。 - 动画(运行
5_animation_frames.lua)。根据静态图像的测量结果填充其SETTINGS块,先运行BF_ZERO = true(必须改变0像素),然后进行实际运行,最后运行6_deflicker_metrics.lua。通过以下检查,然后展示完整的GIF以及一份裁剪的翻页书,展示移动部分。 - 特效(运行
8_effects.lua,仅限颜色,在去闪烁之后)。检查,然后展示。 - 额外需求,每次一个请求(手臂、水面等),每次都有自己的检查。
- 最终处理。 复制为
*_FINAL(.aseprite+ 3倍GIF),保留之前的最终版本。
每次动画检查前的检查项
| 检查项 | 通过标准 | 位置 |
|---|---|---|
| 零偏移渲染等同于姿态 | 使用BF_ZERO时0像素变化 | 5 |
| 刚性部分(手部)精确 | 每一帧的框(按整体像素提升量回移后)等同于静态图像:0像素变化 | 使用自定义Lua进行比较 |
| 单帧闪烁(A→B→A) | 眨眼和特效之外不应出现 | 6会打印它们 |
| 跳变 | 步骤帧(列于BA_STEPS)被排除;其余每帧的变化像素数不超过约2倍中位数,任何超过的帧必须有命名的原因 | 6 |
| 热力图 | 轮廓、肩带、睫毛、眼睛上无红色(每个循环变化数≥8) | 7_flicker_heatmap.lua |
| 特效 | 每个特效像素至少持续2帧;变化像素计数大于0(弱混合可能回弹到相同调色板颜色) | 8会打印计数 |
| 闭眼 | 闭眼帧上无虹膜颜色残留 | 以12倍放大率使用view_sprite |
| 翻页书 | 手部、面部以及每个移动边缘的8-16帧,以6倍或更高放大率查看时看起来连续 | 使用view_sprite区域和帧 |
脚本(scripts/)
每个脚本需要先设置PA_DIR(项目文件夹,以路径分隔符结尾:Windows用\,macOS用/)和PA_SRC(源图像文件名),以及其头部列出的自身全局变量。通过run_lua_script并附带一个短启动器来运行它们;<skill>是此技能的基础目录,在技能加载时提供:
PA_DIR, PA_SRC = [[/path/to/project/]], "reference.jpg"
BF_POSES, BF_OUT, BF_PUSH = "blink_poses.aseprite", "frames", true
dofile([[<skill>/scripts/5_animation_frames.lua]])
| 脚本 | 功能 |
|---|---|
1_still.lua | 3倍线性保持缩小、k-means调色板+强调色、雀斑处理、孤立点合并 |
2_local_rerender.lua | 在另一个线条阈值或使用额外颜色(手部、嘴唇)时重新渲染指定区域 |
3_join_outline.lua | 连接源图像中细线导致的虚线轮廓 |
4_blink_poses.lua | 睁眼、半睁、接近闭合、闭眼姿态(文件中的眼睛跨度因图像而异) |
5_animation_frames.lua | 所有帧;每个坐标都存在于其SETTINGS块中(包含示例值) |
6_deflicker_metrics.lua | 去闪烁、闪烁检测、跳变检查(BA_SKIP刚性区域,BA_STEPS步骤帧) |
7_flicker_heatmap.lua | 热力图PNG |
8_effects.lua | 挤压光、闪光、海面闪光、沙地闪烁(每个图像一个SETTINGS块) |
checkin_sheet.lua | 用于某个区域的原始/之前/之后对比图 |
example_metal_rerender.lua | 仅作为工作示例:使用来自源图像的阴影带重新渲染金属 |
5_animation_frames.lua 包含迄今遇到的运动类型(呼吸带、软体穹顶、摇摆框、刚性整像素推动、肢体片段、海面)。当遇到具有不同移动部分的新图像时,会在此脚本中添加相应字段。