Qwen-Image2.1游戏素材工坊:Qwen-image+MiniMax H3实现任意动画精灵图(六)
GameActionStudio:在一台 16GB 显卡的工作站上,把一句话变成八向游戏精灵
原文地址:https://mp.weixin.qq.com/s/mReG34IWZby6vVBLL82Sow
项目即将开源,敬请关注!!!
这个项目是什么
GameActionStudio 是一个跑在本地的游戏角色资产生成工作台:输入一段角色描述和一个动作名,产出可直接进引擎的 2D 精灵资产——八方向首帧、动作视频、帧序列、精灵图集(sprite sheet)。
两条硬约束决定了它的形态:
- 全离线。文生图、抠像、图生视频全部走本地 ComfyUI,没有一次云端 API 调用,没有按张计费。
- 产物是"可入库"的。每个环节的产物登记进 SQLite 资产库,可以筛选、复用、删除(进系统回收站,可撤销)。
技术栈:Electron 33 + React 19 + Ant Design 5 + better-sqlite3;模型三件套——Qwen-Image(文生图)、U2Net(抠像)、MiniMax H3(首帧驱动图生视频)。整套跑在一台 32GB 内存的消费级机器上。
下面按管线顺序过一遍每个功能,图都是真实产物。
① 主图生成:一句话,四张候选,一键去背
输入"Q 版关羽,红脸长髯,绿袍持青龙偃月刀",一次生成四张候选供挑选:

选中的候选可以一键 U2Net 去背,右侧预览透明效果,满意就用作后续管线的输入:

轻量档单张约 28 秒,一次出四张。生成是纯抽卡,所以"候选 + 去背预览"放在同一个界面里,点一下"用作首帧"直接进下一环节。
② 五视图转面图:一张图锁定角色身份
八向精灵最大的坑是多方向角色不一致——每个方向单独生成,你会得到八个长得像但不是同一个人的角色。
解法是设定表思路:先让模型一次生成同一角色的 5 个视图并排(正面、左前、左后、右前、右后),再把这张图切成格子,逐格处理成方向首帧。角色身份由这一张图锁定:

这张图看着简单,背后有三个工程问题:
- 切格不能假设等分。模型不会老老实实画五等分,实测每格宽度 248/228/193/212/231。用列墨迹密度自动找空隙切分。
- 白衣角色会被抠烂。白色道袍 × 浅灰背景,U2Net 把袍子内部误判成背景,抠出来千疮百孔。最终方案是逐格抠像(分辨率等效提升 5 倍)+ 整图抠像并集补充 + 封闭洞填充三层组合。
- 朝向标注可以手工修正。模型画朝向不稳定(说好"右后方"它画成"左前方"),每格方向标注做成可编辑,改完一键重切。
③ 八向首帧:统一身高、统一基线、铺绿幕
切出来的每个视图,统一缩放到 0.8 倍画布高、脚底对齐同一基线、水平居中,然后铺上纯绿幕——这就是八向精灵的首帧。4×2 网格一览(最后一行含镜像方向):

真正渲染 5 个方向(前、前斜、侧、后斜、后),剩下 3 个方向由镜像补齐:左前=右前翻转、左=右翻转、左后=右后翻转。镜像对是数学关系,零生成成本。
后续抽帧时所有方向还会做共享对齐:对八个方向求包围盒并集,所有方向用同一个裁剪矩形——保证运行时切方向不会抖一下。
④ 动作视频:首帧 + 动作短语 → 5 秒绿幕视频
方向首帧喂给 MiniMax H3 图生视频,提示词只写动作本身:
performing one full powerful overhead slash: raising the giant glaive from the shoulder and swinging it down in a wide fast arc until the blade reaches the ground
124 帧 / 896×512 / 约 5 秒,单次生成 66 秒。这是挥砍的四个关键帧——刀从肩上举起劈到地面,动作轨迹完整,挥刀带出的剑气弧光也被逐帧保留下来:

这里有个血泪教训值得单独立一节:视频生成出来一动不动。排查下来三层原因叠加——动作描述写成了 943 字符的"姿势描写"(全是"raised high above the shoulder"这种静态描述,没有任何时序);提示词模板里堆了"no camera movement / no zoom / no pan"一串否定词;再加上每次重试用同一个随机种子。修复方式:动作描述只写"起点→过程→终点"的一句话短语,否定词云全部删掉,每次生成强制换种子。现在内置了一个量化工具,算相邻帧灰度差,一眼判断视频是不是静止(<1 静止,3~5 正常),不再靠肉眼。
⑤ 抽帧 + 精灵图集:视频变引擎资产
视频抽帧不是均匀切完事:
- 共享采样相位:八向共用同一组采样索引,保证切换方向时步伐完全同步;
- 逐帧色键抠绿:某帧键控失败(前景占比 >90%)会自动用该帧四角重采样键色重抠,逐帧自愈;
- 统一裁剪矩形:所有帧用同一个 fixedRect,帧间角色位置零漂移。
16 帧动作序列网格:

最终产出引擎可用的精灵图集(PNG + JSON 元数据,含每帧坐标),抽帧全程 4.3 秒:

⑥ 八向批量:一次点一个按钮,出八个方向的完整动画
单个动作的一切步骤(八向首帧 → 逐方向视频 → 共享相位抽帧 → 镜像补向)被串成一个批量任务,模型常驻显存、串行排队、进度实时广播。四个方向的实际动画(GIF,直接点开看):
| 朝前(s) | 朝右前(se) |
|---|---|
![]() |
![]() |
| 朝侧(e) | 朝后(n) |
![]() |
![]() |
背面方向(n)是模型真实渲染的,不是镜像——背对镜头时马尾辫、背部轮廓都正确。批量任务结束时会如实报告缺向(后斜向 ne/nw 是模型当前画不出来的角度),绝不静默用 6 个方向冒充 8 个。
⑦ 素材库:产物是资产,不是散落的文件
每个动作的产物(候选图、主图、绿幕首帧、视频、帧、图集)登记进 SQLite,工作台按 208×120 网格展示、按类型筛选;任何一张历史主图可以一键"用作首帧"跳过重生成;删除走系统回收站(可撤销),并且自动回推动作阶段——删掉最后一条视频,动作状态从"已完成"退回"草稿",不会卡在假状态上。
踩坑记录(挑三个最有代表性的)
白袍抠像。 白色道袍 + 浅灰背景,整图一次 U2Net 抠像时每个角色只剩 65px 有效分辨率,袍子直接糊成透明洞;改成逐格抠像后,背面视图的白袍又因为"不够显著"整块漏抠。最终方案是三层组合:逐格精细抠像、整图抠像并集补充、封闭洞填充(只填被前景包住的洞,手臂与身体的开放空隙不受影响)。同时把提示词的背景要求改成中灰并强制与角色对比——从源头避免。
视频静止。 上面第④节说过的教训:对图生视频小模型,"姿势描写"和"动作指令"是两种完全不同的东西,一整段画面描述会让它忠实保持首帧不动。时序动词(raising → swinging → reaching)才是它能理解的语法。
朝向不稳。 让模型画"右后方 135°"是一个玄学请求,十个方向图里一半画成前斜向。对策不是赌提示词,而是:标签可修正 + 缺向如实报告。宁缺毋假。
现状与下一步
当前管线单动作全流程约 4 分钟(主图 56 秒 → 转面图切分秒级 → 单方向视频 66 秒 → 抽帧 4 秒),八向批量约 5 分钟。
路线图上最关键的一个决定已经想清楚了:换装/换武器不能走"每个动作重新生成"——外观被烘进像素后,N 套服装 × M 个动作就是 N×M 次生成,这不合理。正确的方向是把武器做成独立 sprite 挂点(动作帧生成"空手动作",武器按每帧手腕位置叠加)、同剪影换色走图集后处理,轮廓级换装只留给主角。这是下一步的主线。





浙公网安备 33010602011771号