Repository navigation
Coo 形象包机制与 Live2D 接入研究:从清单、Body 契约到 PSD 自动转换 #516
DanieleWolfHOLO
started this conversation in
Show and tell
Replies: 1 comment
|
谢谢这份整理。几个问题的答复:
|
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
把这段时间对 Coo 形象包机制和 Live2D 接入的梳理写成了一份研究报告,发在这里想和作者、以及做形象包的朋友对一对。原报告含 3 张运行截图,本帖从略。
——从清单、Body 契约到 PSD 自动转换与运行时边界
导读:先用一句话说清楚
如果把 Coo 想象成一个舞台,那么“形象包”就是上台表演的演员。
Coo 不关心演员长什么样,它只关心三件事:演员站在哪、朝哪边、现在在做什么动作。形象包负责回答这三件事,并把自己画出来。
所以,形象包不是一张图片,也不是一个 Live2D 文件,而是一个小文件夹:
Coo 自带一个“身体引擎”(body.js)和一个“网格渲染器”(rig.js)。形象包可以用它们,也可以完全不用,自己拿 canvas 或 WebGL 画。Live2D 属于后者:它不是引擎自带能力,而是一个能接管绘制的形象包。
摘要
本文以 Coopanion 0.2.13 / Cortico desktop-pet 的实际源码为对象,梳理 Coo 形象包的加载链路、清单格式、Body 契约、绘制模式、沙箱与安装切换机制。在此基础上,分析 Live2D 模型接入 Coo 的两种路线:A 方案由形象包内嵌/加载用户自备的 Cubism Core,B 方案将模型重建为 Coopanion 的 puppet 格式。文章还记录了 PSD 自动拆层、模板模式、通用近似特效与 Figure Importer 插件的实现边界,并给出授权、版权、Expandable Application、AGPL 与安全方面的注意事项。
关键词:Coopanion;Cortico;形象包;Body 契约;puppet;Live2D;Cubism Core;PSD 自动转换
1 引言
Coo 是 Coopanion 的桌面宠物角色。它看起来只是一个会说话、会走路的小人,但实际运行时分成了多层:Electron 外壳、Cortico World、桌面宠物服务、形象包沙箱,以及形象包自己的绘制代码。理解这些层之间的关系,是判断“能不能装 Live2D”“能不能自动转换 PSD”“引擎到底是谁的”等问题的前提。
本文不讨论 Coopanion 的对话、语音、QQ 或电脑操作能力,只聚焦形象包机制。资料来源是当前安装目录中的实际文件,而不是产品宣传页:
2 系统分层与加载链路
2.1 四层结构
可以把系统分成四层:
2.2 加载链路
一次形象包加载大致经过以下步骤:
其中 kit 由宿主注入,包含 createBody 与 createRig。形象包可以选择使用,也可以完全忽略。
2.3 引擎归属
本文对照的 body.js / rig.js 来自:
Coo 自己的 web/coo/figure.js 调用 kit.createBody;鲸鱼 web/whale/figure.js 使用 createRig;酒狐包同样通过 opts.kit.createBody / opts.kit.createRig 使用这套 kit。酒狐包本身不包含 body.js / rig.js 的源码,它只是调用宿主提供的 kit。
结论:这套引擎是 Coopanion 桌面宠物 World 自带的公共 puppet 引擎,不是酒狐包或 DSH 私有引擎。其许可证为 AGPL-3.0-or-later。
3 形象包规范
3.1 目录与清单
一个最小形象包可以只有清单和入口;带自绘模型的包通常还会有 model.json、贴图和缩略图。
figure.json 的骨架如下:
{ "manifest": 2, "api": 2, "id": "my_figure", "name": { "zh": "我的形象", "en": "My Figure" }, "about": { "zh": "...", "en": "..." }, "entry": "figure.js", "export": "createMyBody", "model": "model.json", "thumb": "thumb.png", "vocab": [], "axes": [] }id 必须匹配 ^[a-z0-9][a-z0-9-]{0,31}$:小写字母/数字开头,只含小写字母、数字、连字符,最长 32 字符。中文文件名直接转 id 容易产生非法值,需要清洗或加前缀。
3.2 Factory 契约
入口函数签名是固定的:
step / layout / do 是必需方法。可选能力包括 resize、walk、set、words、gestures、colors、anchors、extent、hits、snapshot、preload、reset 等。
3.3 Body 与 Layout
Coo 只通过 layout 认识形象,而不关心内部是 SVG、Canvas 还是 WebGL。常用字段如下:
3.4 三种绘制方式
形象包有三种典型实现:
(1)kit.createBody:只画,不管运动
Coo 自己的形象属于这一类。createBody 负责走路、坐下、表情、粒子、拖拽、阴影,形象只需要实现 figure.draw。
(2)kit.createRig:网格 + 变形器
鲸鱼和酒狐属于这一类。部件是矩形贴图 + 网格,变形器只有 rot / warp,物理由 JS 弹簧计算。它是 Live2D-like,但不是 Cubism。
(3)完全自绘
形象包可以忽略 kit,自己创建 canvas / SVG / WebGL,自己实现 step / layout / do。Live2D 适配包必须走这条路,因为它需要 Cubism Core 解析 moc3。
3.5 沙箱与资源
形象包运行在 opaque origin 的 iframe 中。0.2.13 及更早版本的 CSP 禁止一切
fetch,只允许来自 pet server 的脚本和图片;0.2.14 起允许fetch读取本包目录下的文件(见文末「版本注记」)。无论哪个版本,都意味着:figure.json的sounds里声明,由桌宠页播放。3.6 安装与切换
内置包位于 web/coo、web/whale;导入包解压到 figures/。服务端接口负责列出、导入、安装和切换:
切换皮肤时,figure 字段决定形象,scheme 决定配色/服装;axes 定义可选值,vocab 决定 bot 能使用哪些表情/动作词。
4 Live2D 接入 Coo
4.1 为什么需要 Cubism Core
Live2D 模型包通常只包含 model3.json、moc3、贴图、motion 和 physics。moc3 是编译后的模型数据,本身不是可执行程序。Cubism Core 负责解析 moc3、计算 ArtMesh/变形/参数,再把可绘制数据交给渲染器。因此,只要模型仍然是 moc3,运行时就需要 Core。
模型包通常不包含 Core;Core 是单独的 SDK 运行时文件,例如 live2dcubismcore.min.js。
4.2 A 方案:Cubism 包装
A 方案写一个 Live2D 形象包:
这条路线保留原模型的 motion / physics,但需要处理 Core 授权、包体大小、沙箱 CSP、低配设备性能与状态映射。
4.3 B 方案:重建为 puppet
B 方案把 Live2D 模型拆成 PNG 部件,重新建立 Coopanion 的 puppet:
PSD 是 B 方案最干净的输入;如果只有 moc3,则先需要官方 Cubism 工具或离线烘焙,不能直接解析。
4.4 授权边界
Live2D 的 Open Software License 不是开源许可证;Core 仍是专有软件。把 Core 提交到 MIT 仓库、随 Release 分发、或用开源许可证再发布,都可能违反许可。较稳的架构是:
注意:不分发 Core 会显著降低风险,但不自动等于“不需要任何协议”。是否构成衍生作品、是否需要 Publication License,应以 Live2D 的书面回复为准。
5 PSD 自动转换与效果实现
5.1 PSD 到 puppet 的流水线
自动转换的目标不是“复制一张图”,而是把分层 PSD 变成可动的部件:
默认 standard 档:身体/头 6×6,头发 10×12,裙摆 8×10,按部件启用弹簧。对于合并层,可按 alpha 连通域或模板固定框拆分左右。
5.2 模板模式
酒狐第 1 版是手工校准的完整 rig:实时画脸、fxG、头发/尾巴/耳朵/小狐狸弹簧、腿部折叠。模板模式只替换贴图,复用 model.json 与 figure.js:
5.3 通用近似特效
不匹配模板的 PSD 会走基础 puppet。运行时额外提供一层与模型无关的 SVG 特效:绕头星星、思考气泡、冷汗、怒气、问号/感叹号、倾听弧线、sparkle;以及 puppet.json 中定义的弹簧。
通用模式目前不包含实时画脸;脸仍是 PSD 静态图层。它是“近似特效”,不是第 1 版的完整画脸。
5.4 Figure Importer 插件
插件把“选 PSD / 装包 / 换皮肤”串成一条本地流程:
6 注意事项与风险
以下问题在实现和发布前必须明确。
6.1 技术安全
自动转换器不应执行 PSD/Live2D 内的任意脚本;解析应放在受限进程,限制文件大小、图层数和超时。ZIP 导入要防目录穿越;生成包只能写入指定目录。形象包沙箱不允许任意外联和写入(0.2.14 起只可读本包目录),但插件侧仍要校验路径。
6.2 性能
酒狐模板的每帧画脸会把 canvas 重新上传为纹理;这是它昂贵的地方。通用 puppet 的静态贴图更轻。若要做通用画脸,建议缓存静态脸部、只在眨眼/口型变化时更新纹理,并限制网格数量。
7 结论
Coo 的形象包机制不是“加载某个模型格式”,而是“加载一个实现 Body 契约的 JS 包”。它自带 body.js/rig.js 这套 puppet 引擎,但允许形象包完全接管绘制。Live2D 能装进 Coo,靠的是自定义 Live2D pack + 用户自备 Cubism Core,而不是引擎原生支持。
PSD 自动转换走的是另一条路:把分层图变成 Coopanion 的 puppet,没有 Core、没有 Live2D 运行时,代价是失去原 motion/physics。酒狐第 1 版是这条路线的手工校准模板;通用模式只能做到近似特效,不能保证每个 PSD 都达到同样质量。
因此,工程上最稳的组合是:Coo 自带引擎 + 开放 puppet 格式 + 模板模式(完整特效)+ 通用近似模式(回退)+ Live2D A 窗口(用户自备 Core)。法律上则要分别处理 Core、模型、引擎 AGPL、模板素材与 Expandable Application,不能用一个“非商业”结论覆盖全部。
附录 A 最小 Body 骨架
附录 B puppet.json 字段
{ "version": 1, "profile": "standard", "canvas": [0, 0, 256, 256], "ground": 256, "parts": [ { "id": "body", "texture": "tex/body.png", "box": [64, 96, 128, 144], "grid": [6, 6], "z": 10, "parent": "body" } ], "deformers": { "body": { "kind": "rot", "pivot": [128, 240] } }, "physics": [ { "deformer": "hairSway", "stiffness": 16, "damping": 6, "limit": 16 } ] }附录 C 源码与资料
Live2D 官方资料:
https://www.live2d.com/zh-CHS/sdk/license/
https://www.live2d.com/eula/live2d-open-software-license-agreement_cn.html
版本注记:0.2.14 放开了包内文件读取
本文写作时对照的是 0.2.13。2026-10-29 发布的 0.2.14 改了一条关键边界:
fetch读取自己目录内的文件,官方发布说明举的例子正是 Live2D 模型和贴图(/figure-frame 的 connect-src 能否放开到 'self':现在形象包没法读自己的资源文件 #469);fetch,当时要把moc3放进包里,只能把它转成model.moc3.js这样的 base64 模块再import。对本文第 4 节的影响很直接:A 方案不再需要为了兼容 0.2.13 而把模型和贴图全部 base64 内联,
model3.json、moc3、贴图、motion 可以直接放在包目录里按需读取。但 Cubism Core 的授权边界没有变——Core 仍是专有运行时,仍然建议由用户自备、不随包分发。截至本文发布,最新版是 0.2.15。想听听大家的意见
api: 2的兼容承诺下,Live2D 更适合继续做社区 pack,还是值得提供一个可选的官方kit.createLive2D?前者不动契约,后者能统一 Core 加载与授权提示,但会把专有运行时带进官方边界。moc3/ 贴图直读的推荐上限是多少(导入上限是 128 MB,但运行时内存和首帧时间另算)?还需要继续鼓励 base64 JS 来兼容 0.2.13 吗?units / pivots / effects有没有机会沉淀成一种可共享的模板格式,让第三方模板包也能复用,而不是只认「酒狐第 1 版」?本文是技术整理,不构成法律意见;Live2D 授权、模型版权、AGPL 义务与 Expandable Application 的最终判断,应以官方书面回复和合同为准。
All reactions