Animação flat-color
Um desenho é segurado por 3–4 quadros, e o desempenho vem da troca de desenhos e formatos de boca. Para designs simples de cartoon de TV, essa é a rota onde os modelos de imagem permanecem mais consistentes. Não precisa de 3D nem de um modelo de vídeo.
Os scripts estão na pasta scripts/ desta skill, com caminhos relativos a este SKILL.md. Abaixo, $S significa essa pasta. Exceto por new_project.py, execute-os a partir da pasta do filme. Para problemas de ambiente, use dula-start.
Fale com a pessoa no idioma dela.
Fluxo de trabalho
python $S/new_project.py my_film && cd my_film
1. História e planos
Escreva story.md, depois config/film.json (veja a referência de film.json). Mantenha o primeiro filme em 20–30 segundos, e uma fala leva cerca de 2–3 segundos, então 15 segundos comportam 3–5 falas. Use apenas personagens originais.
Para cada fala, pense em quem diz, para quem, e quem a câmera mostra. Piadas não devem depender de palavras que o público não entenderá. Causa e efeito precisam de desenhos também (entra correndo → pega → o objeto voa). Não pule com um corte.
2. Designs de personagem (a etapa mais importante)
Coloque cada personagem em config/anchors.tsv (nome<TAB>aparência), depois execute:
python $S/paint.py anchors config/anchors.tsv
Abra e olhe cada imagem você mesmo. Alguns visualizadores mostram uma área transparente como um brilho colorido sobre preto, o que parece um recorte falho. Em caso de dúvida, verifique build/check_alpha.png da etapa 3. Depois, mostre os designs à pessoa e obtenha a aprovação dela antes de continuar. Cada desenho posterior segue estes, então um erro aqui custa mais caro para corrigir. Corrija as proporções em palavras, como "cabeça com um terço da altura total, rosto redondo, olhos pequenos de conta preta, macacão vermelho".
3. Fundos e desenhos
Preencha config/plates.tsv (nome<TAB>descrição) e config/cels.tsv (desenho<TAB>personagem<TAB>pose). Comece os nomes dos desenhos com o nome do personagem, como hero_corre_a.
python $S/paint.py plates config/plates.tsv
python $S/paint.py cels config/cels.tsv
python $S/prep_cels.py --bases-only # Verifique os recortes em build/check_alpha.png antes de pintar bocas
As imagens levam de 1 a 3 minutos cada, e paint.py relata o progresso conforme avança. Se sua ferramenta interromper comandos longos, execute em segundo plano. Uma reexecução pula imagens já finalizadas. Para refazer uma, use --only <nome> --force.
Para manter desenhos e lugares contínuos, adicione mais uma coluna nomeando o que seguir:
hero_corre_a heron Correndo para a direita, pé esquerdo à frente.
hero_corre_b heron Correndo para a direita, pé direito à frente. hero_corre_a
prado Um prado sob nuvens cinzentas de chuva.
prado_sol A chuva parou e o sol irrompe. prado
Regras:
- Desenhe um personagem por imagem. O design do personagem é sempre a primeira referência. Nunca use uma imagem rejeitada como referência.
- Decida primeiro para que lado os personagens olham. Imagens geradas uma a uma escolhem uma direção cada, então duas pessoas em uma conversa facilmente ficam de costas uma para a outra. Especifique isso de antemão e use
flippara corrigir erros. - Cada desenho em um ciclo de ação segue o anterior (a coluna extra acima), para que direção, escala e forma permaneçam constantes. Sem isso, um ciclo vibra.
- Para uma mudança na hora do dia, repinte o fundo, seguindo a placa original. Multiplicar uma cor não consegue esconder um céu azul.
- Verifique as proporções de um personagem em cada plano. Uma descrição de pose como "pescoço esticado para cima" pode se transformar em um corpo diferente.
4. Bocas e piscadas
Cada desenho que fala recebe edições locais da mesma imagem. Em config/variants.tsv:
hero_parado_m1 hero_parado Altere apenas a boca para entreaberta, oval pequeno.
hero_parado_m2 hero_parado Altere apenas a boca para bem aberta.
hero_parado_piscar hero_parado Feche ambos os olhos como linhas curvas simples. Não mude mais nada.
Nomes: <base>_m1 é entreaberta, e <base>_m2 é bem aberta. Com apenas _m1, a boca tem dois estados, aberta e fechada, e isso também funciona. O desenho base em si deve ter a boca fechada. Se foi desenhado com a boca aberta, crie uma variante fechada e defina todos os três estados com talk em film.json.
Cada desenho de um personagem que fala precisa de suas próprias bocas, incluindo cada desenho em um ciclo de caminhada.
python $S/paint.py variants config/variants.tsv
python $S/prep_cels.py
prep_cels.py transforma os desenhos em cor chapada verdadeira e trava cada variante em sua base. Em seguida, abra build/check_alpha.png e verifique os recortes sobre magenta. Redesenhe qualquer imagem com fundo remanescente, peças faltando ou olhos apagados. Se ele avisar sobre uma grande área alterada, o modelo editou o corpo. Adicione uma janela x,y,w,h como coluna 4 de variants.tsv.
Cores variando? Você pode adicionar config/palette.json ({"pele": [250, 220, 190]}), usando cores amostradas do design do personagem. Apenas cores próximas se ajustam a ele, e prep_cels.py o aplica novamente após você alterá-lo.
5. Som
Escolha um:
- Gere vozes com
dula-voice, usando a própria chave da pessoa. - Use áudio existente: coloque-o em
audio/voice/<id da fala>.wav, ou definafilena fala. mp3 e wav funcionam. - Faça um rascunho silencioso: dê à fala um valor
seconds.
As bocas são calculadas a partir deste áudio, portanto, estabeleça as vozes antes de fazer o teste.
Opcional: ambience, bgm, sfx e songs. Use apenas material ao qual a pessoa tenha direitos. Este projeto não gera música. Sem música licenciada, deixe a trilha de fora e deixe a ambiência e os efeitos sonoros conduzirem o filme.
6. Teste
python $S/build_film.py
python $S/render.py --stills 1,3,5,8,12
python $S/render.py --range 0,20 -o output/pilot.mp4
build_film.py para com um erro quando um personagem visível fala, mas sua boca não pode se mover, o erro mais fácil de passar despercebido. Olhe cada still antes de mostrar o teste. Não espere o filme inteiro ficar pronto para mostrar a alguém.
Posicionar um personagem no chão: chute ground, renderize um still e ajuste. É mais rápido do que calcular.
Não deixe os planos parados. A menos que uma batida deva ser estática, dê a cada plano uma coisa que se move: um pan na placa, um bob ou shake, uma troca de desenho, ou uma sobreposição como chuva. Termine o filme com fade_out no último plano.
7. Filme completo e verificação final
python $S/render.py
python $S/check_mouths.py
Confirme cada um destes antes de entregar, e diga claramente se não conseguiu:
- Você olhou um quadro real de cada plano
-
check_mouths.pynão relata bocas congeladas - Cada personagem ainda parece a mesma pessoa em todos os planos (rosto e proporções importam mais que cor)
- Pessoas em uma conversa estão de frente uma para a outra
- Um único desenho se movendo pela tela tem um
bobou mais desenhos, senão parece deslizar - Você ouviu. Se não puder ouvir, diga que o áudio não foi verificado de ouvido
Um exemplo completo
examples/rainy-slide neste repositório tem os prompts e a lista de planos de um filme de 15 segundos finalizado, e docs/tutorial.md o explica. Encontre-os em ../../examples/rainy-slide e ../../docs/tutorial.md a partir deste arquivo. Use-os como modelo quando alguém pedir um.
Ritmo
Regras práticas: planos duram em média 3–5 segundos, personagens seguram cada desenho por 3–4 quadros (cerca de 7 desenhos por segundo), com close-ups frequentes e expressões exageradas. hold é o número de quadros por desenho.
Problemas comuns
| Sintoma | Causa e correção |
|---|---|
| Cores do corpo piscam quando as bocas trocam | A variante não passou por prep_cels.py |
| Uma caminhada ou corrida pulsa alto e baixo | Não dimensione os desenhos separadamente. Um ator compartilha uma escala automaticamente. Adicione também align_head |
| Um adereço assume a cor errada | Uma entrada da paleta está muito próxima. Remova-a ou diminua SNAP |
| A boca fica aberta durante a fala | Bocas de dois estados usam um limiar de 0.5. Verifique se o áudio está abafado |
| Palavras baixas ficam fechadas | Uma palavra alta define a escala para sua fala. Adicione um _m2, ou diminua mouth_open_at na fala |
| A chuva ou o vento não podem ser ouvidos | A ambiência é baixa por padrão. Dê a ela um level_db, como -35 |
| Chiado constante | O clipe de ambiência é apenas ruído. Substitua-o. O ganho é limitado, então não será amplificado ainda mais |
| Codex diz que a imagem de referência foi perdida | A geração de imagem deve ser sua primeira ação. paint.py lida com isso, então execute-o novamente |
Limites
Esta rota não é adequada para lutas complexas, ação contínua longa ou pintura realista.