发表于

颜色无所谓,形状才重要:我怎么把二次元立绘变成会动的 Minecraft 形象

这是一篇技术复盘。技术部分我对着代码和 DEVLOG 都核过了;只有最后"自己训练"那一段还是路上的笔记,按原样留着,别太当真。

一、方块人

我在「开往」——某知名独立博客的 webring——上面慢慢翻,翻到某位大佬的个人主页。页面角落里挂着一个会动的 Minecraft 形象,身体轻轻晃,鼠标移过去,它还会挥挥手。

我盯着看了挺久。

那一刻,我就想自己也做一个。而且现在博客的技术门槛已经很低了,很多写博客的人并不是学计算机的——所以我想做的是这么一个东西:让不会建模、不懂贴图、也不碰代码的人,随手打一句话,就能有一个会动的、属于自己的方块小人。

(那个主页地址我后来忘了,等找到再回来补上。)

这个项目就是我们现在要讲的内容。

二、Minecraft

一开始我当然也想过做真正的 3D 角色,但很快就放下了,太难。一个能看的 3D 二次元角色,背后是大量的训练和建模,我一个人靠开源的那些轮子是拼不出来的——就算硬拼,拼出来的东西大概也没人愿意往自己主页上放。而且如果需要训练的话,能用的大概率是3D 动漫的角色,感觉这种风格也不适合往博客里面放,如果是二游的模型,各家的风格也不统一,而且数量太少了,而且模型训练本身是彻底的三维。

那为什么是 MC 呢?

方块、像素贴图,这些东西我们都见过太多遍了。也正因为它从一开始就是粗糙的,你反而不会拿"像不像"去苛求它。一个 3D 角色,差那么一点点,就掉进恐怖谷里;可 MC 不会,只要配色和轮廓对上,剩下的部分,看的人会自己在脑子里补完——"哦,这是 XX"。

还有就是,它真的很轻。一个完整的 MC 角色,说到底不过是一张 64×64 的贴图,套在一副固定的方块骨架上。这么小的东西,直接放进网页里就能跑起来,不需要后端,也不需要什么渲染农场,浏览器自己就转得动。

于是目标就清楚了:AI 生成 MC 皮肤 → 一键导出 → 嵌进个人网页。

后来我越想越觉得,选 MC 并不是退而求其次。它本来就合适。

三、我踩过的四条死路

接下来这一段,大概是整个项目里我自己最想讲的——我是怎么一条一条,把路走死的。

第一条:把立绘直接缩放、模糊,再投影到皮肤上。 听起来最直觉,对吧?结果是一团糊。因为立绘的空间排布,根本不等于皮肤的 UV 展开排布。立绘是"一个站着的人",皮肤是被拆开摊平的六面体;你把站着的人直接贴到 UV 上、再下采样,得到的只是一张缩小的立绘,而不是一张合法的皮肤。脸甚至可能跑到胳膊上去。

第二条:先让 AI 把立绘标准化成三视图,再做对应。 得到的是一个空空的躯干。三视图是有了,可它和 UV 之间还隔着一层,AI 还是不知道哪一块该填到哪里去。

第三条:让 AI 直接从三视图生成模型,再做细节对应。 没做出来。这一步,对当时的我、还有当时那些开源工具来说,就是个黑洞。

**第四条……**其实到这里,我已经有点想放弃了。三条路全死,而且死法各不相同,你甚至不知道下一步该往哪个方向走。

那几天我没怎么写代码。我在做一件挺笨的事:一张一张地,用眼睛看皮肤。

四、百 skins

看着看着,我发现了一件事,一件让整个项目重新活过来的事——

二次元角色的造型,其实高度同质化。

胸前的领结、缎带,好多角色都有(胡桃有,狂三也有);头发也常常用两个颜色做对照,拉出层次;帽子、手部的装饰、配色之间的色差……几乎都有迹可循。看得越多,越觉得这些角色像是从有限的那么几套模板里长出来的。

这本来该让人有点扫兴的——原来你们都长得这么像。但对那时的我来说,这反而是救命的发现。

因为它意味着,我根本不需要从零去合成一张皮肤。我只要在现成的皮肤库里,找一张结构最接近的,复用它的"形状",再换上你这个角色的配色,把它自带的配饰重绘一下,就够了。

效果一下子就对了。

同质化虽然老是被二游玩家吐槽,但是今天真的救了我的命。

五、只"读"

路线清楚之后,管线也就成型了。一张立绘进来,它会走这么几步:

  1. 客户端先做一次确定性采样,取出立绘上的几个大色块——肤色、发色、上装、下装。
  2. 接着 Qwen3-VL 读图,补上采样拿不到的身份信息:眼睛颜色、标志性配饰、发色修正,还有结构判断——性别、下装是裙还是裤。
  3. 发色校准。采样器偶尔会手滑,抓到描边的黑色,这时候改信 VLM
  4. 按"结构"去皮肤库里检索一张最接近的现成皮肤,作为基底。
  5. 在基底上重上色 + 重绘配饰
  6. 绑骨、加动画,输出 GLB。

最后得到的,是一个绑好骨骼、带 idle / walk / run / wave 四套动画的 GLB,由我自己写的 <skinmint-model> Web 组件来渲染。

我想专门说说,在这一版里 AI 到底处在什么位置——因为它和大多数人想象的"AI 生成",几乎是反过来的。

在目前这一版里,AI 是配角,不是画师。

它做的事情只有"读图":这个角色眼睛是什么颜色、有没有戴帽子、下装是裙还是裤。皮肤本身,是检索加重上色得到的,跟 AI 画不画没有关系。

为什么不让它画?因为前面那几条死路,本质上就是在让它画,而结果是慢、费 token,还很不稳定——今天给你一张能看的,明天可能就给你一张认不出来的。换成只让它读图之后,整条管线一下就快了、也稳了,哪怕没有 token、模型暂时用不上,它也能优雅地降级继续跑,顶多少补几个身份上的细节。

读图这件事,它做得又快又准。至于画,我其实从一开始就没太指望。

六、认形

有一句话,差不多是整个项目的地基:

在"重上色"这条路上,基底皮肤的颜色无所谓——反正都要重画。真正重要的,是它的形状。

想通这一句,检索的逻辑就顺了。我排序的时候,根本不看颜色像不像,只看结构:

  • 性别是硬过滤。拿一个男性基底去套女性角色,是重上色救不回来的——剪影、比例都会错。这种直接淘汰。
  • 覆盖率、刘海、裙还是裤,是软惩罚。差一点,扣一点分,还能用。
  • 颜色相似度呢?只在最后,当一个很微弱的"平局决胜"。两个基底结构一样好,才轮到看谁的颜色更近一点。

这套排序,其实是被前面四条死路一点点逼出来的。一旦你接受"形状是骨、颜色是皮"这个前提,很多纠结也就慢慢散了——你不会再去找"一张颜色像的",而是去找"一张穿得像的"。

七、它现在能做到哪儿,又到哪儿为止

现在 SkinMint 即将上线了。造一个角色,有三种方式:

  • 选一个已知角色 → 直接给你一张手工皮肤;
  • 上传一张立绘 → 自动生成皮肤;
  • 打一段文字 → AI 先画立绘,再生成皮肤。

第一种最省心,给到的就是手工皮肤——社区里大佬手搓的那种,质量基本就是天花板了:

一张社区大佬手搓的手工皮肤,质量是天花板级别

我自己最喜欢的,是输出之后的那一步:你不只是下载一张皮肤或一个 GLB,还可以用 <skinmint-model> 这个 Web 组件,用几行代码,把"会动的自己"放进你的 Next.js,或者任何一个个人网页里。就像我最初在「开往」上看到的那位大佬那样——一个在你主页角落里轻轻晃动、偶尔向你挥手的,你。

工程上,它是 npm的包,九个包一起构建;视觉语言定在了 Risograph 风格(纸感、钴蓝、番茄红、黑描边),整站看上去是一套东西。代码我都放在 GitHub 上 了,想看看 <skinmint-model> 具体怎么接、或者好奇前面那套检索逻辑是怎么写的,都可以去翻。

它也有很清楚的边界,这些我想如实写下来:

  • 基底库就这么多张。它没办法同时满足所有结构维度——覆盖率、刘海、裙裤、剪影,顾了这头,常常就丢了那头,说到底还是个打地鼠。
  • 配饰能定位、能重画,但形状是基底的。基底自己没有的造型,重上色是凭空加不出来的。如果你的角色有一个很独特的头饰,而库里又没有结构接近的,那它也只能给你一个近似的样子。
  • VLM 会带来 1~3 秒的延迟。没有 token 的时候会优雅降级,但那一版,就少了点身份细节。

所以它并不能复刻一个角色。它能给你的,是一张配色正确、轮廓大致对、眼睛和配饰也没认错的、干净的皮肤。这已经挺好用了,但离"就是本人"还差着一段——而这段距离,短期内补不上。

放两张它自己产出的皮肤给你看看。状态好的时候,是这样:

SkinMint 正常发挥时产出的一张皮肤

不太走运的时候,也会糊成这样,脸上的五官都对不齐:

SkinMint 没发挥好时产出的皮肤,五官糊在一起

八、打地鼠的尽头,训练

不训练、纯靠手调启发式,最后一定会变成 whack-a-mole:刚改好左边,右边又塌了。我在这上面耗了很久。

中间有一段挺有意思的:我挂了一个会自动跑的 Claude,让它对着训练集,自己去调参数(没想到这套素材,会在这儿提前派上用场);又让它对照大佬做的原神皮肤,自己设标准、打分、再改进——其实就是借了强化学习里那套"对着目标反复打分、再迭代"的思路,我把它写成了一个 skill,让它自己迭代。后来额度用光了,想试试最近很火的「GLM 5.1,后来是 5.2」,结果它当时还不支持多模态,没法做视觉对照;我自己手动测了几组、又调了很久,还是没能到达想要的那个效果。

到这里我就认了:纯工程加上开源轮子的复用,能走到的,差不多就是这儿了。想再往上一个台阶,得自己训练。

所以现在,我准备拿二游和动漫角色当训练集,自己训一个真正的"立绘 → 皮肤"模型,去捅破"检索 + 重上色"那层保真的天花板。眼下在 autodl 上租了一块小显卡在跑,效果看着……好像还行,但真要做完,估计不是最近的事。

说起来,那块卡看着是几块钱一小时,挺便宜,可一天跑下来就是一百块,多少有点吃不消。

训练卡一天的配置费用:¥137.75

我是真没想到,算力优化会这么复杂。这让我忽然想起高中抠时间复杂度的那段日子——原来是用在这儿的。大学课程一开始不太强调这个,像在度假,结果真到用 AI 的时候才发现它这么要紧,而 AI 训练的实际使用这一块,我还做不到学以致用,只能一点点重新自学、慢慢啃书。

模型大概这个夏天会上架吧,不会让大家等太久。

回头看,这个项目教给我的,其实不是什么算法,而是几个一开始没料到的判断:粗糙的方块人,反而是对的载体;颜色无所谓,形状才要紧;同质化是特性,不是缺陷;让 AI 当配角,比让它当画师,要更快也更稳。

还有最后一个,可能也是最重要的——当手调启发式调到改一处、塌一处的时候,那往往不是再加一条规则的信号,而是该去训练的信号。

我现在,就站在这个信号面前。夏天见。

评论友链评价 · 获得专属标记