ascii-animation

iart-ai/web-animation-skills · Agent Skill

Этот навык должен использоваться, когда пользователь просит "создать ASCII-анимацию", "создать терминальное/CLI введение или загрузчик", "преобразовать изображение или видео в ASCII-арт", "добавить ASCII-шейдер/пост-эффект к холсту или сцене Three.js", "создать ретро/хакерское движение текста- символов", или "анимировать текстовые символы с градиентом яркости". Покрывает генеративные ASCII-поля, изображение/видео/3D-в-ASCII и анимированное характерное искусство как для веба, так и для терминала.

Перейти к установке ↓

Обзор

Авторiart-aiОрганизация
Репозиторийiart-ai/web-animation-skills ↗
Папка скиллаascii-animation
Звёзды58
Форки9
Файлы4
ЛицензияMIT
Обновлён22 июня 2026 г.
СсылкиИсходник скилла ↗ · Репозиторий ↗

Проверка Mozgi

Что мы нашли в файлах скилла. Подробности — по подписке.

Безопасность
средний риск · обнаружено 2 момента, требующих внимания
Совместимость
нужны дополнительные программы
Похожие скиллы
найдено 72 похожих скилла
Ещё в подписке

Установка

Скилл — это папка с файлом SKILL.md. Выберите своего агента и скопируйте команды в терминал (macOS, Linux или Git Bash на Windows) в корне проекта.

Скопируйте промпт и вставьте в Claude, Codex или другого ассистента: он сам проверит скилл и подключит его.

Установи мне скилл «ascii-animation» с mozgi.io (https://mozgi.io/skills/iart-ai-ascii-animation/).

1. Скачай архив: https://mozgi.io/skills/iart-ai-ascii-animation/download
   Если не скачивается — возьми папку скилла из исходника: https://github.com/iart-ai/web-animation-skills/tree/main/skills/ascii-animation
2. Прочитай SKILL.md и остальные файлы. Проверь, что скилл безопасен: нет скрытых команд, отправки данных наружу или скриптов, которые делают не то, что описано. Если что-то подозрительно — остановись и скажи мне.
3. Положи папку «ascii-animation» в папку скиллов своего агента: .claude/skills/ для Claude Code, .agents/skills/ для Codex, .cursor/skills/ для Cursor, .gemini/skills/ для Gemini CLI. В проекте — внутри проекта, иначе в домашней папке (~/.claude/skills/ и т. п.).
4. Убедись, что получилось <папка скиллов>/ascii-animation/SKILL.md.
5. Коротко расскажи, что умеет этот скилл, и предложи попробовать его на моей задаче.

Если какой-то шаг не можешь сделать сам — подскажи, что нажать или ввести.

Файлы скилла

4 файла Скачать ZIP

Просмотрите SKILL.md и сопутствующие файлы перед установкой. Клик по файлу — предпросмотр.

Содержимое SKILL.md

Оригинальный текст автора · только чтение

ASCII Animation

Render motion entirely with text characters. ASCII output is extremely lightweight, distinctive, and works in browsers (<pre>/canvas), terminals (ANSI), and over any 3D scene (Three.js AsciiEffect).

When to use

  • Build terminal/CLI intros, loaders, banners, or a retro/hacker aesthetic.
  • Convert an image, video frame, or 3D scene into animated ASCII.
  • Add an ASCII post-effect over an existing canvas/WebGL render.
  • Create generative text fields (plasma, sine waves, noise, tunnels).

Core concept: the brightness ramp

Map luminance (0..1) to a character whose ink density matches. Order characters dark-to-light. Pick the index with Math.round(lum * (ramp.length - 1)).

Common ramps (dark to light):

  • Short (10): .:-=+*#%@
  • Medium (16): .'\^",:;Il!i><~+_-?][}{1)(|/tfjrxnuvczXYUJCLQ0OZmwqpdbkhao*#MW&8%B@$` truncated — see table below.
  • Standard 70-level (Paul Bourke), best for photos:

` $@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,"^'. `` (reverse for dark-on-light).

Compute relative luminance from sRGB (perceptual):

const lum = (0.2126 * r + 0.7152 * g + 0.0722 * b) / 255; // 0..1

Invert when drawing dark text on a light background: lum = 1 - lum.

Character cell aspect correction (the #1 gotcha)

Monospace character cells are taller than wide — roughly 0.5 width:height. Sampling a square pixel grid produces a vertically stretched image. Correct by sampling fewer rows than columns: for a target of cols characters wide, use rows = Math.round(cols * (imgH / imgW) * fontAspect) where fontAspect ≈ 0.5. Equivalently, when drawing to an offscreen canvas, set its height to cols * aspect * 0.5.

Web rendering: <pre> vs canvas

  • <pre> + textContent: simplest. One string with \n per row. Fine up to ~120×60 chars at 30fps. Set white-space: pre; font-family: monospace; line-height: 1;.
  • Canvas fillText: needed for per-character color, larger grids, or 60fps. Draw each char at x * cellW, y * cellH. Faster than thousands of DOM nodes.

Generative <pre> field (plasma):

const pre = document.querySelector('pre');
const COLS = 100, ROWS = 50, ramp = ' .:-=+*#%@';
function frame(t) {
  let out = '';
  for (let y = 0; y < ROWS; y++) {
    for (let x = 0; x < COLS; x++) {
      const v = Math.sin(x * 0.2 + t * 0.001)
              + Math.sin(y * 0.3 + t * 0.0013)
              + Math.sin((x + y) * 0.15 + t * 0.0007);
      const lum = (v + 3) / 6;                    // normalize -3..3 to 0..1
      out += ramp[Math.round(lum * (ramp.length - 1))];
    }
    out += '\n';
  }
  pre.textContent = out;
  requestAnimationFrame(frame);
}
requestAnimationFrame(frame);

Image / video to ASCII

Draw the source to a small offscreen canvas at cols × rows, read pixels with getImageContext().getImageData, then map each pixel to a character. For video, repeat per frame from a <video> element.

function videoToAscii(video, cols = 120) {
  const aspect = video.videoHeight / video.videoWidth;
  const rows = Math.round(cols * aspect * 0.5);   // cell aspect correction
  const cv = document.createElement('canvas');
  cv.width = cols; cv.height = rows;
  const ctx = cv.getContext('2d', { willReadFrequently: true });
  const ramp = ' .:-=+*#%@', pre = document.querySelector('pre');
  (function tick() {
    ctx.drawImage(video, 0, 0, cols, rows);
    const { data } = ctx.getImageData(0, 0, cols, rows);
    let out = '';
    for (let i = 0; i < data.length; i += 4) {
      const lum = (0.2126*data[i] + 0.7152*data[i+1] + 0.0722*data[i+2]) / 255;
      out += ramp[Math.round(lum * (ramp.length - 1))];
      if (((i / 4) + 1) % cols === 0) out += '\n';
    }
    pre.textContent = out;
    requestAnimationFrame(tick);
  })();
}

For Node image→ASCII, see scripts/img-to-ascii.mjs.

3D-to-ASCII with Three.js

AsciiEffect wraps a renderer and renders any scene as ASCII into a DOM element. Render through the effect, not the renderer.

import { AsciiEffect } from 'three/addons/effects/AsciiEffect.js';
const effect = new AsciiEffect(renderer, ' .:-=+*#%@', { invert: true });
effect.setSize(innerWidth, innerHeight);
effect.domElement.style.color = '#0f0';
effect.domElement.style.backgroundColor = 'black';
document.body.appendChild(effect.domElement);
// in loop: effect.render(scene, camera);  // NOT renderer.render

Terminal / CLI animation

Loop with ANSI escape codes: hide the cursor, move to home, print the frame, throttle to 12–24 fps. Show the cursor again on exit.

const ESC = '\x1b[';
process.stdout.write(ESC + '?25l');               // hide cursor
function frame(t) {
  process.stdout.write(ESC + 'H');                // cursor to top-left
  // build and write rows...
}
const id = setInterval(() => frame(Date.now()), 1000 / 20);
process.on('SIGINT', () => {
  clearInterval(id);
  process.stdout.write(ESC + '?25h' + ESC + '2J'); // show cursor, clear
  process.exit();
});

Use ESC + '2J' to clear the whole screen, ESC + 'H' for home (cheaper per frame than clearing). Color with \x1b[38;2;R;G;Bm (truecolor) and reset with \x1b[0m.

Deliver & verify (standalone HTML)

> Packaged helper (scripts/): scripts/seek-shot.sh anim.html 0 1.5 3 freezes the ?t=N harness and screenshots each moment; scripts/contact-sheet.sh sheet.png frame-*.png tiles them for one-glance review. See scripts/README.md.

For a self-contained web ASCII piece (generative field, image/video→ASCII, AsciiEffect scene) the deliverable is one HTML file that opens directly in a browser — the <pre>/canvas, the ramp, and the rAF loop inline (Three.js from CDN if used). No build step. One file is the right tier; don't reach for a bundler. (Terminal/CLI pieces verify differently — capture stdout or a screenshot of the terminal.)

Output contract:

  • One .html file: the render target, the brightness ramp, and the requestAnimationFrame loop in one inline <script>.
  • Drive frames from an injectable time (not Date.now()/performance.now() directly) and seed any randomness, so a frame is reproducible.

Seek harness — freeze the rAF loop on a deterministic frame. ?t=N renders exactly one frame at simulated time N instead of looping, so a screenshot is reproducible. Feed N where the loop reads time, and fix the seed:

<script>
  const t = new URLSearchParams(location.search).get("t");
  // your frame(time){…} reads `time`, not Date.now(); RNG uses a fixed seed
  if (t !== null) { frame(parseFloat(t)); }        // render ONE frame, no rAF
  else { (function loop(now){ frame(now); requestAnimationFrame(loop); })(0); }
  window.__ready = true;
</script>

Verify loop — render → freeze → screenshot → check: render at a few simulated times (?t=0, ?t=1000, ?t=2000), screenshot each, and check fidelity (ramp reads dark→light correctly, motion evolves) plus artifacts (vertical stretch from missing cell-aspect correction, wrong invert on a light bg, clipped grid, FOUC before the monospace font loads — fonts settle the cell metrics, so wait). Any headless tool works:

npx playwright screenshot --wait-for-timeout=500 "file://$PWD/ascii.html?t=1000" frame-mid.png

Before you finish:

1. Opens standalone — no console errors, CDN (Three.js, if used) loads, monospace font applied.

2. ?t=N renders one deterministic frame (injected time + fixed seed), no live loop.

3. Screenshotted at 3 simulated times — matches the brief, no vertical stretch or wrong-invert.

4. prefers-reduced-motion honored — stop/slow the rAF loop, show a static frame.

5. Easing is intentional — frame rate throttled on purpose (12–24fps for retro feel), ramp ordering deliberate.

Quick reference

| Need | Approach |

|------|----------|

| Simple generative field | <pre> + textContent, sine/noise → ramp |

| Photo fidelity | 70-level Bourke ramp, luminance from sRGB weights |

| Per-char color / 60fps | Canvas fillText per cell |

| Video | <video> → offscreen canvas → getImageData per frame |

| 3D scene | Three.js AsciiEffect.render(scene, camera) |

| Terminal | ANSI \x1b[H home + throttle 12–24fps, hide cursor |

| Aspect fix | rows = cols * imgAspect * 0.5 |

Reference files

  • references/rendering.md — Full brightness ramp tables (10/70/extended), pixel sampling math and cell aspect correction, <pre> vs canvas tradeoffs with code, ANSI terminal frame loop with truecolor, and complete AsciiEffect wiring.
  • scripts/img-to-ascii.mjs — Runnable Node script that converts a PNG/JPG file to ASCII text, with --cols, --invert, and --ramp flags.

Вопросы и ответы

Что делает скилл ascii-animation?

Этот навык должен использоваться, когда пользователь просит "создать ASCII-анимацию", "создать терминальное/CLI введение или загрузчик", "преобразовать изображение или видео в ASCII-арт", "добавить ASCII-шейдер/пост-эффект к холсту или сцене Three.js", "создать ретро/хакерское движение текста- символов", или "анимировать текстовые символы с градиентом яркости". Покрывает генеративные ASCII-поля, изображение/видео/3D-в-ASCII и анимированное характерное искусство как для веба, так и для терминала.

Как установить ascii-animation?

Откройте блок «Установка» на этой странице и выберите своего агента — Claude Code, Codex, Cursor или Gemini CLI: там готовые команды, которые копируют папку скилла в нужное место. Либо скопируйте промпт из вкладки «Через ассистента» — ассистент сам проверит и подключит скилл.

С какими нейросетями работает ascii-animation?

Скиллы — это обычные инструкции в Markdown (формат Agent Skills), поэтому ascii-animation подходит любому агенту, который читает SKILL.md: Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode и другие. Модель загружает инструкции только когда задача подходит под описание скилла.

Скилл ascii-animation бесплатный?

Скилл опубликован автором iart-ai в открытом доступе под лицензией MIT. Сам скилл ничего не стоит — вы платите только своему провайдеру нейросети за использованные токены.

Безопасно ли устанавливать скиллы?

Скилл — это инструкции, которые агент будет выполнять, поэтому перед установкой прочитайте SKILL.md и сопутствующие файлы. Скрипты из папки скилла запускаются только если их запустит агент — следите за тем, что он делает, и не давайте лишних прав.

Чем скилл отличается от MCP-сервера или плагина?

MCP-сервер и плагин дают модели новые инструменты — код, который выполняется и возвращает результат. Скилл даёт знания и порядок действий: как подходить к задаче, какие шаги делать и как выглядит хороший результат. Ему не нужен сервер или ключ API.

Похожие скиллы

Все скиллы →
glassmorphism Этот навык должен использоваться, когда пользователь просит "добавить эффект гласморфизма", "фростирующий стеклянный интерфейс", "стиль жидкого стекла Apple", "фростирующую блур-карту", "анимацию прозрачной стеклянной панели", "сделать фростирующую нав-бар", "создать стеклянный модальный/диалоговый окно", "анимировать стеклянную карту при наведении", или "добавить рефрактирующий жидкий-глас герой". Покрывает фростирующие прозрачные панели с размытием backdrop-filter, края/спекулярные блики, SVG жидкое-стеклянную рефракцию, движение при наведении/прокрутке/входе и доступные сниженные-прозрачности fallbacks. iart-ai58 remotion-video-creation Предоставляет 29 правил для создания видео в React с использованием Remotion, включая 3D, анимацию, аудио и субтитры. affaan-m258k videodb Обрабатывает видео и аудио: захватывает, индексирует, ищет, редактирует, транскодирует и генерирует медиа-контент, а также создает оповещения. affaan-m258k ui-demo Создает профессиональные видеодемонстрации пользовательских интерфейсов веб-приложений с помощью Playwright, включая курсор и естественный темп. affaan-m258k taste Создает художественное направление для музыкальных клипов и коротких видео в стилях angelcore, cloud-trance, hyperpop, синхронизируя видеоряд с музыкой. affaan-m258k fal-ai-media Генерирует изображения, видео и аудио с помощью моделей fal.ai, включая преобразование текста в изображение, видео и речь. affaan-m258k