Pipeline de Produção de Vídeos com Manim
Padrão Criativo
Isto é cinema educacional. Cada quadro ensina. Cada animação revela estrutura.
Antes de escrever uma única linha de código, articule o arco narrativo. Que equívoco isso corrige? Qual é o "momento aha"? Qual história visual leva o espectador da confusão ao entendimento? O prompt do usuário é um ponto de partida — interprete-o com ambição pedagógica.
Geometria antes da álgebra. Mostre a forma primeiro, a equação depois. A memória visual codifica mais rápido que a memória simbólica. Quando o espectador vê o padrão geométrico antes da fórmula, a equação parece merecida.
A excelência na primeira renderização é inegociável. A saída deve ser visualmente clara e esteticamente coesa sem rodadas de revisão. Se algo parecer confuso, mal cronometrado ou como "slides gerados por IA", está errado.
Camadas de opacidade direcionam a atenção. Nunca mostre tudo com brilho máximo. Elementos primários em 1.0, elementos contextuais em 0.4, elementos estruturais (eixos, grades) em 0.15. O cérebro processa a saliência visual em camadas.
Espaço para respirar. Toda animação precisa de self.wait() depois dela. O espectador precisa de tempo para absorver o que acabou de aparecer. Nunca apresse de uma animação para a outra. Uma pausa de 2 segundos após uma revelação chave nunca é desperdiçada.
Linguagem visual coesa. Todas as cenas compartilham uma paleta de cores, tamanhos de tipografia consistentes e velocidades de animação correspondentes. Um vídeo tecnicamente correto onde cada cena usa cores aleatórias diferentes é uma falha estética.
Pré-requisitos
Execute scripts/setup.sh para verificar todas as dependências. Requer: Python 3.10+, Manim Community Edition v0.20+ (pip install manim), LaTeX (texlive-full no Linux, mactex no macOS) e ffmpeg. Documentação de referência testada com Manim CE v0.20.1.
Modos
| Modo | Entrada | Saída | Referência |
|---|---|---|---|
| Explicador de conceitos | Tópico/conceito | Explicação animada com intuição geométrica | references/scene-planning.md |
| Derivação de equações | Expressões matemáticas | Prova animada passo a passo | references/equations.md |
| Visualização de algoritmo | Descrição do algoritmo | Execução passo a passo com estruturas de dados | references/graphs-and-data.md |
| História de dados | Dados/métricas | Gráficos animados, comparações, contadores | references/graphs-and-data.md |
| Diagrama de arquitetura | Descrição do sistema | Componentes sendo construídos com conexões | references/mobjects.md |
| Explicador de artigo | Artigo de pesquisa | Principais descobertas e métodos animados | references/scene-planning.md |
| Visualização 3D | Conceito 3D | Superfícies giratórias, curvas paramétricas, geometria espacial | references/camera-and-3d.md |
Stack
Um único script Python por projeto. Sem navegador, Node.js ou GPU necessários.
| Camada | Ferramenta | Propósito |
|---|---|---|
| Core (Núcleo) | Manim Community Edition | Renderização de cena, motor de animação |
| Matemática | LaTeX (texlive/MiKTeX) | Renderização de equações via MathTex |
| Entrada/Saída de Vídeo | ffmpeg | Costura de cenas, conversão de formato, multiplexação de áudio |
| TTS (Texto para Fala) | ElevenLabs / Qwen3-TTS (opcional) | Narração de voz |
Pipeline
PLANEJAR --> CODIFICAR --> RENDERIZAR --> COSTURAR --> ÁUDIO (opcional) --> REVISAR
- PLANEJAR — Escreva
plan.mdcom arco narrativo, lista de cenas, elementos visuais, paleta de cores, roteiro de narração - CODIFICAR — Escreva
script.pycom uma classe por cena, cada uma renderizável independentemente - RENDERIZAR —
manim -ql script.py Scene1 Scene2 ...para rascunho,-qhpara produção - COSTURAR — Concatenação de clips de cena via ffmpeg em
final.mp4 - ÁUDIO (opcional) — Adicione narração e/ou música de fundo via ffmpeg. Veja
references/rendering.md - REVISAR — Renderize stills de pré-visualização, verifique em relação ao plano, ajuste
Estrutura do Projeto
nome-do-projeto/
plan.md # Arco narrativo, detalhamento das cenas
script.py # Todas as cenas em um arquivo
concat.txt # Lista de cenas ffmpeg
final.mp4 # Saída costurada
media/ # Gerado automaticamente pelo Manim
videos/script/480p15/
Direção Criativa
Paletas de Cores
| Paleta | Fundo | Primária | Secundária | Destaque | Caso de uso |
|---|---|---|---|---|---|
| Clássico 3B1B | #1C1C1C | #58C4DD (AZUL) | #83C167 (VERDE) | #FFFF00 (AMARELO) | Matemática/CC geral |
| Acadêmico acolhedor | #2D2B55 | #FF6B6B | #FFD93D | #6BCB77 | Acessível |
| Tech Neon | #0A0A0A | #00F5FF | #FF00FF | #39FF14 | Sistemas, arquitetura |
| Monocromático | #1A1A2E | #EAEAEA | #888888 | #FFFFFF | Minimalista |
Velocidade de Animação
| Contexto | run_time | self.wait() após |
|---|---|---|
| Aparecimento do título/introdução | 1.5s | 1.0s |
| Revelação de equação chave | 2.0s | 2.0s |
| Transformação/morfagem | 1.5s | 1.5s |
| Rótulo de suporte | 0.8s | 0.5s |
| Limpeza com FadeOut | 0.5s | 0.3s |
| Revelação do "momento aha" | 2.5s | 3.0s |
Escala Tipográfica
| Função | Tamanho da fonte | Uso |
|---|---|---|
| Título | 48 | Títulos de cena, texto de abertura |
| Cabeçalho | 36 | Cabeçalhos de seção dentro de uma cena |
| Corpo | 30 | Texto explicativo |
| Rótulo | 24 | Anotações, rótulos de eixos |
| Legenda | 20 | Legendas, texto pequeno |
Fontes
Use fontes monoespaçadas para todo o texto. O renderizador Pango do Manim produz kerning quebrado com fontes proporcionais em todos os tamanhos. Veja references/visual-design.md para recomendações completas.
MONO = "Menlo" # defina uma vez no topo do arquivo
Text("Série de Fourier", font_size=48, font=MONO, weight=BOLD) # títulos
Text("n=1: sin(x)", font_size=20, font=MONO) # rótulos
MathTex(r"\nabla L") # matemática (usa LaTeX)
Tamanho mínimo font_size=18 para legibilidade.
Variação por Cena
Nunca use configuração idêntica para todas as cenas. Para cada cena:
- Cor dominante diferente da paleta
- Layout diferente — nem sempre centralize tudo
- Entrada de animação diferente — varie entre Write, FadeIn, GrowFromCenter, Create
- Peso visual diferente — algumas cenas densas, outras esparsas
Fluxo de Trabalho
Passo 1: Planejar (plan.md)
Antes de qualquer código, escreva plan.md. Veja references/scene-planning.md para o modelo abrangente.
Passo 2: Codificar (script.py)
Uma classe por cena. Cada cena é renderizável independentemente.
from manim import *
BG = "#1C1C1C"
PRIMARY = "#58C4DD"
SECONDARY = "#83C167"
ACCENT = "#FFFF00"
MONO = "Menlo"
class Scene1_Introduction(Scene):
def construct(self):
self.camera.background_color = BG
title = Text("Por que Isso Funciona?", font_size=48, color=PRIMARY, weight=BOLD, font=MONO)
self.add_subcaption("Por que isso funciona?", duration=2)
self.play(Write(title), run_time=1.5)
self.wait(1.0)
self.play(FadeOut(title), run_time=0.5)
Padrões chave:
- Legendas em toda animação:
self.add_subcaption("texto", duration=N)ousubcaption="texto"emself.play() - Constantes de cor compartilhadas no topo do arquivo para consistência entre cenas
self.camera.background_colordefinido em toda cena- Saídas limpas — FadeOut de todos os mobjects ao final da cena:
self.play(FadeOut(Group(*self.mobjects)))
Passo 3: Renderizar
manim -ql script.py Scene1_Introduction Scene2_CoreConcept # rascunho
manim -qh script.py Scene1_Introduction Scene2_CoreConcept # produção
Passo 4: Costurar
cat > concat.txt << 'EOF'
file 'media/videos/script/480p15/Scene1_Introduction.mp4'
file 'media/videos/script/480p15/Scene2_CoreConcept.mp4'
EOF
ffmpeg -y -f concat -safe 0 -i concat.txt -c copy final.mp4
Passo 5: Revisar
manim -ql --format=png -s script.py Scene2_CoreConcept # still de pré-visualização
Notas de Implementação Críticas
Strings Raw para LaTeX
# ERRADO: MathTex("\frac{1}{2}")
# CERTO:
MathTex(r"\frac{1}{2}")
buff >= 0.5 para Texto nas Bordas
label.to_edge(DOWN, buff=0.5) # nunca < 0.5
FadeOut Antes de Substituir Texto
self.play(ReplacementTransform(note1, note2)) # não Write(note2) por cima
Nunca Anime Mobjects Não Adicionados
self.play(Create(circle)) # deve adicionar primeiro
self.play(circle.animate.set_color(RED)) # depois animar
Metas de Performance
| Qualidade | Resolução | FPS | Velocidade |
|---|---|---|---|
-ql (rascunho) | 854x480 | 15 | 5-15s/cena |
-qm (médio) | 1280x720 | 30 | 15-60s/cena |
-qh (produção) | 1920x1080 | 60 | 30-120s/cena |
Sempre itere em -ql. Renderize em -qh apenas para a saída final.
Referências
| Arquivo | Conteúdo |
|---|---|
references/animations.md | Animações principais, funções de taxa, composição, sintaxe .animate, padrões de tempo |
references/mobjects.md | Texto, formas, VGroup/Group, posicionamento, estilo, mobjects personalizados |
references/visual-design.md | 12 princípios de design, camadas de opacidade, modelos de layout, paletas de cores |
references/equations.md | LaTeX no Manim, TransformMatchingTex, padrões de derivação |
references/graphs-and-data.md | Eixos, plotagem, BarChart, dados animados, visualização de algoritmos |
references/camera-and-3d.md | MovingCameraScene, ThreeDScene, superfícies 3D, controle de câmera |
references/scene-planning.md | Arcos narrativos, modelos de layout, transições de cena, modelo de planejamento |
references/rendering.md | Referência de CLI, predefinições de qualidade, ffmpeg, fluxo de trabalho de narração, exportação GIF |
references/troubleshooting.md | Erros de LaTeX, erros de animação, erros comuns, depuração |
references/animation-design-thinking.md | Quando animar vs. mostrar estático, decomposição, ritmo, sincronização de narração |
references/updaters-and-trackers.md | ValueTracker, add_updater, always_redraw, updaters baseados em tempo, padrões |
references/paper-explainer.md | Transformar artigos de pesquisa em animações — fluxo de trabalho, modelos, padrões de domínio |
references/decorations.md | SurroundingRectangle, Brace, setas, DashedLine, Angle, ciclo de vida de anotação |
references/production-quality.md | Listas de verificação pré-código, pré-renderização e pós-renderização, layout espacial, cor, tempo |
Divergência Criativa (use apenas quando o usuário solicitar saída experimental/criativa/única)
Se o usuário pedir abordagens explicativas criativas, experimentais ou não convencionais, selecione uma estratégia e pense através dela ANTES de projetar a animação.
- SCAMPER — quando o usuário quer uma nova abordagem para uma explicação padrão
- Inversão de Suposição — quando o usuário quer desafiar como algo é tipicamente ensinado
Transformação SCAMPER
Pegue uma visualização matemática/técnica padrão e transforme-a:
- Substituir: substitua a metáfora visual padrão (linha numérica → caminho sinuoso, matriz → grade da cidade)
- Combinar: mescle duas abordagens de explicação (algébrica + geométrica simultaneamente)
- Inverter: derive de trás para frente — comece do resultado e desconstrua até os axiomas
- Modificar: exagere um parâmetro para mostrar por que ele importa (10x a taxa de aprendizado, 1000x o tamanho da amostra)
- Eliminar: remova toda a notação — explique puramente através de animação e relações espaciais
Inversão de Suposição
- Liste o que é "padrão" sobre como este tópico é visualizado (da esquerda para a direita, 2D, passos discretos, notação formal)
- Escolha a suposição mais fundamental
- Inverta-a (derivação da direita para a esquerda, incorporação 3D de um conceito 2D, morfagem contínua em vez de passos, notação zero)
- Explore o que a inversão revela que a abordagem padrão esconde