P5Js
Скетчи p5.js: генеративное искусство, шейдеры, интерактив, 3D.
Метаданные навыка
| Источник | Встроенный (установлен по умолчанию) |
| Путь | skills/creative/p5js |
| Версия | 1.0.0 |
| Платформы | linux, macos, windows |
| Теги | creative-coding, generative-art, p5js, canvas, interactive, visualization, webgl, shaders, animation |
| Связанные навыки | ascii-video, manim-video, excalidraw |
Справочник: полный SKILL.md
Ниже — полное определение навыка, которое Hermes загружает при его активации. Именно это видит агент в качестве инструкций, когда навык включён.
p5.js Production Pipeline
Когда использовать
Применяй, когда пользователь просит: скетчи p5.js, creative coding, генеративное искусство, интерактивные визуализации, анимации на canvas, браузерное визуальное искусство, data viz, шейдерные эффекты или любой проект на p5.js.
Что внутри
Производственный пайплайн для интерактивного и генеративного визуального искусства на p5.js. Создаёт браузерные скетчи, генеративное искусство, визуализации данных, интерактивные experiences, 3D-сцены, аудио-реактивную графику и моушн-графику — с экспортом в HTML, PNG, GIF, MP4 или SVG. Покрывает: 2D/3D рендеринг, noise и системы частиц, flow fields, шейдеры (GLSL), манипуляции с пикселями, кинетическую типографику, WebGL-сцены, анализ аудио, взаимодействие мышь/клавиатура и headless-экспорт в высоком разрешении.
Творческий стандарт
Это визуальное искусство, рендерящееся в браузере. Canvas — среда, алгоритм — кисть.
До того как написать первую строчку кода — сформулируй творческую концепцию. Что сообщает эта работа? Что заставит зрителя остановиться? Чем отличается от примера из туториала? Промпт пользователя — отправная точка, интерпретируй его с творческим размахом.
Качество с первого рендера — не опция. Результат должен визуально захватывать при первой загрузке. Если выглядит как упражнение из p5.js-туториала, дефолтный конфиг или “AI-generated creative coding” — это брак. Переосмысли перед тем, как отдавать.
Выходи за пределы справочного словаря. Функции noise, системы частиц, цветовые палитры и шейдерные эффекты из референсов — стартовый словарь. В каждом проекте комбинируй, наслаивай, изобретай. Каталог — набор красок, а картину пишешь ты.
Проявляй творческую инициативу. Попросили “систему частиц” — сделай систему с эмерджентным флокингом, призрачными следами, глубинным туманом со смещением палитры и фоновым noise-полем, которое “дышит”. Включи хотя бы одну визуальную деталь, о которой пользователь не просил, но которую оценит.
Плотно, многослойно, продуманно. Каждый кадр должен вознаграждать взгляд. Никогда — плоский белый фон. Всегда — композиционная иерархия. Всегда — осознанный цвет. Всегда — микродетали, заметные только при близком рассмотрении.
Цельная эстетика важнее количества фич. Все элементы должны служить единому визуальному языку: общая цветовая температура, согласованный словарь толщин линий, гармоничные скорости движения. Скетч с десятью несвязанными эффектами хуже, чем с тремя, которые составляют одно целое.
Режимы
| Режим | Вход | Выход | Референс |
|---|---|---|---|
| Генеративное искусство | Сид / параметры | Процедурная визуальная композиция (статичная или анимированная) | references/visual-effects.md |
| Визуализация данных | Датасет / API | Интерактивные чарты, графики, нестандартные дисплеи данных | references/interaction.md |
| Интерактивный experience | Нет (пользователь управляет) | Скетч, управляемый мышью/клавиатурой/касанием | references/interaction.md |
| Анимация / моушн-графика | Таймлайн / раскадровка | Временны́е последовательности, кинетическая типографика, переходы | references/animation.md |
| 3D-сцена | Описание концепции | WebGL-геометрия, освещение, камера, материалы | references/webgl-and-3d.md |
| Обработка изображений | Файл(ы) изображений | Манипуляции с пикселями, фильтры, мозаика, пуантилизм | references/visual-effects.md § Pixel Manipulation |
| Аудио-реактивный | Аудиофайл / микрофон | Генеративная графика, управляемая звуком | references/interaction.md § Audio Input |
Стек
Один самодостаточный HTML-файл на проект. Сборка не нужна.
| Слой | Инструмент | Назначение |
|---|---|---|
| Ядро | p5.js 1.11.3 (CDN) | Рендеринг на canvas, математика, трансформации, обработка событий |
| 3D | p5.js WebGL mode | 3D-геометрия, камера, освещение, GLSL-шейдеры |
| Аудио | p5.sound.js (CDN) | FFT-анализ, амплитуда, ввод с микрофона, осцилляторы |
| Экспорт | Встроенные saveCanvas() / saveGif() / saveFrames() | PNG, GIF, последовательность кадров |
| Захват | CCapture.js (опционально) | Детерминированный захват видео с заданным фреймрейтом (WebM, GIF) |
| Headless | Puppeteer + Node.js (опционально) | Автоматизированный high-res рендеринг, MP4 через ffmpeg |
| SVG | p5.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(), shader .modify() API, вариативные шрифты, textToContours(), pointer events. Обязательна для p5.brush. Смотри references/core-api.md § p5.js 2.0.
Пайплайн
Каждый проект проходит один и тот же путь из 6 этапов:
CONCEPT → DESIGN → CODE → PREVIEW → EXPORT → VERIFY
- CONCEPT — Сформулируй творческое видение: настроение, цветовой мир, словарь движения, что делает это уникальным
- DESIGN — Выбери режим, размер canvas, модель взаимодействия, цветовую систему, формат экспорта. Переведи концепцию в технические решения
- CODE — Напиши единый HTML-файл с инлайн p5.js. Структура: глобальные переменные →
preload()→setup()→draw()→ вспомогательные функции → классы → обработчики событий - PREVIEW — Открой в браузере, проверь визуальное качество. Протестируй в целевом разрешении. Проверь производительность
- EXPORT — Захвати вывод:
saveCanvas()для PNG,saveGif()для GIF,saveFrames()+ ffmpeg для MP4, Puppeteer для headless-пакетной обработки - VERIFY — Соответствует ли результат концепции? Визуально ли он впечатляет при целевом размере отображения? Повесил бы ты это на стену?
Творческое направление
Эстетические измерения
| Измерение | Варианты | Референс |
|---|---|---|
| Цветовая система | HSB/HSL, RGB, именованные палитры, процедурная гармония, градиентная интерполяция | references/color-systems.md |
| Словарь noise | Perlin noise, simplex, фрактальный (октавный), domain warping, curl noise | references/visual-effects.md § Noise |
| Системы частиц | Физические, флокинг, рисующие следы, управляемые аттрактором, следующие по flow field | references/visual-effects.md § Particles |
| Язык форм | Геометрические примитивы, кастомные вершины, кривые Безье, SVG-пути | references/shapes-and-geometry.md |
| Стиль движения | Eased, на пружинах, noise-driven, физическое симулирование, lerped, ступенчатое | references/animation.md |
| Типографика | Системные шрифты, загруженные OTF, textToPoints() particle text, кинетика | references/typography.md |
| Шейдерные эффекты | GLSL fragment/vertex, filter shaders, пост-обработка, feedback loops | references/webgl-and-3d.md § Shaders |
| Композиция | Сетка, радиальная, золотое сечение, правило третей, органическое рассеивание, тайлинг | references/core-api.md § Composition |
| Модель взаимодействия | Следование мыши, спавн по клику, перетаскивание, состояние клавиатуры, scroll-driven, ввод с микрофона | references/interaction.md |
| Режимы смешения | BLEND, ADD, MULTIPLY, SCREEN, DIFFERENCE, EXCLUSION, OVERLAY | references/color-systems.md § Blend Modes |
| Слоистость | Офскрин-буферы createGraphics(), альфа-композитинг, маскирование | references/core-api.md § Offscreen Buffers |
| Текстура | Perlin surface, stippling, hatching, halftone, сортировка пикселей | references/visual-effects.md § Texture Generation |
Правила вариативности для каждого проекта
Никогда не используй дефолтные конфигурации. В каждом проекте:
- Кастомная цветовая палитра — никогда не
fill(255, 0, 0)в сыром виде. Всегда спроектированная палитра из 3–7 цветов - Словарь толщин линий — тонкие акценты (0.5), средняя структура (1–2), жирный акцент (3–5)
- Обработка фона — никогда не просто
background(0)илиbackground(255). Всегда текстура, градиент или многослойность - Разнообразие движения — разные скорости для разных элементов. Первичные — 1x, вторичные — 0.3x, фоновые — 0.1x
- Хотя бы один изобретённый элемент — кастомное поведение частицы, нестандартное применение noise, уникальная реакция на взаимодействие
Изобретение для конкретного проекта
Для каждого проекта изобретай хотя бы одно из:
- Кастомную цветовую палитру под настроение (не пресет)
- Нестандартную комбинацию noise-полей (например, curl noise + domain warp + feedback)
- Уникальное поведение частиц (кастомные силы, следы, спавн)
- Механику взаимодействия, о которой пользователь не просил, но которая поднимает работу на уровень выше
- Композиционный приём, создающий визуальную иерархию
Философия дизайна параметров
Параметры должны вырастать из алгоритма, а не из универсального меню. Спрашивай: “Какие свойства этой системы должны быть настраиваемыми?”
Хорошие параметры раскрывают характер алгоритма:
- Количества — сколько частиц, ветвей, ячеек (контролирует плотность)
- Масштабы — частота noise, размер элементов, отступы (контролирует текстуру)
- Скорости — скорость, темп роста, затухание (контролирует энергию)
- Пороги — когда меняется поведение? (контролирует драму)
- Соотношения — пропорции, баланс сил (контролирует гармонию)
Плохие параметры — обобщённые переключатели, не связанные с алгоритмом:
- “color1”, “color2”, “size” — бессмысленны без контекста
- Toggle-переключатели для несвязанных эффектов
- Параметры, влияющие только на косметику, но не на поведение
Каждый параметр должен менять то, как алгоритм думает, а не только то, как он выглядит. Параметр “turbulence”, изменяющий октавы noise, — хорош. Слайдер “particle size”, меняющий только радиус ellipse(), — мелковат.
Рабочий процесс
Шаг 1: Творческое видение
До любого кода сформулируй:
- Настроение / атмосфера: что должен почувствовать зритель? Созерцательность? Заряженность? Тревогу? Игривость?
- Визуальная история: что происходит со временем (или при взаимодействии)? Нарастание? Распад? Трансформация? Осцилляция?
- Цветовой мир: тёплый/холодный? Монохром? Комплементарный? Какой доминирующий оттенок? Акцент?
- Язык форм: органичные кривые? Острая геометрия? Точки? Линии? Смешение?
- Словарь движения: медленный дрейф? Взрывной всплеск? Дышащий пульс? Механическая точность?
- Что делает ЭТО особенным: какая одна вещь делает этот скетч уникальным?
Преобразуй промпт пользователя в эстетические выборы. “Relaxing generative background” требует совершенно других решений во всём, нежели “glitch data visualization.”
Шаг 2: Техническое проектирование
- Режим — один из 7 режимов из таблицы выше
- Размер canvas — ландшафтный 1920x1080, портретный 1080x1920, квадратный 1080x1080 или адаптивный
windowWidth/windowHeight - Рендерер —
P2D(дефолт) илиWEBGL(для 3D, шейдеров, продвинутых режимов смешения) - Фреймрейт — 60fps (интерактивный), 30fps (фоновая анимация) или
noLoop()(статичная генерация) - Цель экспорта — браузерный дисплей, PNG, GIF-петля, MP4, SVG-вектор
- Модель взаимодействия — пассивная (без ввода), управляемая мышью, клавиатурой, аудио-реактивная, scroll-driven
- UI для зрителя — для интерактивного генеративного искусства стартуй с
templates/viewer.html: там уже есть навигация по сидам, слайдеры параметров и скачивание. Для простых скетчей или видеоэкспорта используй голый HTML
Шаг 3: Пишем скетч
Для интерактивного генеративного искусства (исследование сидов, подбор параметров): стартуй с templates/viewer.html. Прочитай шаблон сначала, сохрани фиксированные секции (навигация по сидам, действия), замени алгоритм и элементы управления параметрами. Это даёт пользователю prev/next/random/jump для сидов, слайдеры с live-обновлением и скачивание 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>Project Name</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/p5.js-svg@1.6.0"></script> --> <!-- SVG export -->
<!-- <script src="https://cdn.jsdelivr.net/npm/ccapture.js-npmfixed/build/CCapture.all.min.js"></script> --> <!-- video capture -->
<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 = [];
// === Preload (шрифты, изображения, данные) ===
function preload() {
// font = loadFont('...');
}
// === Setup ===
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()для многослойной композиции, следов, масок
Шаг 4: Предпросмотр и итерации
- Открой HTML-файл напрямую в браузере — сервер не нужен для базовых скетчей
- Для
loadImage()/loadFont()из локальных файлов: используйscripts/serve.shилиpython3 -m http.server - Вкладка Performance в Chrome DevTools для проверки 60fps
- Тестируй в целевом разрешении экспорта, а не только в размере окна
- Подбирай параметры, пока визуальный результат не совпадёт с концепцией из шага 1
Шаг 5: Экспорт
| Формат | Метод | Команда |
|---|---|---|
| PNG | saveCanvas('output', 'png') в keyPressed() | Нажать ‘s’ для сохранения |
| High-res PNG | Puppeteer headless capture | node scripts/export-frames.js sketch.html --width 3840 --height 2160 --frames 1 |
| GIF | saveGif('output', 5) — захватывает N секунд | Нажать ‘g’ для сохранения |
| Последовательность кадров | saveFrames('frame', 'png', 10, 30) — 10с при 30fps | Затем ffmpeg -i frame-%04d.png -c:v libx264 output.mp4 |
| MP4 | Puppeteer frame capture + ffmpeg | bash scripts/render.sh sketch.html output.mp4 --duration 30 --fps 30 |
| SVG | createCanvas(w, h, SVG) с p5.js-svg | save('output.svg') |
Шаг 6: Проверка качества
- Соответствует ли видению? Сравни результат с творческой концепцией. Выглядит generic — возвращайся к шагу 1
- Резкость: чёткое ли изображение при целевом размере отображения? Нет ли артефактов алиасинга?
- Производительность: держит ли 60fps в браузере? (минимум 30fps для анимаций)
- Цвет: хорошо ли работают цвета вместе? Проверь на светлом и тёмном мониторах
- Граничные случаи: что происходит у краёв canvas? При ресайзе? После 10 минут работы?
Критические замечания по реализации
Производительность — сначала отключи FES
Friendly Error System (FES) добавляет до 10x накладных расходов. Отключай в каждом production-скетче:
p5.disableFriendlyErrors = true; // BEFORE setup()
function setup() {
pixelDensity(1); // prevent 2x-4x overdraw on retina
createCanvas(1920, 1080);
}
В горячих циклах (частицы, операции с пикселями) используй Math.* вместо обёрток p5 — это ощутимо быстрее:
// In draw() or update() hot paths:
let a = Math.sin(t); // not sin(t)
let r = Math.sqrt(dx*dx+dy*dy); // not dist() — or better: skip sqrt, compare magSq
let v = Math.random(); // not random() — when seed not needed
let m = Math.min(a, b); // not min(a, b)
Никогда не console.log() внутри draw(). Никогда не манипулируй DOM в draw(). Смотри references/troubleshooting.md § Performance.
Сидированная случайность — всегда
Каждый генеративный скетч должен быть воспроизводимым. Один сид — один результат.
function setup() {
randomSeed(CONFIG.seed);
noiseSeed(CONFIG.seed);
// All random() and noise() calls now deterministic
}
Никогда не используй Math.random() для генеративного контента — только для производительно-критичного не-визуального кода. Для визуальных элементов — всегда random(). Если нужен случайный сид: CONFIG.seed = floor(random(99999)).
Поддержка платформ генеративного искусства (fxhash / Art Blocks)
Для платформ генеративного искусства замени PRNG p5 детерминированным PRNG платформы:
// fxhash convention
const SEED = $fx.hash; // unique per mint
const rng = $fx.rand; // deterministic PRNG
$fx.features({ palette: 'warm', complexity: 'high' });
// In setup():
randomSeed(SEED); // for p5's noise()
noiseSeed(SEED);
// Replace random() with rng() for platform determinism
let x = rng() * width; // instead of random(width)
Смотри references/export-pipeline.md § Platform Export.
Цветовой режим — используй HSB
HSB (Hue, Saturation, Brightness) в генеративном искусстве куда удобнее RGB:
colorMode(HSB, 360, 100, 100, 100);
// Now: fill(hue, sat, bri, alpha)
// Rotate hue: fill((baseHue + offset) % 360, 80, 90)
// Desaturate: fill(hue, sat * 0.3, bri)
// Darken: fill(hue, sat, bri * 0.5)
Никогда не хардкоди сырые RGB-значения. Определи объект палитры, выводи вариации процедурно. Смотри references/color-systems.md.
Noise — мультиоктавный, не сырой
Сырой noise(x, y) выглядит как плавные пятна. Накладывай октавы для естественной текстуры:
function fbm(x, y, octaves = 4) {
let val = 0, amp = 1, freq = 1, sum = 0;
for (let i = 0; i < octaves; i++) {
val += noise(x * freq, y * freq) * amp;
sum += amp;
amp *= 0.5;
freq *= 2;
}
return val / sum;
}
Для плавных органичных форм используй domain warping: подавай вывод noise обратно как координаты для следующего вызова noise. Смотри references/visual-effects.md.
createGraphics() для слоёв — не опционально
Плоский однопроходный рендеринг выглядит плоским. Используй офскрин-буферы для композиции:
let bgLayer, fgLayer, trailLayer;
function setup() {
createCanvas(1920, 1080);
bgLayer = createGraphics(width, height);
fgLayer = createGraphics(width, height);
trailLayer = createGraphics(width, height);
}
function draw() {
renderBackground(bgLayer);
renderTrails(trailLayer); // persistent, fading
renderForeground(fgLayer); // cleared each frame
image(bgLayer, 0, 0);
image(trailLayer, 0, 0);
image(fgLayer, 0, 0);
}
Производительность — векторизуй там, где возможно
Draw-вызовы p5.js дороги. Для тысяч частиц:
// SLOW: individual shapes
for (let p of particles) {
ellipse(p.x, p.y, p.size);
}
// FAST: single shape with beginShape()
beginShape(POINTS);
for (let p of particles) {
vertex(p.x, p.y);
}
endShape();
// FASTEST: pixel buffer for massive counts
loadPixels();
for (let p of particles) {
let idx = 4 * (floor(p.y) * width + floor(p.x));
pixels[idx] = r; pixels[idx+1] = g; pixels[idx+2] = b; pixels[idx+3] = 255;
}
updatePixels();
Смотри references/troubleshooting.md § Performance.
Instance mode для нескольких скетчей
Глобальный режим засоряет window. В production используй instance mode:
const sketch = (p) => {
p.setup = function() {
p.createCanvas(800, 800);
};
p.draw = function() {
p.background(0);
p.ellipse(p.mouseX, p.mouseY, 50);
};
};
new p5(sketch, 'canvas-container');
Обязателен при встраивании нескольких скетчей на одну страницу или интеграции с фреймворками.
Подводные камни WebGL Mode
createCanvas(w, h, WEBGL)— начало координат в центре, не в верхнем левом углу- Ось Y инвертирована (положительный Y идёт вверх в WEBGL, вниз в P2D)
translate(-width/2, -height/2)для получения координат как в P2Dpush()/pop()вокруг каждой трансформации — переполнение матрицы происходит молчаtexture()доrect()/plane()— не после- Кастомные шейдеры:
createShader(vert, frag)— тестируй в нескольких браузерах
Экспорт — соглашение о горячих клавишах
Каждый скетч должен включать эти привязки в keyPressed():
function keyPressed() {
if (key === 's' || key === 'S') saveCanvas('output', 'png');
if (key === 'g' || key === 'G') saveGif('output', 5);
if (key === 'r' || key === 'R') { randomSeed(millis()); noiseSeed(millis()); }
if (key === ' ') CONFIG.paused = !CONFIG.paused;
}
Headless-экспорт видео — используй noLoop()
Для headless-рендеринга через Puppeteer скетч обязан использовать noLoop() в setup. Без этого цикл отрисовки p5 работает свободно, пока скриншоты делаются медленно — скетч убегает вперёд, и ты получаешь пропущенные/дублированные кадры.
function setup() {
createCanvas(1920, 1080);
pixelDensity(1);
noLoop(); // capture script controls frame advance
window._p5Ready = true; // signal readiness to capture script
}
Встроенный scripts/export-frames.js определяет _p5Ready и вызывает redraw() один раз на захват, обеспечивая точное соответствие 1:1 между кадрами. Смотри references/export-pipeline.md § Deterministic Capture.
Для многосценных видео используй архитектуру per-clip: один HTML на сцену, независимый рендеринг, сшивка через ffmpeg -f concat. Смотри references/export-pipeline.md § Per-Clip Architecture.
Рабочий процесс агента
При создании скетчей p5.js:
- Напиши HTML-файл — один самодостаточный файл, весь код инлайн
- Открой в браузере —
open sketch.html(macOS) илиxdg-open sketch.html(Linux) - Локальные ресурсы (шрифты, изображения) требуют сервера:
python3 -m http.server 8080в директории проекта, затем откройhttp://localhost:8080/sketch.html - Экспорт PNG/GIF — добавь горячие клавиши
keyPressed()как показано выше, скажи пользователю, какую клавишу нажать - Headless-экспорт —
node scripts/export-frames.js sketch.html --frames 300для автоматизированного захвата кадров (скетч должен использоватьnoLoop()+_p5Ready) - Рендеринг MP4 —
bash scripts/render.sh sketch.html output.mp4 --duration 30 - Итеративное уточнение — редактируй HTML-файл, пользователь обновляет браузер для просмотра изменений
- Загружай референсы по требованию — используй
skill_view(name="p5js", file_path="references/...")для загрузки конкретных файлов референсов по мере необходимости в ходе реализации
Целевые показатели производительности
| Метрика | Цель |
|---|---|
| Фреймрейт (интерактивный) | 60fps стабильно |
| Фреймрейт (анимированный экспорт) | минимум 30fps |
| Количество частиц (P2D shapes) | 5 000–10 000 при 60fps |
| Количество частиц (пиксельный буфер) | 50 000–100 000 при 60fps |
| Разрешение canvas | до 3840x2160 (экспорт), 1920x1080 (интерактивный) |
| Размер файла (HTML) | < 100KB (без CDN-библиотек) |
| Время загрузки | < 2с до первого кадра |
Референсы
| Файл | Содержание |
|---|---|
references/core-api.md | Настройка canvas, система координат, цикл отрисовки, push()/pop(), офскрин-буферы, паттерны композиции, pixelDensity(), адаптивный дизайн |
references/shapes-and-geometry.md | 2D-примитивы, beginShape()/endShape(), кривые Безье/Catmull-Rom, системы vertex(), кастомные формы, p5.Vector, signed distance fields, конвертация SVG-путей |
references/visual-effects.md | Noise (Perlin, фрактальный, domain warp, curl), flow fields, системы частиц (физика, флокинг, следы), манипуляции с пикселями, генерация текстур (stipple, hatch, halftone), feedback loops, reaction-diffusion |
references/animation.md | Покадровая анимация, функции ускорения, lerp()/map(), пружинная физика, конечные автоматы, последовательности по таймлайну, тайминг через millis(), паттерны переходов |
references/typography.md | text(), loadFont(), textToPoints(), кинетическая типографика, текстовые маски, метрики шрифтов, адаптивный размер текста |
references/color-systems.md | colorMode(), HSB/HSL/RGB, lerpColor(), paletteLerp(), процедурные палитры, цветовая гармония, blendMode(), рендеринг градиентов, курируемая библиотека палитр |
references/webgl-and-3d.md | WEBGL-рендерер, 3D-примитивы, камера, освещение, материалы, кастомная геометрия, GLSL-шейдеры (createShader(), createFilterShader()), framebuffers, пост-обработка |
references/interaction.md | События мыши, состояние клавиатуры, тач-ввод, DOM-элементы, createSlider()/createButton(), аудиовход (p5.sound FFT/amplitude), scroll-driven анимация, адаптивные события |
references/export-pipeline.md | saveCanvas(), saveGif(), saveFrames(), детерминированный headless-захват, ffmpeg frame-to-video, CCapture.js, SVG-экспорт, per-clip архитектура, экспорт для платформ (fxhash), нюансы видео |
references/troubleshooting.md | Профилирование производительности, бюджеты на пиксель, распространённые ошибки, совместимость браузеров, отладка WebGL, проблемы загрузки шрифтов, ловушки pixel density, утечки памяти, CORS |
templates/viewer.html | Шаблон интерактивного просмотрщика: навигация по сидам (prev/next/random/jump), слайдеры параметров, скачивание PNG, адаптивный canvas. Стартуй с этого для исследуемого генеративного искусства |
Творческое отклонение (использовать только когда пользователь просит экспериментального/творческого/уникального результата)
Если пользователь просит творческий, экспериментальный, неожиданный или нестандартный результат — выбери стратегию, которая лучше всего подходит, и пройди через её шаги ДО генерации кода.
- Концептуальное смешение — когда пользователь называет две вещи для объединения или хочет гибридную эстетику
- SCAMPER — когда пользователь хочет вариацию на известный паттерн генеративного искусства
- Ассоциация на расстоянии — когда пользователь даёт одну концепцию и хочет исследования (“сделай что-нибудь про время”)
Концептуальное смешение
- Назови две различные визуальные системы (например, физика частиц + почерк)
- Составь карту соответствий (частицы = капли чернил, силы = давление пера, поля = контуры букв)
- Смешивай выборочно — оставляй те соответствия, которые порождают интересные эмерджентные визуальные эффекты
- Кодируй смесь как единую систему, а не две системы рядом
SCAMPER-трансформация
Возьми известный генеративный паттерн (flow field, система частиц, L-система, клеточный автомат) и трансформируй его систематически:
- Substitute: замени круги текстовыми символами, линии — градиентами
- Combine: соедини два паттерна (flow field + voronoi)
- Adapt: примени 2D-паттерн к 3D-проекции
- Modify: преувеличь масштаб, деформируй пространство координат
- Purpose: используй физическое симулирование для типографики, алгоритм сортировки для цвета
- Eliminate: убери сетку, цвет, симметрию
- Reverse: прогони симуляцию назад, инвертируй пространство параметров
Ассоциация на расстоянии
- Отправная точка — концепция пользователя (например, “одиночество”)
- Генерируй ассоциации на трёх дистанциях:
- Близкие (очевидные): пустая комната, одинокая фигура, тишина
- Средние (интересные): одна рыба в стае, плывущая против течения, телефон без уведомлений, зазор между вагонами метро
- Далёкие (абстрактные): простые числа, асимптотические кривые, цвет трёх часов ночи
- Разрабатывай ассоциации средней дистанции — они достаточно конкретны для визуализации, но неожиданны, чтобы быть интересными