Сегодня балуюсь с Blender. Началось с чужого ролика, а закончилось тем, что у меня есть тяжёлый боевой робот, собранный целиком кодом, его ходьба с синтезированным звуком и минутное видео с HUD-инфографикой. Работали агенты Claude, а я ставил задачи, приносил референсы и решал, когда остановиться. Ниже разбор по частям, включая то, что не получилось.

Вот итоговое видео (60 секунд, со звуком):

Коротко. Робот сделан Python-скриптами в Blender, без генераторов 3D и скачанных ассетов. Сходство с референсом я мерил цифрами (IoU силуэта). Ходьба на самописной обратной кинематике, 12 шагов, звук шагов синтезирован кодом. Видео собрано на HyperFrames: это HTML-страница с анимацией, которую headless-браузер отрисовывает покадрово. Главная оговорка: никто из нас не слушал звук, а игра в Unity не собрана.

Повод

Я посмотрел ролик Игоря с канала «Студия Игор»: «Opus 5.5, Sonnet 5.5, Astra 6 и Sol 6.1: кто лучше делает игры?». Сорок минут, четырём моделям даётся одна задача: игра про боевых роботов в Unity, всё кодом и без скачанных ассетов. Пять тестов: три робота в Blender по референсу, звуки и музыка кодом, уровень, анимация с обратной кинематикой, сборка игры. По итогам автора Opus 5.5 лучший по качеству, Sonnet дешевле и слабее, GPT-модели дают более «пластиковый» результат.

Мне захотелось повторить и заодно понять, как автор делает инфографику в видео. Скачать ролик не получилось (yt-dlp отказался), так что разбирали по транскрипту и обложке, позже по субтитрам и кадрам. Вывод про графику: она выглядит как HUD меха и, вероятно, сделана кодом на HTML, HyperFrames или Remotion. Автор инструмент не называет, так что это предположение, а не факт.

Референсы: откуда что взялось

Это самое важное для честного рассказа. Референсы принёс я, готовыми картинками: один мех в три четверти спереди (оливковый, ракетные блоки на плечах, кулак слева, двуствольная пушка справа) и позже лист с четырьмя видами: спереди, сзади и два боковых. Агенты Claude референсы не рисовали. Кадры из ролика Игоря я в статью не беру, только ссылку выше.

Мой главный референс: тяжёлый мех в три четверти

Лист референса с четырьмя видами

Виды на листе местами противоречат друг другу: сбоку кулак перекрывает корпус, а сзади корпус уже, чем спереди. Агент сам это заметил. Позже это стало потолком точности: часть расхождения «выбить» нельзя. Зато лист с четырьмя видами дал самый заметный скачок точности по сравнению с одной картинкой.

Модель в Blender

Blender 5.2.2 LTS подключён к Claude через Blender MCP. Часть работы шла вживую в окне, часть в фоне. Робота строил один агент на Opus 5.5, всё процедурно: функции рисуют гранёные плиты с фасками, заклёпки, диски-шарниры, поршни, стволы и ракетные трубы. Материалы тоже процедурные: шум для ржавчины, Voronoi для сколов краски. Попытка взять готовую модель у генератора (Hyper3D Rodin) упёрлась в лимит бесплатного ключа, и я сказал: делай сам.

Иерархия простая и одинаковая во всех версиях: корень, таз, торс (кабина, плечи с ракетными блоками, руки с кулаком и пушкой), ноги из бедра, голени и стопы. Одинаковые имена важны: анимация, написанная под одну версию, переносится на следующую, а в игре робота можно разрушать по частям.

ВерсияТреугольниковЧто получилосьЧего не хватало
v156 636Силуэт узнаётся«Игрушечная»: ноги как стопка подушек, краска слишком чистая
v281 512Корпус шире на 22%, ноги выше и толщеКоробчатые формы, мало мелкой механики
v3272 761Строго по листу «4 вида», силуэт подогнанНоги как стопка блоков, пушка как пружина
v3.1около 245 тыс.Ноги-колонны из пластин с дисками, ступни из пальцев, гладкая пушкаЦвет серо-голубой вместо грязно-оливкового, меньше механики в щелях

Я оценил v3.1 словом «Отлично». Агент сам предложил остановиться: дальше каждый проход давал бы 1–2%.

Сходство в цифрах, а не на глаз

Чтобы не судить на глаз, агент рендерил модель с тех же четырёх сторон (ортографическая камера, прозрачный фон) и сравнивал силуэт с маской листа. Метрика IoU: площадь пересечения делить на площадь объединения. Цели были: спереди не ниже 0.85, сбоку не ниже 0.80. Плюс сетка сравнения 2×2 рядом с листом.

ПрогонСпередиСзадиСбоку (кулак)Сбоку (пушка)
v3, итерация 10.9050.8690.8480.864
v3, финал (9 итераций)0.8920.8610.8230.857
v3.1, после 11 итераций0.8870.8670.8390.898

Любопытно, что после первой итерации цифры v3 упали: мелкие детали рвут силуэт, а остальные итерации ушли на материалы, свет и камеру. Метрика меряет только силуэт. Цвет и детали она не видит, и это легко принять за «почти идеально».

Слева референс, справа модель v3 в Blender

Рендер модели v3

Ходьба и звук

Ходьба

Анимацию делал отдельный агент на Sonnet 5.5, параллельно с моделью. Он работал на v2, потому что v3 ещё строилась, а скрипт управляет объектами по именам. Ключевые кадры ставятся на каждый кадр, а ногами управляет двухзвенная обратная кинематика собственной реализации, не встроенное ограничение Blender. Размеры берутся из самой модели: нога 4.0 м, шаг 2.2 м.

Хореография на 20 секунд (480 кадров, 24 fps): секунда стоит, четыре шага вперёд, остановка, торс влево и вправо на 55°, разворот на 90° шестью мелкими шагами и ещё два шага. Всего 12 касаний земли. Кадры касаний записаны в файл, и дальше он стал расписанием для звука и для вспышек в видео.

Проверки: стопы стоят плоско, под пол не уходят, дрейф опорной стопы порядка 2e-6 м. Слабые места агент назвал сам: стопа приходит на пол резко, около 2.5 м/с, выглядит как удар, а руки раскачиваются слабо.

Звук кодом

Звуки (шаги, поворот торса, гидравлика, а ещё звери и боевая стычка) сделаны на numpy и scipy, без сэмплов и нейросетей: голоса через источник-импульсы и пять формант, металл через банки затухающих резонансов, сервопривод гармониками и FM, пространство через свёрточный реверб. Для ролика ходьбы взяли четыре варианта шага, сервопривод и шипение гидравлики и расставили по кадрам касания: громкость каждого шага случайна (0.61–1.11), высота тона плавает на 2–6%. Расхождение между ударом шага и кадром касания 1–2 мс, мастер -16.9 LUFS.

Честность: ни один агент не слушал звук, и я тоже. Оценки сделаны по спектрограммам и уровням. Металл и шаги, скорее всего, убедительны, а крики людей и зверей, вероятно, слабые, как синтезаторный хор. Качество на слух никем не проверено.

Видео с инфографикой на HyperFrames

Это делал основной агент примерно за час. 60 секунд, 1920×1080, 30 fps.

Как устроен HyperFrames

HyperFrames это открытый фреймворк, где видео равно HTML-странице. Элементы получают атрибуты data-start и data-duration, анимацию ведёт GSAP-таймлайн, а рендерит всё headless-браузер: открывает страницу, ставит таймлайн на кадр N, делает снимок, и так 1800 раз. Сверху ffmpeg склеивает MP4. У меня вся страница в одном файле на 342 строки, GSAP 3.14.2 с CDN. По сути это обычная вёрстка с HTML, CSS и SVG, только время управляется извне.

Из Blender пришли облёт 360° (192 кадра EEVEE: камера на пустышке-пивоте в центре модели с ограничением Track To), четыре рендера v3 и ролик ходьбы.

Шесть сцен и эффекты

  1. Загрузка. Лог, заголовок с глитчем (RGB-сплит), загрузочная полоса.
  2. Облёт. SVG-выноски на детали, карточка ТТХ со счётчиками.
  3. Сверка с референсом. Три ракурса, сканер-линия, счётчики IoU, гистограмма итераций.
  4. Ходьба. Прицел, радар, эквалайзер, телеметрия.
  5. Отчёт. Карточки 480 кадров, 12 шагов, 11 итераций, -16.9 LUFS и кольцевая диаграмма.
  6. Финал с глитчем.

Поверх всего постоянные эффекты: сканлайны, виньетка, бегущая полоса помех.

Сцена облёта: SVG-выноски и карточка ТТХ

Загрузка с глитч-заголовком

Сверка с референсом

Ходьба: прицел, радар, телеметрия

Отчёт: карточки и кольцевая диаграмма

Финал

Синхронизация с шагами

Счётчик шагов, вспышка STEP и тряска кадра привязаны к тем самым 12 кадрам касания из расписания анимации. Не нарисовано «примерно в такт», а взято из данных: если шаг переставить, вспышка поедет вместе с ним. Звук шагов приходит из рендера Blender, к нему добавлен фоновый гул, синтезированный ffmpeg (три синуса 55, 82.5 и 110 Гц).

Два практических правила покадрового видео. Первое: детерминизм. Глитч берёт числа из генератора с фиксированным seed, иначе два рендера дадут разные кадры. Второе: линтер. hyperframes lint нашёл три проблемы (видео внутри тайм-секции, не указан звук у видео, анимация letter-spacing), все исправлены, затем снимки контрольных кадров и полный рендер.

Что в видео настоящее, а что декор

  • Реальные цифры: 480 кадров, 12 шагов, 11 итераций, -16.9 LUFS, времена шагов, IoU.
  • Декор: ТТХ «9.4 м / 62 т / броня 87%». Рост модели 9.0 м, а массы и брони в ней нет.

Расхождения, которые я нашёл при сверке

  1. Сцена «ходьба» показывает старую модель v2, а облёт и сверка v3. Ходьба ещё не перенесена на v3.1.
  2. Цифры IoU в сцене 3 (0.892 / 0.857 / 0.861) взяты из первого прохода v3, а не из финальной v3.1, при этом «11 итераций» в отчёте относятся именно к v3.1.
  3. Гистограмма итераций собрана из 30 значений, склеенных из нескольких столбцов журнала, а не из одной последовательности. Это визуальный эффект, не график одного показателя.
  4. «Side 0.857» относится к стороне пушки, сторона кулака была хуже.

Я решил оставить видео как есть и описать эти нестыковки здесь, а не прятать.

Стек

СлойЧто использованоРоль
МоделиClaude Opus 5.5, Claude Sonnet 5.5Opus: основной агент и сборка робота; Sonnet: звук, ходьба, установка Unity
Попытка генерации 3DHyper3D RodinНе удалась: лимит бесплатного ключа
Агенты6 фоновых сабагентовМодель, звуки, ходьба, Unity, окружение, машины
3DBlender 5.2.2 LTS, EEVEE, Python (bpy, bmesh)Модель, свет, анимация, рендер
СвязьBlender MCP, MCP for UnityУправление редакторами из Claude
Игровой движокUnity 6, шаблон URPПроект создан, FBX робота v2 импортирован
ЗвукPython: numpy, scipy, pyloudnorm, matplotlibСинтез, нормализация, спектры
Анализ силуэтаPython: numpy, PillowIoU, сетки сравнения
Видео-инфографикаHyperFrames, GSAP 3.14.2, HTML/CSS/SVGШесть сцен HUD
Монтаж и звук роликаffmpegГул, склейка, версия для Telegram
Разбор чужого роликаyt-dlp, whisper.cpp, ffmpegТранскрипт и кадры по сменам сцен

Сколько это стоило по токенам и подписке, отдельно не считалось.

OpenMontage: установлен, пробовал, но в итоговом ролике его нет

OpenMontage у меня установлен с 2 октября. HUD собран напрямую связкой Claude, HyperFrames, Blender и ffmpeg, а позже я попробовал собрать через OpenMontage весь ролик с голосом: работает, но мелкий текст и шрифт без кириллицы, поэтому в итоге взят только подход к голосу и субтитрам. Это open-source «агентная видеостудия» под лицензией AGPL-3.0: открываешь репозиторий в Claude Code, Codex или Cursor, описываешь ролик словами, а агент проходит цикл «ресёрч, сценарий, ассеты, монтаж, рендер (Remotion, HyperFrames или FFmpeg), самопроверка кадров и звука». Обязательных ключей нет, бесплатный путь есть: Piper TTS и стоки Archive.org и Wikimedia.

Где он был бы полезен здесь:

  • склейка рендеров Blender и HUD-слоёв с переходами и миксом звука одной командой;
  • автопроверка: обрезанный текст, рассинхрон, тишина;
  • субтитры и версии на других языках;
  • нарезка вертикальных 9:16 и тизеров из готового минутного ролика;
  • озвучка и музыка, если ролик станет объясняющим.

Где не нужен: HUD и рендеры у меня уже идут своим пайплайном, а у OpenMontage свой оркестратор, который с ним конкурирует. Для разового ролика это лишний слой, для потока роликов (канал, клиенты) стоит попробовать. И осторожнее с одноимёнными форками и «зеркалами» со скачиванием.

Озвучка своим голосом и публикация

Минутный HUD-ролик шёл без голоса (только шаги и гул), и я добавил озвучку. Сначала собрал весь ролик в OpenMontage, но там мелкий текст, налезания и шрифт без кириллицы. Поэтому гибрид: картинка из HyperFrames, а голос и субтитры отдельно.

  1. Сценарий. Шесть реплик под шесть сцен, в конце приглашение в Telegram-канал. Цифры IoU голосом не называю: в картинке они устарели.
  2. Голос. Клон моего голоса в ElevenLabs, модель eleven_multilingual_v2, шесть запросов, 587 символов.
  3. Сборка в ffmpeg. Реплики стартуют через 0.3 с после начала сцены. Звук исходного ролика приглушён на 8 дБ и дополнительно проседает под голосом, голос нормализован до -16 LUFS.
  4. Субтитры. В моём ffmpeg нет фильтров subtitles и drawtext (нет libass и freetype), поэтому строки нарисованы картинками в Pillow и наложены по времени. Недочёт: в сценах с 14 по 42 секунду субтитры лежат поверх гистограммы и эквалайзера.
  5. Telegram. Видео, альбом из пяти фото и пошаговый текст вышли в канале «Рамас. Лаборатория» через скрипт на telethon: сначала черновик на приёмку, потом публикация.
  6. YouTube. Загрузка через YouTube Studio. Расширение браузера принимает файл до 10 МБ, поэтому ролик пережат двухпроходным x264 (1180 кбит/с, звук 96 кбит/с) до 9.4 МБ в 1080p. Отметка «ИИ использовался: да» нужна из-за клона голоса.

Ролик на YouTube:

Прямая ссылка: youtu.be/j16IRGWEMGc.

Что не получилось и уроки

Не получилось или не доделано:

  1. Unity-сцена не собрана. Unity 6 и мост установлены, проект создан, FBX v2 импортирован, но пол, свет, камера, управление и сам робот в сцене не расставлены. Игры нет.
  2. Ходьба сделана на v2, а не на v3.1. Перенос это запуск готового скрипта.
  3. Окружение и машины. Два агента запущены (блокпост и четыре машины), но файлов их работы я не нашёл и результат не подтверждаю.
  4. Текстуры не запечены. Процедурные материалы Blender в FBX не переходят, в Unity робот пришёл бы серым.
  5. Звук не прослушан, только спектры и уровни.
  6. Сходство ограничено: цвет серо-голубой вместо оливкового, меньше механики в щелях, ступни светлее.
  7. Шаг резкий, руки качаются слабо.

Уроки:

  • Мера побеждает «на глаз». Как только сходство стало числом и появилась сетка 2×2, прогресс стал виден. Но метрика видит только силуэт.
  • Лист с четырьмя видами лучше одной картинки, но только если виды согласованы.
  • Генераторы 3D не панацея и не бесплатны. Общий бесплатный ключ быстро кончается, а процедурный код даёт управляемый результат с потолком по детализации.
  • Одинаковые имена и иерархия позволяют вести модель и анимацию параллельно.
  • Параллельные агенты работают, если у каждого свой файл. Фоновая правка .blend и открытое окно Blender конфликтуют.
  • Для покадрового видео нужен детерминизм (seed) и линтер.
  • Итоговый ролик стоит сверять с данными, иначе в красивой графике живут устаревшие цифры.
  • «Нейронка сделала сама» означает: человек поставил задачу, дал референс и оценил результат, а агент исполнил. Референсы и ключевые решения («делай сам», «останавливаемся») мои.

Что дальше

  • Перенести ходьбу на v3.1 и перерисовать сцену 4 (рендер около 5 минут).
  • Обновить в HUD числа IoU до финала v3.1 или подписать, что это v3, а склеенную гистограмму заменить честным графиком.
  • Покрасить и запечь текстуры, переэкспортировать FBX, чтобы в Unity робот был оливковым и грязным.
  • Собрать сцену в Unity: пол, свет, камера, робот с управлением с клавиатуры, вращающиеся колёса машин.
  • Дождаться и проверить окружение и машины.
  • Послушать звуки. Слабые голоса, возможно, заменить синтезатором речи, а механику и металл оставить кодом.