Communitygithub.com

V4TIME/V4SKILL

p5.js 草图:生成艺术、着色器、交互式、3D。

V4SKILL 是什么?

该技能提供了一个完整的 p5.js 生产流水线,用于创建交互式视觉生成艺术、数据可视化、3D 场景、音频反应图形以及动态排版。它支持七种模式(生成艺术、数据可视化、互动体验、动画/动态图形、3D 场景、图像处理、音频反应),并强调创作卓越而非技术演示。流水线从概念设计到代码实现,再到导出(HTML、PNG、GIF、MP4、SVG),每一步都确保首次渲染的视觉效果令人惊艳。它包含丰富的参考文档,涵盖色彩系统、噪声、粒子系统、形状语言、动画、排版、着色器和交互模式。该技能默认使用 p5.js 1.11.3,但必要时也支持 2.x 版本。它强制要求为非默认配置:自定义调色板、笔触权重、背景处理、运动多样性以及至少一个自创元素。通过随机种子、精心的参数设计、离线缓冲区和基于类的实体模式,确保生成结果可重现且质量上乘。

兼容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/V4TIME/V4SKILL/tree/HEAD/creative/p5js

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

p5.js 生产流水线

何时使用

当用户请求:p5.js 草图、创意编程、生成艺术、交互式可视化、画布动画、基于浏览器的视觉艺术、数据可视化、着色器效果或任何 p5.js 项目时使用。

内部包含

交互式和生成视觉艺术的 p5.js 生产流水线。创建基于浏览器的草图、生成艺术、数据可视化、交互式体验、3D 场景、音频反应图形和动态图形——导出为 HTML、PNG、GIF、MP4 或 SVG 格式。涵盖:2D/3D 渲染、噪声和粒子系统、流场、着色器 (GLSL)、像素操作、动态排版、WebGL 场景、音频分析、鼠标/键盘交互以及无头高分辨率导出。

创意标准

这是浏览器中渲染的视觉艺术。画布是媒介;算法是画笔。

在编写一行代码之前,阐明创意概念。这件作品传达了什么意思?是什么让观众停止滚动?是什么让这件作品与代码教程示例区分开来?用户的提示只是一个起点——用创意雄心去诠释它。

首次渲染的卓越性是不可妥协的。 输出必须在首次加载时视觉上引人注目。如果它看起来像 p5.js 教程练习、默认配置或“AI 生成的创意编码”,那它就是错误的。在交付之前重新思考。

超越参考词汇。 参考文档中的噪声函数、粒子系统、调色板和着色器效果只是一个起点。对于每个项目,要进行组合、叠加和创造。目录是一盒颜料——你来画这幅画。

主动发挥创意。 如果用户要求“一个粒子系统”,那就提供一个具有涌现集群行为、尾随幽灵痕迹、调色板偏移景深雾气和呼吸的背景噪声场的粒子系统。至少包含一个用户没有要求但会欣赏的视觉细节。

密集、分层、深思熟虑。 每一帧都应值得观看。永远不要使用纯白色背景。始终要有构图层次。始终要有有意的色彩。始终要有只有仔细检查才能看到的微细节。

统一美学胜过功能数量。 所有元素必须服务于统一的视觉语言——共享色温、一致的笔触权重词汇、和谐的运动速度。一个包含十个不相关效果的草图不如三个相互协调的效果好。

模式

模式输入输出参考
生成艺术种子 / 参数程序化视觉构图(静态或动画)references/visual-effects.md
数据可视化数据集 / API交互式图表、图形、自定义数据显示references/interaction.md
交互式体验无(用户驱动)鼠标/键盘/触控驱动的草图references/interaction.md
动画 / 动态图形时间线 / 故事板定时序列、动态排版、过渡references/animation.md
3D 场景概念描述WebGL 几何体、光照、相机、材质references/webgl-and-3d.md
图像处理图像文件像素操作、滤镜、马赛克、点彩画references/visual-effects.md § 像素操作
音频反应音频文件 / 麦克风声音驱动的生成视觉效果references/interaction.md § 音频输入

技术栈

每个项目单个自包含的 HTML 文件。无需构建步骤。

层工具用途
核心p5.js 1.11.3 (CDN)画布渲染、数学运算、变换、事件处理
3Dp5.js WebGL 模式3D 几何体、相机、光照、GLSL 着色器
音频p5.sound.js (CDN)FFT 分析、振幅、麦克风输入、振荡器
导出内置 saveCanvas() / saveGif() / saveFrames()PNG、GIF、帧序列输出
捕获CCapture.js (可选)确定帧率的视频捕获 (WebM、GIF)
无头Puppeteer + Node.js (可选)自动高分辨率渲染、通过 ffmpeg 输出 MP4
SVGp5.js-svg 1.6.0 (可选)打印用的矢量输出——需要 p5.js 1.x
自然介质p5.brush (可选)水彩、木炭、钢笔——需要 p5.js 2.x + WEBGL
纹理p5.grain (可选)胶片颗粒感、纹理叠加
字体Google Fonts / loadFont()通过 OTF/TTF/WOFF2 自定义排版

版本说明

p5.js 1.x (1.11.3) 是默认版本——稳定、文档完善、库兼容性最广。除非项目需要 2.x 功能,否则请使用此版本。

p5.js 2.x (2.2+) 新增:async setup() 替代 preload()、OKLCH/OKLAB 颜色模式、splineVertex()、着色器 .modify() API、可变字体、textToContours()、指针事件。p5.brush 需要此版本。请参阅 references/core-api.md § p5.js 2.0。

流水线

每个项目都遵循相同的 6 阶段路径:

概念 → 设计 → 编码 → 预览 → 导出 → 验证
  1. 概念 — 阐明创意愿景:情绪、色彩世界、运动词汇、独特性
  2. 设计 — 选择模式、画布大小、交互模型、色彩系统、导出格式。将概念映射到技术决策
  3. 编码 — 编写单个 HTML 文件,包含内联的 p5.js。结构:全局变量 → preload() → setup() → draw() → 辅助函数 → 类 → 事件处理器
  4. 预览 — 在浏览器中打开,验证视觉效果。在目标分辨率下测试。检查性能
  5. 导出 — 捕获输出:PNG 使用 saveCanvas(),GIF 使用 saveGif(),MP4 使用 saveFrames() + ffmpeg,批量无头渲染使用 Puppeteer
  6. 验证 — 输出是否符合概念?在预期的显示尺寸下是否视觉上引人注目?你会把它装裱起来吗?

创意指导

美学维度

维度选项参考
色彩系统HSB/HSL、RGB、命名调色板、程序化和谐、渐变插值references/color-systems.md
噪声词汇Perlin 噪声、Simplex 噪声、分形(八度)、域扭曲、旋度噪声references/visual-effects.md § 噪声
粒子系统基于物理、集群、轨迹绘制、吸引子驱动、流场跟随references/visual-effects.md § 粒子
形状语言几何图元、自定义顶点、贝塞尔曲线、SVG 路径references/shapes-and-geometry.md
运动风格缓动、弹簧、噪声驱动、物理模拟、lerp、步进references/animation.md
排版系统字体、加载的 OTF、textToPoints() 粒子文本、动态references/typography.md
着色器效果GLSL 片段/顶点着色器、滤镜着色器、后期处理、反馈循环references/webgl-and-3d.md § 着色器
构图网格、辐射、黄金比例、三分法、有机散布、平铺references/core-api.md § 构图
交互模型鼠标跟随、点击生成、拖拽、键盘状态、滚动驱动、麦克风输入references/interaction.md
混合模式BLEND、ADD、MULTIPLY、SCREEN、DIFFERENCE、EXCLUSION、OVERLAYreferences/color-systems.md § 混合模式
分层createGraphics() 离屏缓冲区、Alpha 合成、蒙版references/core-api.md § 离屏缓冲区
纹理Perlin 表面、点画、影线、半色调、像素排序references/visual-effects.md § 纹理生成

每个项目的变异规则

永远不要使用默认配置。对于每个项目:

  • 自定义调色板 — 永远不要使用原始的 fill(255, 0, 0)。始终使用包含 3-7 种颜色的设计调色板
  • 自定义笔触权重词汇 — 细强调线 (0.5)、中等结构 (1-2)、粗强调线 (3-5)
  • 背景处理 — 永远不要使用纯 background(0) 或 background(255)。始终使用纹理、渐变或层次化背景
  • 运动多样性 — 不同元素使用不同速度。主要元素 1x,次要元素 0.3x,环境元素 0.1x
  • 至少一个自创元素 — 自定义粒子行为、新颖的噪声应用、独特的交互响应

项目特定创新

对于每个项目,至少创新其中之一:

  • 与情绪匹配的自定义调色板(不是预设)
  • 新颖的噪声场组合(例如,旋度噪声 + 域扭曲 + 反馈)
  • 独特的粒子行为(自定义力、自定义轨迹、自定义生成)
  • 用户未要求但能提升作品的交互机制
  • 创造视觉层次的构图技巧

参数设计理念

参数应从算法中涌现,而不是来自通用菜单。问:“这个系统的哪些属性应该可调?”

好的参数 揭示算法的特征:

  • 数量 — 粒子数、分支数、单元格数(控制密度)
  • 尺度 — 噪声频率、元素大小、间距(控制纹理)
  • 速率 — 速度、增长率、衰减率(控制能量)
  • 阈值 — 行为何时改变?(控制戏剧性)
  • 比例 — 比例、力之间的平衡(控制和谐)

不好的参数 是与算法无关的通用控制:

  • “颜色1”、“颜色2”、“大小”——没有上下文就毫无意义
  • 不相关效果的开关
  • 只改变外观,不改变行为的参数

每个参数都应该改变算法的思考方式,而不仅仅是它的外观。改变噪声八度的“湍流”参数是好的。只改变 ellipse() 半径的“粒子大小”滑块是肤浅的。

工作流程

第一步:创意愿景

在任何代码之前,阐明:

  • 情绪 / 氛围:观众应该感觉到什么?沉思?充满活力?不安?俏皮?
  • 视觉故事:随着时间的推移(或通过交互)会发生什么?构建?衰败?转变?震荡?
  • 色彩世界:暖色调/冷色调?单色?互补色?主色调是什么?强调色是什么?
  • 形状语言:有机曲线?锐利几何形状?点?线?混合?
  • 运动词汇:缓慢漂移?爆发式喷射?呼吸式脉冲?机械式精确?
  • 是什么让这个与众不同:是什么让这个草图独一无二?

将用户的提示映射到美学选择。“放松的生成背景”需要与“故障数据可视化”完全不同的东西。

第二步:技术设计

  • 模式 — 从上面表格中的 7 种模式中选择
  • 画布大小 — 横向 1920x1080、纵向 1080x1920、正方形 1080x1080 或响应式 windowWidth/windowHeight
  • 渲染器 — P2D(默认)或 WEBGL(用于 3D、着色器、高级混合模式)
  • 帧率 — 60fps(交互式)、30fps(环境动画)或 noLoop()(静态生成)
  • 导出目标 — 浏览器显示、PNG 静态图、GIF 循环、MP4 视频、SVG 矢量
  • 交互模型 — 被动(无输入)、鼠标驱动、键盘驱动、音频反应、滚动驱动
  • 查看器 UI — 对于交互式生成艺术,从 templates/viewer.html 开始,它提供种子导航、参数滑块和下载。对于简单的草图或视频导出,使用纯 HTML

第三步:编写草图的代码

对于交互式生成艺术(种子探索、参数调整):从 templates/viewer.html 开始。先阅读模板,保留固定部分(种子导航、操作),替换算法和参数控制。这将为用户提供种子上一个/下一个/随机/跳转、带有实时更新的参数滑块以及 PNG 下载——所有这些都已连接好。

对于动画、视频导出或简单草图:使用纯 HTML:

单个 HTML 文件。结构:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>项目名称</title>
  <script>p5.disableFriendlyErrors = true;</script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.11.3/p5.min.js"></script>
  <!-- <script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.11.3/addons/p5.sound.min.js"></script> -->
  <!-- <script src="https://unpkg.com/[email protected]"></script> -->  <!-- SVG 导出 -->
  <!-- <script src="https://cdn.jsdelivr.net/npm/ccapture.js-npmfixed/build/CCapture.all.min.js"></script> -->  <!-- 视频捕获 -->
  <style>
    html, body { margin: 0; padding: 0; overflow: hidden; }
    canvas { display: block; }
  </style>
</head>
<body>
<script>
// === 配置 ===
const CONFIG = {
  seed: 42,
  // ... 项目特定参数
};

// === 调色板 ===
const PALETTE = {
  bg: '#0a0a0f',
  primary: '#e8d5b7',
  // ...
};

// === 全局状态 ===
let particles = [];

// === 预加载(字体、图像、数据) ===
function preload() {
  // font = loadFont('...');
}

// === 设置 ===
function setup() {
  createCanvas(1920, 1080);
  randomSeed(CONFIG.seed);
  noiseSeed(CONFIG.seed);
  colorMode(HSB, 360, 100, 100, 100);
  // 初始化状态...
}

// === 绘制循环 ===
function draw() {
  // 渲染帧...
}

// === 辅助函数 ===
// ...

// === 类 ===
class Particle {
  // ...
}

// === 事件处理器 ===
function mousePressed() { /* ... */ }
function keyPressed() { /* ... */ }
function windowResized() { resizeCanvas(windowWidth, windowHeight); }
</script>
</body>
</html>

关键实现模式:

  • 带种子的随机性:始终使用 randomSeed() + noiseSeed() 以确保可重现性
  • 颜色模式:使用 colorMode(HSB, 360, 100, 100, 100) 以获得直观的颜色控制
  • 状态分离:CONFIG 用于参数,PALETTE 用于颜色,全局变量用于可变状态
  • 基于类的实体:粒子、代理、形状作为类,包含 update() + display() 方法
  • 离屏缓冲区:使用 createGraphics() 进行分层构图、轨迹和蒙版

第四步:预览与迭代

  • 直接在浏览器中打开 HTML 文件——基本草图无需服务器
  • 对于从本地文件加载 loadImage()/loadFont():使用 scripts/serve.sh 或 python -m http.server
  • 使用 Chrome DevTools 的 Performance 标签验证 60fps
  • 在目标导出分辨率下测试,而不仅仅是窗口大小
  • 调整参数直到视觉效果与第一步的概念相匹配

…

[翻译后截断]

Individual skills in this repo

This repo contains 12 individual skills — each has its own dedicated page.

相关技能