Communitygithub.com

Motion graphics and titles (MBehtemam/montagent-skills)

Cria gráficos animados e títulos no Montagent: lançamentos de produtos, anúncios sociais, intros e outros, texto cinético e digitado, revelações de logotipo, loops, wipes, pops, mudanças de cor, transições em perspectiva e efeitos de trailer. Use quando um vídeo do Montagent é construído a partir de gráficos e texto, em vez de gravações ou personagens.

O que é montagent-skills)?

Este skill fornece receitas detalhadas e estruturadas para criar motion graphics e títulos nativos no Montagent, um framework de geração de vídeo. Ele é direcionado a agentes de IA que precisam construir peças visuais a partir de formas geométricas, imagens estáticas e texto, sem depender de clipes de vídeo ou animações de personagens. O skill abrange uma ampla gama de efeitos, como pops (entradas com overshoot), mudanças de cor em palavras específicas, texto cinético e digitado, revelações por wipe (cortina) e transições entre cenas (push, slide, wipe). Para cada efeito, são fornecidos exemplos de código JSON configuráveis, parâmetros de tempo (duração, curvas de easing) e dicas visuais para garantir um resultado polido. O fluxo de trabalho incentiva o planejamento em uma 'beat sheet' (grade rítmica) e o uso de 'look steps' para verificar o resultado quadro a quadro. O skill é especialmente útil para anúncios, intros, logos e trailers, oferecendo um equilíbrio entre controle preciso e eficiência de renderização, com orientações para evitar armadilhas comuns, como a conversão inadequada de glifos em paths.

Funciona com~Claude Code~Codex CLI✓Cursor
npx skills add https://github.com/MBehtemam/montagent-skills/tree/HEAD/skills/montagent-motion

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

Gráficos animados e títulos

Receitas para peças construídas a partir de formas, imagens estáticas e texto. Elas se encaixam no loop do montagent na etapa de construção; carregue o montagent primeiro se ainda não o fez.

Abra o arquivo de referência para o tipo de peça antes de planejá-la:

A peçaAbrir
Lançamento de produto, anúncio social, intro, outroa estrutura de lançamento
Revelação de logotipo, vinheta de logotipo, qualquer coisa que faça loopo loop de logotipo
Trailer, ou qualquer efeito de impacto, glitch, flash ou HUDefeitos de trailer

Para uma peça nova ou um redesign, leia direção criativa antes de escolher o layout. Ele abrange conceitos visuais, composição e coreografia no Montagent nativo. Para uma edição específica, leia apenas a receita relevante e preserve a direção existente.

Planeje em uma grade rítmica

Antes de escrever um elemento, escreva a grade rítmica: cada entrada, mudança de cor, corte e saída em uma tabela, cada um em uma batida da grade que o montagent-craft fornece (seu tempo, downbeat, snap de quadro e quais eventos vão em quais batidas).

Construa o projeto com um script gerador a partir da grade rítmica, de modo que um reajuste de tempo seja uma edição de uma linha.

Receitas

Cada receita fornece faixas iniciais, não respostas definitivas. Cada uma termina em uma etapa de verificação: carregue o montagent-craft, então verifique onde a etapa indica antes de prosseguir.

Pop

Uma entrada com um pequeno overshoot que se estabiliza. O overshoot é a curva: um par de keyframes com uma bezier cujo y ultrapassa 1, não três keyframes.

{
  "frame": {"width": 1920, "height": 1080}, "fps": 30, "background": "#101418", "duration": 2000, "output": "out/pop.mp4",
  "tracks": [
    {"name": "badge", "layer": 10, "elements": [
      {"id": "badge", "type": "ellipse", "start": 500, "end": 2000, "x": 960, "y": [{"t": 500, "v": 580}, {"t": 900, "v": 540, "ease": [0.34, 1.56, 0.64, 1]}], "origin": "center", "width": 240, "height": 240, "fill": "#FF5A36", "scale": [{"t": 500, "v": [0.5, 0.5]}, {"t": 900, "v": [1.0, 1.0], "ease": [0.34, 1.56, 0.64, 1]}]}
    ]}
  ]
}
  • Duração: 300–450 ms. Mais curto para snaps, mais longo para flutuações.
  • Escala inicial: 0.5–0.7 para texto e cartões; 0 para formas pequenas e crachás.
  • Overshoot: [0.34, 1.56, 0.64, 1] atinge cerca de 10% acima. Aumente seu segundo número para 1.8 para algo divertido, ou diminua para 1.3 para algo corporativo. Mantenha uma curva para cada pop em uma peça.
  • Elevação: 20–60 px de deslocamento em y com a mesma curva adiciona peso. Pule em pops que ficam em uma fileira.
  • Escalonamento: uma batida quando cada item chega em sua própria batida; 60–120 ms entre itens dentro de uma batida.
  • Verificar: frame no início mais 40% da duração, onde o overshoot atinge o pico, e verifique se nada corta a borda do quadro ou um vizinho. Em seguida, preview um intervalo de pouco antes do primeiro pop a pouco depois do último.

Segurar, depois limpar

O último keyframe de uma entrada já segura, então segurar não custa nada. Uma saída começa com um keyframe no valor segurado, no momento em que a saída começa. O validate relata esse keyframe como R-EASE-INERT, e o guia de descobertas explica por que isso é esperado.

  • Duração da saída: 200–350 ms, ease-in. As saídas são mais rápidas que as entradas.
  • Movimento de saída: um fade mais 20–40 px de deslocamento, ou redução de escala para 0.9. Para um corte brusco, use um único keyframe step para o novo valor (veja o projeto inicial título).
  • Duração da segura: o tempo de leitura que o montagent-craft fornece.
  • Saídas em grupo: todo o grupo sai junto, ou escalonado em 30–60 ms na ordem de leitura.
  • Verificar: frame no último quadro desenhado antes da saída e verifique se todo o grupo está totalmente dentro e em repouso.

Mudança de cor em uma palavra

Recolora uma palavra dentro de sua linha com um highlight na execução daquela palavra, começando na batida. Isso mantém um elemento: não há segunda cópia para fazer crossfade, e a cor própria do elemento permanece a cor da linha.

{
  "frame": {"width": 1920, "height": 1080}, "fps": 30, "background": "#101418", "duration": 3000, "output": "out/accent.mp4",
  "fonts": {"title": [{"file": "fonts/Inter-Bold.ttf"}]},
  "fontVendor": {"fonts/Inter-Bold.ttf": {"licence": "OFL-1.1", "source": "https://github.com/rsms/inter", "sha256": "288316099b1e0a47a4716d159098005eef7c0066921f34e3200393dbdb01947f"}},
  "tracks": [
    {"name": "line", "layer": 20, "elements": [
      {"id": "line", "type": "text", "start": 0, "end": 3000, "x": 960, "y": 540, "origin": "center", "width": 1600, "height": 140, "font": "title", "size": 110, "color": "#F5F0E6", "align": "center", "runs": [{"text": "Video your agent can "}, {"text": "read.", "highlight": {"start": 2000, "end": 3000, "color": "#FF5A36"}}], "caption": false}
    ]}
  ]
}
  • Timing: a mudança cai em uma batida, nunca na entrada da palavra. Dê ao olho pelo menos meia batida para ler a palavra primeiro.
  • Ênfase: quando a palavra é seu próprio elemento, um aumento de escala na mesma batida (1.0 para 1.06–1.1 e de volta em 200–300 ms) faz a mudança se fixar.
  • Verificar: frame um quadro antes e um quadro depois da mudança, e verifique se apenas uma palavra mudou.

Texto cinético e digitado

Quando cada letra, palavra ou linha compartilha uma curva de movimento em um passo regular (every ms), mantenha um único elemento text e o escalone com units (by: letter, word ou line; order: forward, reverse, center_out ou edges_in). Aqui, um título evapora para foco do centro para fora:

{
  "frame": {"width": 1920, "height": 1080}, "fps": 30, "background": "#101418", "duration": 2000, "output": "out/evaporate.mp4",
  "fonts": {"title": [{"file": "fonts/Inter-Bold.ttf"}]},
  "fontVendor": {"fonts/Inter-Bold.ttf": {"licence": "OFL-1.1", "source": "https://github.com/rsms/inter", "sha256": "288316099b1e0a47a4716d159098005eef7c0066921f34e3200393dbdb01947f"}},
  "tracks": [
    {"name": "title", "layer": 20, "elements": [
      {"id": "evaporate", "type": "text", "start": 0, "end": 2000, "x": 960, "y": 540, "origin": "center", "width": 1400, "height": 160, "font": "title", "size": 108, "color": "#F5F0E6", "align": "center", "runs": [{"text": "SHARP FOCUS"}], "units": {"by": "letter", "order": "center_out", "every": 45, "y": [{"t": 0, "v": 20}, {"t": 360, "v": 0, "ease": "ease-out"}], "opacity": [{"t": 0, "v": 0}, {"t": 360, "v": 1, "ease": "ease-out"}], "blur": [{"t": 0, "v": 24}, {"t": 360, "v": 0, "ease": "ease-out"}]}, "caption": false}
    ]}
  ]
}
  • Evaporação / foco óptico (blur): anime blur dentro de units de 16–32 px para 0 em 300–450 ms (ease-out), emparelhado com opacity (0 -> 1) e uma pequena elevação em y (16–28 px -> 0) ou scale ([1.08, 1.08] -> [1.0, 1.0]). Quando blur atinge 0 e opacity atinge 1, o renderizador segue o caminho rápido com custo de camada extra zero.
  • Ordens simétricas (center_out, edges_in): center_out começa na unidade do meio (ou par do meio quando a contagem é par) e avança para ambas as extremidades; edges_in começa na primeira e na última unidade juntas e converge para o meio.
  • Onda viajante (A -> pico -> A): em vez de um Seletor de Intervalo do After Effects (triangle, round ou smooth), escreva uma curva de retorno de três keyframes em units — por exemplo "y": [{"t": 0, "v": 0}, {"t": 180, "v": -28, "ease": "ease-out"}, {"t": 360, "v": 0, "ease": "ease-in-out"}] (ou um pulso de scale / blur) — e deixe every ondular o pico através da linha. Para isolar uma palavra ou letra com tempo personalizado, divida-a em sua própria run com unit.
  • Mantenha glifos como text (nunca converta glifos para path): elementos path têm um contorno (points sem holes), então converter glifos multi-contorno (O, A, B, 8, i, ?, %) para path preenche contornos internos sólidos ou descarta ilhas (ADR-0224). Mantenha texto como text e estilize ou anime com stroke, units, path e effects.
  • Tempos de batida irregulares ou cursor de digitação (scripts/type_on.py): quando as palavras caem em timestamps de batida irregulares ou as letras precisam de um cursor de passo, execute python3 scripts/type_on.py <project> <spec> (--help para a especificação). Ele mede a linha com measure e emite um elemento text por unidade ("by": "word" com "enter": "pop" e times / highlights, ou "by": "letter" a 60–150 ms com um cursor piscando), marcando cada caption: false.
  • Títulos rastreados: não divida o título em letras. Escreva um elemento text com letter_spacing, em milésimos de em (size × letter_spacing / 1000 px após cada letra; negativo aperta). Anime-o para separar um título: "letter_spacing": [{"t": 0, "v": 0}, {"t": 800, "v": 120, "ease": [0.65, 0, 0.35, 1]}]. Qualquer valor diferente de zero desativa as ligaduras opcionais, e um script de junção como o árabe não recebe espaçamento.
  • Colunas verticais e colunas laterais: Montagent não possui propriedade writing_mode (ADR-0224). Para uma coluna empilhada vertical (texto vertical CJK ou um letreiro empilhado), junte grafemas com \n ("text": "東\n京\n都") dentro de uma caixa de text estreita com "align": "center" e "line_height": 1.0 ou 1.1; mantenha 2–3 dígitos horizontais ou iniciais latinas em uma linha ("text": "第\n25\n回", Tate-chu-yoko) e escalone com "by": "line" para que o número horizontal se mova como uma unidade. Para uma coluna lateral latina, defina um elemento text horizontal e gire-o com "rotation": -90 (lê de baixo para cima) ou "rotation": 90 (lê de cima para baixo).
  • Verificar: preview o intervalo da linha chegando. Em seguida, frame em repouso e verifique se o espaçamento é lido como uma linha, sem lacuna mais larga em um limite de palavra ou letra.

Revelar por wipe

Um wipe descobre algo deslizando uma borda sobre ele. Coloque um oclusor acima da coisa: um retângulo preenchido exatamente com o que está atrás da coisa. Em seguida, encolha o oclusor em torno de sua borda mais distante, de modo que sua borda mais próxima varra. Uma barra de destaque montada nessa borda faz o wipe parecer intencional.

{
  "frame": {"width": 1920, "height": 1080}, "fps": 30, "background": "#101418", "duration": 2000, "output": "out/wipe.mp4",
  "tracks": [
    {"name": "mark", "layer": 10, "elements": [
      {"id": "mark", "type": "image", "start": 0, "end": 2000, "source": "media/still.png", "x": 960, "y": 540, "origin": "center", "width": 360, "height": 360, "fit": "contain"}
    ]},
    {"name": "occluder", "layer": 11, "elements": [
      {"id": "occluder", "type": "rect", "start": 0, "end": 1000, "x": 1160, "y": 540, "origin": "center-right", "width": 400, "height": 400, "fill": "#101418", "scale": [{"t": 400, "v": [1.0, 1.0]}, {"t": 900, "v": [0.0, 1.0], "ease": [0.65, 0, 0.35, 1]}]}
    ]},
    {"name": "edge", "layer": 12, "elements": [
      {"id": "edge", "type": "rect", "start": 400, "end": 1000, "x": [{"t": 400, "v": 760}, {"t": 900, "v": 1160, "ease": [0.65, 0, 0.35, 1]}], "y": 540, "origin": "center", "width": 16, "height": 420, "fill": "#FF5A36", "opacity": [{"t": 900, "v": 1.0}, {"t": 1000, "v": 0.0, "ease": "ease-in"}]}
    ]}
  ]
}
  • Duração: 400–600 ms, [0.65, 0, 0.35, 1]: uma varredura que começa e termina suavemente.
  • Oclusor: 20–40 px maior que a coisa em cada lado e o mesmo preenchimento que o fundo atrás dela. O keyframe inicial fica onde o wipe começa, então a coisa permanece coberta até então.
  • Barra de borda: 8–24 px de largura, 5–10% mais alta que o oclusor, movendo-se na mesma curva e tempo. Ela sai em 100–200 ms após a varredura terminar.
  • Direção: varra na direção de leitura; para limpar, cresça o oclusor de volta a partir da borda mais próxima.
  • Fundo ocupado: um oclusor só funciona sobre uma cor sólida. Sobre uma foto, gradiente ou gravação, anime a própria mask do elemento: {"name": "mask", "shape": "rect", "x": 0, "y": 0, "width": [{"t": 400, "v": 0}, {"t": 900, "v": 400, "ease": [0.65, 0, 0.35, 1]}], "height": 400} descobre um elemento 400 × 400 de sua borda esquerda, sem oclusor. O retângulo é local ao elemento, a partir do canto superior esquerdo; uma máscara de width zero esconde o elemento, então a revelação começa coberta. Adicione feather para uma borda suave.
  • Verificar: frame no meio da varredura e verifique se a barra de borda cobre exatamente a borda do oclusor; depois frame logo após a varredura e verifique se não sobrou nada do oclusor.

Transição com um push, slide ou wipe

Para passar de um cartão, imagem ou cena para a próxima com movimento, faça a ponte entre os dois com uma transition do tipo push, slide ou wipe. x animado em ambos os elementos se deslocaria na junção; a transição mantém as duas metades unidas ao pixel, e validate verifica isso.

{
  "frame": {"width": 1920, "height": 1080}, "fps": 30, "background": "#101418", "duration": 3000, "output": "out/handover.mp4",
  "tracks": [
    {"name": "first", "layer": 10, "elements": [
      {"id": "card-1", "type": "rect", "start": 0, "end": 1700, "x": 0, "y": 0, "origin": "top-left", "width": 1920, "height": 1080, "fill": "#FF5A36"}
    ]},
    {"name": "second", "layer": 11, "elements": [
      {"id": "card-2", "type": "rect", "start": 1200, "end": 3000, "x": 0, "y": 0, "origin": "top-left", "width": 1920, "height": 1080, "fill": "#2E86FF"}
    ]},
    {"name": "handover", "layer": 12, "elements": [
      {"id": "handover", "type": "transition", "start": 1200, "end": 1700, "kind": "push", "from": "card-1", "to": "card-2", "direction": "left", "ease": [0.65, 0, 0.35, 1]}
    ]}
  ]
}
  • Tipo: push quando os dois pertencem a uma tira (páginas, etapas, um carrossel); slide quando o novo pousa em cima de um parado; wipe quando o antigo deve permanecer e ser cortado.
  • Direção: a maneira como o movimento viaja. left traz o novo da direita, o que segue a direção de leitura.
  • Duração: 400–600 ms, [0.65, 0, 0.35, 1]. O start e end da transição são exatamente o tempo que os dois compartilham.
  • Empilhamento de slide: em um slide, o elemento que chega deve estar na layer superior.
  • Verificar: frame no meio da transição e verifique se a junção não tem lacuna ou sobreposição; depois preview a transição inteira em tempo real.

Individual skills in this repo

This repo contains 4 individual skills — each has its own dedicated page.

Habilidades Relacionadas