Files
2026-09-02 10:45:10 +08:00

9.5 KiB

Spine 网页端粒子系统 · 开发计划(定稿 v1.0,已确认)

已确认的决策

  • 产品形态:独立编辑器/演示站
  • 技术栈:Vue 3 + Vite + TypeScript + Pinia
  • Spine 预览运行时:@pixi/spine + PixiJS 8(主打 4.2,兼容 3.8/4.0/4.1 预览)
  • 粒子系统:自研轻量粒子池(预览用,勿黑盒库)
  • 导出:A 方案 —— 工程配置 JSON(不产出 Spine 动画 JSON;先做 A,MVP 优先,架构为后续 B 预留)
  • 部署:纯前端静态构建 → Netlify/Vercel/GitHub Pages,零后端

一、目标

让没有粒子系统的 Spine 动画,能在网页端可视化地叠加粒子特效。用户在网页里:

  1. 上传/加载 Spine 骨骼动画(.json + .atlas + .png)或内置示例;
  2. 在骨骼上配置粒子发射器(可跟随骨骼、调各种参数、应用预设);
  3. 实时预览效果;
  4. 保存为"工程配置 JSON",下次可再次加载编辑。

对标:喵喵 Spine Particle / Spine Particle Studio。注意:本次范围是"编辑器+预览+存配置",暂不做那两个站的"导出 Spine 动画 JSON"核心烘焙功能(那属 B 方案,列为后续扩展,见第八节)。


一·补充、参考站实测核对(已于浏览器读取确认)

站1:喵喵 Spine Particle v0.14.1

  • 保存/加载配置;场景对象=粒子系统(名称/所属动画/系统X/Y/旋转/ScaleX/ScaleY/参与碰撞 Collision Filter+碰撞标签)
  • 发射:爆发/持续、延迟(秒/帧)、数量、形状(点/圆/矩形/锥体/轨道)、方向(随机/固定角度世界/局部/跟随轨道)
  • 属性:初始速度/生命周期/缩放(统一与XY分离)/旋转(各支持 固定/随机/曲线)、生命周期内变化
  • 外观:透明度(固定/曲线,跟随导出/强制线性/强制贝塞尔)、图片(单图/序列/子文件夹)、颜色(固定色/生命周期)、混合模式(正常/相加/相乘/滤色)、缩放/轴心/独立透明度
  • 修改器:发射器跟随/移动噪声/重力/风力/力场(吸斥)/拖尾
  • 导出 Spine JSON(Spine 3.8/4.0/4.1/4.2、关键帧插值线性/贝塞尔/阶跃、导出FPS、整数帧对齐、骨骼对象池、导出骨架、排除无内容动画、图片路径)
  • 操作:中键平移、Ctrl+滚轮缩放、Ctrl+Z 撤销、G/L 全局局部坐标、时间轴
  • 附:页面头部含官方飞书文档 https://ecn2wbmd52pg.feishu.cn/docx/I0rVdOWMoofdzDxZGxDcKOqZnVb

站2:Spine Particle Studio

  • 系统列表/名称/粒子位置X/Y/发射器旋转
  • 贴图:模式(单图/序列帧/雪碧图)、内置贴图(发光星/柔光点/发光环/六角雪花/十字火花/闪耀菱形)+ 自定义上传
  • 发射:爆发/持续、方向/吸收(向外/向内)、数量、延迟、总时长、循环/无缝循环/预热、形状(点/圆/矩形/扇形)、发射角度/偏移
  • 粒子属性:速度/生命/透明度/缩放(固定/随机/曲线,且带曲线绘制器 基础值/重置/START/LIFE TIME/END)、初始旋转模式(固定/随机/方向)、旋转模式(速度/曲线)、颜色(固定/生命周期)、混合模式
  • 物理与随机:速度抑制/重力/抖动/移动噪声/吸引力场/碰撞与阻碍物/随机种子/路径跟随/死亡触发/拖尾子粒子(主粒子<20)
  • 背景:参考图/上传背景/显示背景/透明度
  • 导出 Spine JSON(Spine 3.8/4.0/4.1/4.2、导出FPS、图片路径)、UI 主题、撤回0/10

两站共性(确认)

都是一个粒子特效编辑器:可视化配置 → 实时预览 → 导出为 Spine 骨骼动画 JSON 供并入 Spine 工程。站1 更强调"骨骼跟随+骨骼对象池+曲线插值";站2 更强调"内置贴图+物理+拖尾子粒子+曲线绘制器"。

对本次 A 方案的定位(重要)

本次(A 方案)做的是完整"编辑器+实时预览+工程配置 JSON 存取",不含上述"导出 Spine JSON 烘焙"。两者的功能清单(属性/发射/修改器/贴图)在预览层基本一致,只是导出层不同;因此做 A 时,除导出外其余功能均按上述清单实现,架构为 B(导出)预留,见第八节。


二、核心功能清单

模块 明细
资源加载 上传 .json+.atlas+.png / 内置示例(sample.json 4.2.43 可当测试数据)
动画控制 播放/暂停/停止、循环、动画切换、时间缩放、皮肤切换、骨架缩放/位移
粒子系统 发射器(爆发/持续)、发射形状(点/圆/矩形/扇形/锥体)、发射方向/角度、粒子数量、延迟、时长
粒子属性 速度/生命/透明度/缩放/旋转(各支持 固定/随机/曲线)、颜色(固定/生命周期)、混合模式
骨骼跟随 发射器绑定到某根骨骼/插槽,原点随骨骼逐帧更新(核心特性)
修改器(可选增强) 重力、风力、移动噪声、拖尾、力场
贴图资源 内置(发光星/柔光点/发光环/雪花/火花/菱形)+ 用户上传;支持 单图/序列帧/雪碧图
编辑器 UI 场景对象(粒子层)管理、参数面板(滑块/颜色选择/曲线编辑)、预设模板
保存/加载 导出/导入工程配置 JSON;支持撤销/重做、随机种子
操作习惯 中键平移、滚轮缩放

三、技术选型

选型
前端 Vue 3 + Vite + TypeScript + Pinia
Spine 渲染(预览) @pixi/spine(runtime-4.2 主,兼容 3.8/4.0/4.1)+ PixiJS 8
粒子预览 自研粒子池(Pixi ParticleContainer / 自定义 WebGL 精灵)
状态 Pinia
部署 Vite 静态构建 → 静态托管

四、核心设计(预览层)

  • 编辑器画布 = Spine 骨骼渲染 + 若干 ParticleEmitter
  • ParticleEmitter 管理一个池化粒子容器;每帧:发射原点 = 所属骨骼世界坐标 + 偏移 → 发射粒子 → 更新(位置/速度/重力/寿命/颜色/旋转/alpha)→ 渲染。
  • 参数用归一化数据模型描述(固定 = 定值 / 随机 = [min,max] / 曲线 = 贝塞尔控制点),同一份模型驱动预览渲染与将来导出。
  • 贴图:内置一组 + 用户上传;支持单图/序列帧/雪碧图。

五、代码结构(建议)

SpineParticle/
├─ index.html
├─ vite.config.ts
├─ package.json
├─ src/
│  ├─ main.ts
│  ├─ App.vue
│  ├─ core/
│  │  ├─ spineLoader.ts          # json/atlas/png 加载解析、多版本
│  │  ├─ particleEmitter.ts      # 预览粒子发射器(池化)
│  │  ├─ particleSystem.ts       # 多发射器/帧更新/骨骼跟随
│  │  ├─ curves.ts               # 固定/随机/贝塞尔 求值
│  │  ├─ presets.ts              # 内置贴图 + 预设模板
│  │  └─ types.ts                # 数据模型 + 工程配置结构
│  ├─ views/
│  │  ├─ Stage.vue               # 场景/预览画布
│  │  ├─ AnimationPanel.vue      # 动画控制
│  │  ├─ ParticlePanel.vue       # 粒子层列表 + 参数面板
│  │  └─ PresetPicker.vue        # 预设模板
│  └─ store/
│     └─ particleStore.ts        # spine 资源 + 粒子层状态
└─ 开发计划.md

六、开发阶段(先 MVP 后增强)

阶段 内容 产出
0 需求确认 完成(本计划定稿)
1 技术验证 Spike pixi-spine 加载 sample.json 并播放;一个粒子点跟随 symbols 骨骼 最小可演示
2 Spine 预览核心 资源加载(上传+内置)、动画/皮肤/缩放/控制、时间轴 可操作现有骨骼
3 粒子预览引擎 粒子池、发射器、基础参数、曲线求值、骨骼跟随 骨骼上长出粒子
4 编辑器 UI 场景对象管理、参数面板(滑块/颜色/曲线)、内置贴图+预设 可视化编辑
5 保存/加载 导出/导入工程配置 JSON、撤销/重做、随机种子 可保存/分享
6 部署上线 Vite 构建 → 静态托管,验证 URL 线上可用

每阶段都有可运行成果,可随时停下验收。


七、验收标准(阶段 6 完成时)

  • 打开网页 → 加载内置示例(或用你的 sample.json)→ 播放动画;
  • 在任意骨骼上添加粒子层 → 粒子跟随骨骼运动;
  • 通过面板调节速率/寿命/速度/颜色/缩放/alpha/重力等 → 实时可见;
  • 切换预设 vs 自定义 → 生效;
  • 保存工程配置 → 刷新后加载还原;
  • 部署到静态托管,公网可访问。

八、后续扩展(本次不做,已明确后置)

用户决策:不做烘焙导出,本次只做预览。烘焙这一"大头功能"放后续做。

  • 烘焙导出(后置大目标,即 B 方案):把粒子效果烘焙导出为 Spine 骨骼动画 JSON(对象池骨骼、逐帧采样、曲线插值线性/贝塞尔/阶跃、fps/整数帧对齐、多版本 3.8/4.0/4.1/4.2 schema)。本项目的"归一化数据模型 + 骨骼跟随"已为此预留,将来平滑接入,无需推翻现有架构。
  • 物理系统补充:碰撞体/阻碍物、路径跟随、死亡触发、拖尾子粒子、物理吸引力场。
  • 多版本导出支持(预览层面本项目已支持多版本)。

本次 A 方案与 B 方案只在"导出层"不同:预览层的功能清单(属性/发射/修改器/贴图)两者一致,因此当前实现的每一项都会成为将来 B 方案的直接输入。


附:交付物

  • 一个可运行、可部署的 Vue 3 单页应用(代码 + package.json);
  • 支持上传 Spine 资源、可视化配置粒子、骨骼跟随、实时预览、存/取配置;
  • 开发计划本文件。

⚠️ 由于需在浏览器里实际调 spine + 粒子渲染与交互,建议边开发边在浏览器里目视验收,因此在阶段 1 用你的 sample.json 做技术验证(Spike)是关键第一步。