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ça | Abrir |
|---|---|
| Lançamento de produto, anúncio social, intro, outro | a estrutura de lançamento |
| Revelação de logotipo, vinheta de logotipo, qualquer coisa que faça loop | o loop de logotipo |
| Trailer, ou qualquer efeito de impacto, glitch, flash ou HUD | efeitos 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
ycom 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:
frameno 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,previewum 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
steppara o novo valor (veja o projeto inicial título). - Duração da segura: o tempo de leitura que o
montagent-craftfornece. - Saídas em grupo: todo o grupo sai junto, ou escalonado em 30–60 ms na ordem de leitura.
- Verificar:
frameno ú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:
frameum 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): animeblurdentro deunitsde16–32px para0em 300–450 ms (ease-out), emparelhado comopacity(0 -> 1) e uma pequena elevação emy(16–28px-> 0) ouscale([1.08, 1.08] -> [1.0, 1.0]). Quandobluratinge0eopacityatinge1, o renderizador segue o caminho rápido com custo de camada extra zero. - Ordens simétricas (
center_out,edges_in):center_outcomeça na unidade do meio (ou par do meio quando a contagem é par) e avança para ambas as extremidades;edges_incomeç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,roundousmooth), escreva uma curva de retorno de três keyframes emunits— 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 descale/blur) — e deixeeveryondular o pico através da linha. Para isolar uma palavra ou letra com tempo personalizado, divida-a em sua própria run comunit. - Mantenha glifos como
text(nunca converta glifos parapath): elementospathtêm um contorno (pointssemholes), então converter glifos multi-contorno (O,A,B,8,i,?,%) parapathpreenche contornos internos sólidos ou descarta ilhas (ADR-0224). Mantenha texto comotexte estilize ou anime comstroke,units,patheeffects. - 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 umcursorde passo, executepython3 scripts/type_on.py <project> <spec>(--helppara a especificação). Ele mede a linha commeasuree emite um elementotextpor unidade ("by": "word"com"enter": "pop"etimes/highlights, ou"by": "letter"a 60–150 ms com umcursorpiscando), marcando cadacaption: false. - Títulos rastreados: não divida o título em letras. Escreva um elemento
textcomletter_spacing, em milésimos de em (size × letter_spacing / 1000px 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 detextestreita com"align": "center"e"line_height": 1.0ou1.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 elementotexthorizontal e gire-o com"rotation": -90(lê de baixo para cima) ou"rotation": 90(lê de cima para baixo). - Verificar:
previewo intervalo da linha chegando. Em seguida,frameem 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
maskdo 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 dewidthzero esconde o elemento, então a revelação começa coberta. Adicionefeatherpara uma borda suave. - Verificar:
frameno meio da varredura e verifique se a barra de borda cobre exatamente a borda do oclusor; depoisframelogo 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:
pushquando os dois pertencem a uma tira (páginas, etapas, um carrossel);slidequando o novo pousa em cima de um parado;wipequando o antigo deve permanecer e ser cortado. - Direção: a maneira como o movimento viaja.
lefttraz o novo da direita, o que segue a direção de leitura. - Duração: 400–600 ms,
[0.65, 0, 0.35, 1]. Ostarteendda transição são exatamente o tempo que os dois compartilham. - Empilhamento de slide: em um
slide, o elemento que chega deve estar nalayersuperior. - Verificar:
frameno meio da transição e verifique se a junção não tem lacuna ou sobreposição; depoispreviewa transição inteira em tempo real.