Что делает простыми словами
Это «генератор клипов из кода». Когда сцена не про живых людей, а про числа, абстракцию, графики или показ продукта в 3D — гонять Veo бессмысленно и дорого. Тут пишется композиция на React/Remotion, рендерится за 10-30 секунд, кладётся в clips/ и регистрируется в той же БД, что и Veo-клипы. Director использует абсолютно одинаково.
motionfx vs clipgen (Veo)
| motionfx (Remotion) | clipgen (Veo) |
| Статистика, числа, метрики | Реальные люди, эмоции |
| Сравнения цен, графики | Физические пространства, интерьеры |
| Тренды роста, прогресс | Крупные планы продукта |
| Абстрактные фоны, паттерны | Lifestyle-съёмка |
| Text-driven хуки | Cinematic сцены |
| Before/after сравнения | Медицинские процедуры |
| Free, instant, deterministic | $0.05-0.15/sec, 1-3 мин, unpredictable |
Главный триггер для motionfx: сцена показывает данные, график, 3D-модель, анимированный текст, абстрактный фон или particle/blur эффект. Если можно вообразить «такое в After Effects нарисовали» — это motionfx, не Veo.
Два подхода: Preset или Freestyle
| Подход | Когда |
| Preset |
Запрос хорошо ложится на один из 26 готовых Remocn-компонентов или RVE-эффектов. Быстро, надёжно. |
| Freestyle |
Ни один preset не подходит, или нужно комбинировать несколько компонентов в одной сцене. Пишешь новую .tsx-композицию. |
26 Remocn-компонентов по категориям
Data Visualization
| Component | Import | Best for |
AnimatedBarChart | remocn/animated-bar-chart | Сравнения цен, рейтинги, рэнкинги |
AnimatedLineChart | remocn/animated-line-chart | Тренды роста, прогресс во времени |
PricingTierFocus | remocn/pricing-tier-focus | Тарифные планы, пакеты услуг |
CircularProgress | rve/circular-progress | Одна метрика («98% success rate») |
ChartAnimation | rve/chart-animation | Альтернативный стиль графика |
Scene Effects
| Component | Best for |
CardFlip (rve/card-flip) | Before/after, reveal-моменты |
ParticleExplosion (rve/particle-explosion) | CTA-акцент, celebration |
LiquidWave (rve/liquid-wave) | Абстрактный фон, переход |
GeometricPatterns (rve/geometric-patterns) | Modern abstract фон |
MatrixRain (rve/matrix-rain) | Tech/hacker эстетика |
Text Effects (для text-driven клипов)
| Component | Эффект |
BlurReveal | Текст выходит из размытия |
StaggeredFadeUp | Слова появляются по одному снизу |
TrackingIn | Letter-spacing сужается |
RgbGlitchText | RGB channel split glitch |
MatrixDecode | Случайные символы decode'ятся в реальный текст |
MarkerHighlight | Текст с анимированным маркером |
ShimmerSweep | Градиентный sweep поверх текста |
Typewriter | Character-by-character |
SlotMachineRoll | Цифры крутятся как в слотах |
TextFadeReplace | Cross-fade между строками |
MaskedSlideReveal | Masked slide reveal |
InlineHighlight | Inline highlight куска текста |
Scene Transitions (между сценами внутри клипа)
| Component | Визуал |
FrostedGlassWipe | Blurred glass panel sweep — премиум |
ChromaticAberrationWipe | RGB split slide — агрессивно/tech |
GridPixelateWipe | Grid dissolve (wave/diagonal/spiral) |
DirectionalWipe | Простой slide (left/right/up/down) |
ZoomThroughTransition | Scale up + fade — кинематографично |
Element Animation
| Component | Best for |
SpringPopIn | Pop-in любого элемента с spring physics |
ToastNotification | Notification-style popup |
PulsingIndicator | Pulsing dot/ring |
SpotlightCard | Card с cursor-following glow |
SuccessConfetti | Confetti particles |
Backgrounds & Post-Processing
| Component | Best for |
MeshGradientBg | Анимированный градиент (видео не нужно) |
CameraMotionBlur (@remotion/motion-blur) | Кинематографический motion blur поверх любого контента |
3D Showcase (ThreeCanvas)
| Component | Best for |
ImplantShowcase (custom/ImplantShowcase) | GLB-модель с авто-scale + title overlay (обобщается на любую модель продукта) |
Implant3D (custom/Implant3D) | Процедурная 3D-модель (code-only, файлы не нужны) — fallback / placeholder |
Render flags для 3D — ОБЯЗАТЕЛЬНО. Всегда используй --gl=angle --concurrency=1. WebGL требует single-threaded рендера, без этих флагов рендер либо падает, либо даёт мусор.
Получение качественных 3D-моделей
| Источник | Способ | Качество | Формат |
| AI image-to-3D | Upload фото → получаешь GLB | High | GLB |
| Sketchfab | Free аккаунт → скачать CC-BY модели | High | GLB |
| Procedural (код) | Three.js geometry в компоненте | Low | N/A |
Image-to-3D сервисы (best способ под клиентский продукт)
| Сервис | Free tier | Output |
| Meshy.ai | 5 моделей/мес | GLB/OBJ/FBX |
| Tripo3D | 3 модели/день | GLB |
| Rodin by Hyper | Free tier | GLB |
| Luma Genie | Free tier | GLB |
| TripoSR | Open source (локально) | GLB |
STL-to-GLB конвертации часто ломаются. Геометрия с дырами, gaps между треугольниками — выглядит ужасно. Лучше брать GLB сразу с image-to-3D AI или Sketchfab. ImplantShowcase авто-скейлит любой GLB через Box3 и оверрайдит материалы для консистентного вида.
Workflow в одном куске
- Понять запрос — данные, концепт, mood, duration, контекст в ролике
- Выбрать подход — Preset (готовый компонент) или Freestyle (с нуля)
- Создать
.tsx композицию в <project>/remotion/src/custom/<Name>.tsx
- Зарегать в
Root.tsx (<Composition> с правильными durationInFrames, fps, width, height)
- Рендер через
npx remotion render
- Зарегистрировать в БД (общая
director.db через video-clipgen/scripts/db.py)
- Открыть для review
Команды
# Render (preset/freestyle)
cd ~/video-projects/apparatus/remotion
npx remotion render MyClip ../clips/motionfx_001.mp4
# С пропсами
npx remotion render MyClip ../clips/motionfx_001.mp4 \
--props='{"title":"Apparatus","data":[...]}'
# 3D рендер — ОБЯЗАТЕЛЬНО эти флаги
npx remotion render ImplantShowcase ../clips/3d_showcase.mp4 \
--gl=angle --concurrency=1 \
--props='{"modelFile":"model.glb","title":"Straumann BLT"}'
# Регистрация в БД (общая с clipgen)
python ~/.claude/skills/video-clipgen/scripts/db.py update-clip \
~/video-projects/apparatus 42 \
--description "Анимированный график сравнения цен — 4 столбца, основной бренд выделен зелёным" \
--scene-type product --mood luxury \
--tags "stats,chart,comparison,price,remotion"
# 3D модели в БД
python ~/.claude/skills/video-director/scripts/db.py add-model \
~/video-projects/apparatus /path/to/model.glb \
--model-type implant --description "Straumann BLT implant" --source meshy
Скрипты
У motionfx нет своей scripts/ папки. Скилл — это набор инструкций + ссылка на 26 Remocn-компонентов + 3D-инфраструктура. Рендер идёт через стандартный
npx remotion render в проектной
remotion/ директории. Управление БД переиспользует
db.py из
video-clipgen и
video-director — единая
director.db на проект.
Color schemes по mood'у
| Mood | Background | Accent | Text |
| Premium/Luxury | #0a0a0a | #FFD700 (gold) | #FFFFFF |
| Medical/Clinical | #0a0a0a | #0ea5e9 (blue) | #FFFFFF |
| Energy/Action | #0a0a0a | #00FF88 (green) | #FFFFFF |
| Sale/Urgency | #0a0a0a | #FF4444 (red) | #FFFFFF |
| Calm/Trust | #0f172a | #8b5cf6 (purple) | #E2E8F0 |
Layout для 9:16 (1080×1920)
- Title zone: top 15-25% (absolute top ~18%)
- Content zone: 25-70% (графики, карточки, основной контент)
- Subtitle/label zone: bottom 20-28%
- Safe zone для 4:5 crop: важный контент держать между 25%-75% по высоте
Animation timing — рекомендуемые значения
| Этап | Frames @ 30fps | Секунды |
| Fade-in заголовков | 10-15 | 0.3-0.5 |
| Анимация графика (spring) | 30-60 | 1-2 |
| Stagger между элементами | 6-10 | 0.2-0.3 |
| Длительность сцены | 90-180 | 3-6 |
| Exit fade | 10-15 | 0.3-0.5 |
Motion blur — когда оборачивать
import { CameraMotionBlur } from "@remotion/motion-blur";
<CameraMotionBlur samples={10} shutterAngle={180}>
{/* fast-moving animated content */}
</CameraMotionBlur>
Использовать для: быстрые wipes, quick transitions, агрессивные hook-анимации.
НЕ использовать для: медленные графики, текст, который должен оставаться читаемым.
Component locations в проекте
<project-dir>/remotion/src/
├── components/
│ ├── remocn/ # 26 Remocn компонентов (shadcn registry)
│ └── rve/ # React Video Editor effects (copy-paste)
├── custom/ # Project-specific композиции
├── templates/ # Стандартные шаблоны (TextoverAd, etc.)
└── lib/
├── brand.ts # Brand colors/fonts (из project.yaml)
├── animations.ts # Animation library
├── presets.ts # TextoverAd presets
└── remocn-effects.ts # RemocnText adapter
3D models в БД
Таблица models_3d (schema v5+):
| Column | Type | Description |
id | INTEGER PK | Auto |
filename | TEXT | GLB filename |
filepath | TEXT | Full path |
description | TEXT | Что показывает модель |
model_type | TEXT | product, equipment, abstract, character, other |
file_size / poly_count | INTEGER | Bytes / face count |
source | TEXT | sketchfab, github, generated, upload, meshy, tripo |
license | TEXT | CC-BY, CC0, custom |
tags | TEXT (JSON) | Массив тегов |
usage_count | INTEGER | Сколько раз использована |
render_flags | TEXT | Default: --gl=angle --concurrency=1 |
Code quality — remotion-best-practices
MANDATORY: перед написанием ЛЮБОГО Remotion-кода загружай только релевантные правила из ~/.claude/skills/remotion-best-practices/rules/. НЕ грузи все 39 файлов — выбирай по задаче.
| Задача | Правила |
| Chart/stats клип | charts.md + animations.md |
| Text-driven hook | text-animations.md + timing.md |
| Клип с видео-фоном | videos.md + assets.md |
| Новая композиция | compositions.md + parameters.md |
| Transitions | transitions.md + sequencing.md |
| 3D контент | 3d.md |
| Аудио / SFX / voiceover | audio.md / sfx.md / voiceover.md |
| Transparent overlay | transparent-videos.md |
| FFmpeg операции | ffmpeg.md + trimming.md |
Gotchas и tips
3D всегда с --gl=angle --concurrency=1. Это не опция, это закон. WebGL в Remotion работает только single-threaded — иначе либо crash, либо чёрные кадры.
Текст под motion blur нечитаем. Не оборачивай в CameraMotionBlur сцены с текстом — blur размажет буквы. Blur — для движения, не для информации.
Freestyle через Sequence — для многосценных клипов. Один .tsx может содержать несколько <Sequence from={frame} durationInFrames={n}> — каждая Sequence это «подсцена». Удобно для intro → chart → outro в одном клипе.
Зови image-to-3D под продукт клиента. Generic Sketchfab implant выглядит как stock — а Meshy.ai по фотке реального изделия даёт уникальный 3D показ, которого нет ни у кого. Зацепка для премиум-сегмента.
Когда брать remotion вместо motionfx. Если нужен стандартный intro/CTA/lower-third — это
video-remotion с готовыми шаблонами. Motionfx = тяжёлая артиллерия для специфичных эффектов и data viz.
clipgen может позвать motionfx сам. Если video-clipgen при планировании клипа понимает, что сцена про данные/абстракцию/3D — он делегирует motionfx, не Veo. Это explicit в логике clipgen.
Место в пайплайне
scene нужна data viz / 3D / abstract →
motionfx →
npx remotion render →
clip in DB (source=remotion) →
director uses it
Motionfx — параллельный путь к Veo. Клипы попадают в ту же director.db с source='remotion', Director работает с ними идентично. Orchestrator может запросить motionfx-клип напрямую, или clipgen делегирует автоматически когда понимает что Veo не подходит.
Brand-config читается из project.yaml → remotion.brand — тот же source, что и у video-remotion. Инфраструктура (remotion/ в проекте, npm install, Root.tsx) тоже общая — инициализируется один раз через init_project.py из remotion-скилла, дальше motionfx добавляет свои композиции в src/custom/.