1实现原理 · 为什么它能做到
能力全部落在「内联可运行代码 + 规则」上:SKILL.md 正文直接给出每颗粒子的状态推进循环、受力函数、流场/curl 噪声、空间网格连线与 GPU Points 着色器片段,照抄即得,不需要任何库或构建步骤。
Drive many small elements with simple per-particle rules to get emergent, organic motion. Use 2D canvas for hundreds, GPU `Points` for thousands.
稳定性靠积分格式而非调参:明确要求半隐式欧拉(先更速度、再用新速度更位置)并钳制 dt,理由分别是弹簧/阻尼力下的稳定性与标签页卡顿后仿真不炸。
Prefer **semi-implicit Euler** (update velocity first, then position with the new velocity, as above) — it is stable for the spring/drag forces particles use. Use a fixed or clamped `dt` (`Math.min(dt, 1/30)`) so a stalled tab does not explode the simulation.
性能瓶颈被点名并给出数据结构解法:连接点网络不做两两比较,而是按半径分桶、只比相邻 8 格,复杂度从 O(n²) 降到接近 O(n)。
Naively checking every pair is O(n²) and dies past ~300 particles. Use a **uniform spatial grid**: bin particles by cell, only compare against the 8 neighboring cells.
上万粒子的路径是把动画搬进顶点着色器:位置进 BufferGeometry 渲染成 Points,并交代「看起来像发光点」的两个开关——叠加混合 + 关闭深度写入、用 gl_PointCoord 距离 discard 把方块剪成圆点。
`AdditiveBlending` + `depthWrite: false` gives the glowing-particle look. `discard` on `gl_PointCoord` distance makes square points round.
交付物限定为单文件 HTML 并禁止打包器:canvas 2D 内联,或 GPU 用 importmap 把 three 指到 CDN,一个渲染循环、零构建步骤。
For a self-contained particle effect (constellation background, confetti burst, flow field, GPU points) the deliverable is **one HTML file that opens directly in a browser** — canvas 2D inline, or Three.js from a CDN via an importmap for GPU `Points`, one render loop, no build step.
确定性是可验证的前提:用种子化 PRNG(mulberry32)替换裸 Math.random,使 `?t=N` 冻结帧可复现——同一 N 出同一像素,截图验证才成立。
**Seed the RNG** — replace bare `Math.random()` with a seeded PRNG (e.g. mulberry32) so spawn positions, angles, and bursts reproduce frame-for-frame.
2核心能力
3外部依赖
| 类型 | 依赖 |
|---|---|
| cli | npx playwright screenshot(验证回路:打开本地 file:// 页面并截冻结帧) |
| cli | 仓库根共享脚本 scripts/seek-shot.sh、scripts/contact-sheet.sh(截图与拼图;不在 skill 目录内) |
| cli | ffmpeg / ffprobe(contact-sheet.sh 用 hstack 拼图;probe-mp4.sh 读编码参数) |
| network | 交付 HTML 经 importmap 从 CDN 取 three(GPU Points 分支)——产物期引用,由浏览器拉取 |
| package | simplex-noise(流场/curl 噪声示例引用的噪声库,注释中点名) |
4风险提醒 风险提醒:蓝色 · 知晓即可
- 验证回路依赖 npx 远程获取 Playwright 与 Chromium — SKILL.md 内联 `npx playwright screenshot`(仓库根 seek-shot.sh 为 `npx -y playwright screenshot`):首次运行会安装远程包并下载浏览器二进制,版本不由本 skill 锁定。环境已有 Playwright/浏览器时可用本地二进制替代同一回路。
- 仓库根脚本不在 skill 目录内,安装方式决定引用是否悬空 — scripts/seek-shot.sh 与 scripts/contact-sheet.sh 位于仓库根(插件根)。只安装 skills/particle-system 时两条命令会找不到文件;等价替代是自行写 playwright 截图与 ffmpeg 拼图。
- 无 GPU 环境会因软件渲染差异出现「看着像 bug」的画面 — 无头 WebGL 走 swiftshader,粒子量大或混合模式复杂时可能变慢/掉帧;SKILL.md 已列为环境前提,验收时应区分「实现错误」与「渲染后端差异」。
- GPU 分支的 three 来自 CDN,属未锁定的供应链引用 — importmap 指向 CDN(URL 由实现者自选,源码未钉版本)。产物长期在线时建议自托管并固定版本。
5第二遍独立确认
- [ok] 「skill 目录内无脚本」是否成立(决定蓝而非黄/橙的关键) — 文件清单实证:skills/particle-system/ 下只有 SKILL.md、README.md(0 B)、references/particle-recipes.md。SKILL.md 提到的 `scripts/seek-shot.sh` 实际位于仓库根 scripts/,并非 skill 自有资产;因此判级对象内确实没有可执行代码。已在 reason/risks 记录「单装 skill 目录会使引用悬空」。
- [ok] 是否存在凭证或环境变量读取 — 全仓正则 `process.env|API_KEY|TOKEN|SECRET|Authorization` 在三个 iart 仓内零命中(唯一命中在 javascript-animation-skills 的 soundtrack/references/ai-music.md,属另一 skill)。本 skill 的 credential_reads 为空成立。
- [ok] 是否有比蓝更高的触发条件被漏掉(红档特征) — 对 `sandbox|automationcontrolled|no-verify|stealth|bypass|ignoreHTTPSErrors|dangerously` 全仓扫描零命中;不存在关沙箱、关 TLS、绕过自动化侦测或任意代码执行面。
- [ok] GPU / 无头渲染前提是否真的写进文档(任务特别提示项) — SKILL.md 验证段原文承认这是环境前提并把归因从代码上摘开:'For GPU points, WebGL needs a GPU context; Playwright/Chromium supplies one (swiftshader) headless.';完成清单第 1 条也要求无 WebGL 错误。
- [ok] 「O(n) 连接点」与「?t=N 可复现」两条能力声明是否与代码相符 — 空间网格实现(`cell = radius` 分桶、只查 3×3 邻域)与声明一致;harness 要求 seeded PRNG + 固定步进(`const step = 1 / 60`)再渲单帧,确实保证同 N 同像素。无夸大。
- [ok] reference 描述是否逐条落地 — references/particle-recipes.md 开篇即 'Complete, runnable systems for canvas and GPU particles.',与 SKILL.md 末尾列出的能力项(confetti/snow/smoke、鼠标吸引排斥、simplex 流场与 curl、空间网格星座、GPU Points)在文件内可逐节验证。
6结论
d8271a602d6dd44b…50697d659f