我把女朋友做成了 Codex 桌宠

从一张捧着花束的毕业照开始,我和 Codex 一起把她做成了会眨眼、挥手、跳跃,也会迈着小碎步穿过屏幕的桌宠。

事情的起点很简单。我在 Codex 里看到桌宠功能时,第一反应是:能不能把她放在这里?

我选了一张女朋友捧着花束的毕业照。照片很适合作为纪念,但也有一个明显的问题——花束太抢眼了。要是直接照着生成,模型很容易把花当成角色的一部分,最后她无论待机、挥手还是工作,都抱着同一束花。

所以我写下的第一句需求里,特意加了一句:“注意生成的宠物不要总拿着花。”

先决定哪些东西真正属于她

开始生成前,Codex 先问我要保留毕业服,还是换成日常服。我选了毕业服。它是这张照片最特别的部分,也比一套泛化的日常穿搭更有纪念意义。

接下来又在 Q 版贴纸、3D 公仔和布偶风之间做选择。最终选 Q 版贴纸,一半因为可爱,一半因为桌宠的单格只有 192×208 像素。尺寸缩小以后,复杂的材质和五官很容易糊成一团,清楚的轮廓更重要。

我们把人物特征拆成了一组很具体的约束:长黑发、珍珠耳坠、黑色毕业袍、红色披肩领、墨绿色饰边、露出一点白色蕾丝裙,还有白色低跟鞋。宠物取名为“苇嘉”,默认空手,花束只属于原照片里的那个时刻。

虽然制作使用了真实照片,但我没有把原图放进这篇公开文章。这里展示的都是生成后的桌宠素材。

苇嘉 Codex 桌宠的待机帧
最终进入图集的一张待机帧:毕业服保留下来,花束则被拿掉了。

一张图还不够

我原本也以为,把照片交给 AI,等一会儿就能得到桌宠。做到中间才发现,生成角色只是开头,后面还有一条小型动画流水线。

先生成一张统一人物形象的主参考,再分别制作九种状态:待机、向左和向右移动、挥手、跳跃、失败、等待、工作和审阅。每个状态都需要一排连续帧。之后还要去掉键控背景、切帧、对齐人物基线、拼成透明图集,再把每排动作渲染成 GIF 检查节奏。

hatch-pet 负责把这些步骤组织起来,imagegen 负责绘制人物和动作。机器可以检查图集尺寸、透明像素、空白格和文件结构,却很难替我回答另一个问题:她这样动起来,看着对不对?

苇嘉桌宠九种状态的动作联系表
九种状态的动作联系表。绿色边框是实际使用的帧,空白格会保持完全透明。

跑起来以后,问题才暴露

第一版自动检查已经通过了,但视觉审核还是发现了问题:人物边缘残留了一点洋红色,左右移动的节奏也不稳定。边缘可以用更确定的抠图方式修掉,动作却不能只看校验结果。

最初生成的跑步帧抬腿很高,像在冲刺。单独看动作很有活力,套在一件长毕业袍上却很奇怪。我当时直接回复:

跑步姿势不要高抬腿,那样和服装风格和人体跑步形态不搭。

第一次调整把膝盖放低了,但步幅仍然太大,还是有一种穿着毕业袍百米冲刺的感觉。于是又收了一次:双脚间距不超过一只鞋长,抬脚不超过半只鞋高,动作主要交给脚跟、脚尖和袍摆。最后做成了一种贴着地面、略显急促的小碎步。

苇嘉桌宠向左小碎步移动
向左移动
苇嘉桌宠向右小碎步移动
向右移动

这一轮返工最花时间,也最值。检查器只能告诉我图片有没有越界、透明背景干不干净;我在意的是,这件衣服配上这个动作顺不顺眼。步子慢下来以后,画面终于对了,看起来真像她在屏幕边上走动。

这算不算 Vibe Coding

我会把这次经历归到 Vibe Coding 里,但它和“一句话生成”差得挺远。过程中有设计选择、生成失败、局部返工、自动校验,也有好几次“技术上没问题,但看起来就是不对”的判断。

我没有先想类名、函数和目录结构,花得更多时间的是说清一些很生活化的要求:毕业服要留下,花不要一直拿着,跑步别高抬腿,动作要像穿着这件衣服的人会做出来的样子。

Codex 会把这些话继续翻译成提示词、帧数、尺寸和检查项。我仍然要做选择,只是可以直接用日常语言描述选择。

只简单一句“不对”没有说服力,要清晰点明问题所在。AI时代技术门槛不断降低,真正拉开差距的,是清晰完整地表达自身观点,写好提示词的能力。

装进 Codex 以后

最终成品是一张 8×9 的透明 WebP 图集,尺寸 1536×1872;每个单格 192×208,共包含九种状态。它和一份 pet.json 一起安装进 Codex 的宠物目录,也保留了联系表与每种动作的 GIF,方便以后继续修改。

苇嘉桌宠挥手动画
挥手
苇嘉桌宠跳跃动画
跳跃

现在打开 Codex,等待任务时她会安静站着,运行任务时会认真起来,完成后偶尔挥挥手。它当然没有让代码跑得更快,却让原本冷冰冰的等待多了一点熟悉感。

它最后没有躺在 outputs 文件夹里,而是真的进了我的日常。也算是送给她的一件很小、但能动起来的礼物。