Communitygithub.com

thuann-vn/stick-crowd-mv

Crie um Short musical vertical (cerca de 30 s) onde um boneco de palito fica parado ou caminha sozinho em uma rua 3D pintada à mão e cheia de gente - usando blockout no Blender, repintura de imagem projetada de volta no cenário, uma multidão de 100-200 palitos animada por código (andar com pés plantados, guarda-chuvas, celulares, luz de poste, sombras projetadas, chuva), um final em time-lapse e uma passada de acabamento cortada para a música. Use sobre a skill painted-3d-short quando pessoas precisam andar pelo mundo pintado.

O que é stick-crowd-mv?

Esta skill, construída sobre a **painted-3d-short**, permite criar curtas musicais verticais com uma multidão procedural de 100 a 200 bonecos de palito em cenários 3D pintados à mão. Ela é projetada para desenvolvedores e criadores que usam ferramentas como Claude Code, Blender e Python, oferecendo uma solução completa de animação de multidão sem necessidade de captura de movimento. As pessoas são geometria real dentro do cenário, garantindo oclusão correta pela rua pintada, e o andar é totalmente procedural, usando um algoritmo de pés plantados que elimina deslizamentos (medido em menos de 0,2 mm por quadro). A skill suporta várias plataformas, incluindo Blender (EEVEE para renderização rápida), numpy para cálculos de movimento e Python para scripts de pós-produção. Os destaques incluem: regras de multidão que garantem que os personagens não colidam com o herói ou a câmera, ajuste de densidade para parecer lotado (2-2,7 pessoas por metro em uma rua de 6 m), e efeitos como guarda-chuvas, celulares e chuva. O time-lapse acelera a multidão em 10× enquanto o herói vive em tempo real, criando um contraste visual impactante. A câmera pode girar, zoomar e inclinar livremente dentro da pintura projetada, sem paralaXE. A passada de acabamento adiciona bloom, vinheta, grão, tremor suave de mão e pulsos de zoom/glow sincronizados com o kick da música.

Funciona com✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/thuann-vn/claude-stickman-crowd-mv/tree/HEAD/stick-crowd-mv

Perguntar na sua IA favorita

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

Documentação

Stick crowd MV (pintado 3D + multidão por código)

Exemplo funcional em example/: "o solitário na multidão" — 2 planos em uma rua de livros vietnamita (dia, entardecer), 4 planos em uma rua comercial japonesa chuvosa à noite, e um final em time-lapse onde a câmera vira para o céu. 30 s, 720 quadros, 24 fps.

Esta skill é construída sobre a painted-3d-short (https://github.com/thuann-vn/claude-painted-3d-shorts): seu p3d.py constrói o blockout, renderiza os stills, projeta as pinturas e chama seus setters a cada quadro. Leia essa skill primeiro. Esta aqui adiciona pessoas.

Arquivos

  • tools/stick.py — a multidão. setter = stick.make(globals(), "<local>"), passe para render(SHOTS, [setter]).
  • tools/gait.py — a caminhada (apenas numpy, testável sem Blender).
  • tools/post.py — passada de acabamento sobre os quadros renderizados.
  • example/scene.py, example/book.py — os dois cenários e seus planos. example/jobs.json — os prompts de repintura. example/paint/ — as pinturas. example/m2m.json — clipes idle (Mesh2Motion, CC0).

Ordem de trabalho

  1. Música primeiro: corte os 30 s que deseja, encontre os tempos das linhas da letra, corte os planos neles (CUT em scene.py e stick.py).
  2. Blockout + stills + repintura + projeção exatamente como na painted-3d-short. Nenhuma pessoa nas pinturas.
  3. Posicione cada plano em SHOTS do stick.py: posição inicial do herói, direção, walk ou stand, inclinação do rosto, meia-largura da faixa, raio da bolha, pessoas paradas nas bordas, andadores em ruas laterais (cross).
  4. Teste quadros únicos: NTEST=2 STICK_OFF=<frame> blender -b --factory-startup -P scene.py -- --proj --shots 4. Olhe para eles.
  5. Renderização completa (no máximo 3 processos Blender), post.py, junte com ffmpeg + o clipe da música.
  6. Meça antes de chamar de suave: diferença absoluta média entre quadros consecutivos por plano; max ÷ mediana acima de ~2 significa que algo apareceu (encontre o quadro, olhe para ele).

Como as pessoas são construídas (stick.py)

  • Geometria real dentro do cenário, para que a rua pintada as oculte corretamente. Membros de todos = UMA malha de prismas de 6 lados cujos vértices são reescritos a cada quadro (numpy → foreach_set). Cabeças = esferas com um shader cel de 3 tons no espaço da câmera + invólucro invertido. 200 pessoas renderizam em bem menos de um segundo por quadro no EEVEE.
  • O centro da cabeça fica na linha do pescoço (neck + dir × radius × 0.86), ou a cabeça flutua para fora do corpo.
  • Luz: uma lista de lâmpadas por local (posição, cor, intensidade). Cada cabeça recebe a soma como sua cor de objeto; normalize pelo maior canal, não fixe (fixar torna tudo branco). Sombra projetada = a mesma malha de membros projetada no chão a partir da lâmpada suspensa mais próxima (comprimento fixado), ou ao longo do sol durante o dia; além de uma mancha de contato suave.
  • Guarda-chuvas (chuva): um objeto de cúpula de 8 painéis por pessoa, cor da cor do objeto, um terço deles em vinil transparente; o braço direito é reposicionado para segurar a haste; o dossel projeta uma sombra redonda. O herói não tem nenhum.
  • Celulares: mão esquerda na orelha, uma placa fina contra a bochecha que brilha à noite.
  • Chuva: uma caixa de quads finos virados para a câmera na frente da lente, a pelo menos 1,9 m de distância.

A caminhada (gait.py)

Captura de movimento em uma figura de linha parece bagunçada (braços enraizados no pescoço se espalham, mãos são ruidosas). A caminhada é procedural:

  • Pés são plantados: um pé de apoio permanece em seu lugar enquanto o corpo passa sobre ele; a posição no chão vem da distância percorrida, então qualquer velocidade é livre de deslizamento (medido: < 0,2 mm por quadro).
  • Quadris sobem alto sobre a perna de apoio e baixam no apoio duplo; IK de perna de 2 ossos com o joelho para frente.
  • Braços pendem do pescoço próximos ao corpo e balançam contra as pernas; a cabeça permanece calma.
  • Especificações: normal, stroll, brisk (passada, cadência, balanço do braço, inclinação diferem por pessoa) e hero (passos curtos, cabeça baixa, braços pendentes). Cadências reais: stroll 80-105 passos/min, normal 105-125, brisk 125-140.

Regras da multidão que foram pagas

  • Uma faixa reta por andador para o plano inteiro. Direcionar durante o plano (ao redor do herói, ao redor da lente) faz as pessoas correrem para os lados. Em vez disso, antes do plano começar, simule cada andador ao longo do plano e mova sua faixa para o lado uma vez se ele entrar no círculo vazio do herói, passar perto da lente, ou ficar entre a lente e o herói.
  • O loop deve desaparecer fora de vista. Preencha a rua de ~6 m atrás da câmera até ~50 m à frente e desvaneça apenas no limite. Um loop dentro da imagem é uma pessoa pulando para outro lugar.
  • Nunca encolha ou desvaneça uma pessoa dentro da imagem.
  • Densidade que pareça "lotada": 2-2,7 pessoas por metro de uma rua de 6 m de largura.
  • Um clipe de pose com duas chaves repetindo faz a figura tremer: segure (timeScale = 0).
  • Uma pessoa parada nunca fica imóvel: respirando, uma lenta mudança de peso, o rosto se virando.
  • Casais andam lado a lado com a mesma especificação, com metade de um ciclo de diferença.

Time-lapse (o filme inteiro)

  • Em cada plano, o relógio da multidão corre 10× mais rápido (LAPSE, warp()); o herói sozinho vive em tempo real. Esse contraste é a ideia do filme.
  • Renderize 6 subquadros por quadro (SUB; a contagem de quadros do plano × 6 em scene.py); post.py os calcula a média em luz linear, então as pessoas se tornam rastros e as luzes permanecem brilhantes. 30 s = 4320 renderizações, cerca de 25 minutos em três processos Blender.

Movimentos de câmera dentro da pintura

Uma pintura projetada só sobrevive a um pequeno dolly para frente. Mas a câmera de renderização pode GIRAR, ZOOMAR e INCLINAR livremente dentro da pintura: uma rotação pura não tem paralaXE. CAMK em stick.py contém chaves por plano — (parte do plano, zoom, panorâmica, inclinação, rolagem, apontar-para-herói) — aplicadas após o look() do p3d; panorâmica e inclinação são fixadas no espaço que o zoom deixa, e um quadro inclinado é ampliado o suficiente para ficar dentro da pintura. Dê a cada plano um movimento com uma razão:

  • comece fechado nele, incline para cima e puxe para trás para revelar a rua lotada;
  • aproximação lenta no rosto enquanto ele caminha em nossa direção;
  • dos letreiros de néon para baixo na rua até encontrá-lo;
  • um horizonte inclinado que se estabiliza enquanto se aproxima;
  • uma panorâmica através de guarda-chuvas que passam que pousa nele;
  • de cima: fechado na cabeça descoberta, girando, puxando para trás sobre os guarda-chuvas;
  • o final: UMA imagem muito ampla (14 mm, apontada ~20° para cima) e uma câmera de renderização de 28 mm que se inclina dele para o céu.

Para uma órbita ou um movimento de grua real, pinte uma imagem extra larga para aquele plano.

Passada de acabamento (post.py)

Bloom no que é realmente brilhante, vinheta, grão (mais forte no escuro), um pouco de franja de cor, tremor suave de mão (não no time-lapse), aproximação + flash em cada corte, e um pequeno pulso de zoom e brilho no kick da música (banda baixa do áudio, quadro a quadro). Mantenha cada efeito pequeno; juntos são suficientes.

Música

Use música para a qual você tenha direitos; nenhum áudio está neste repositório. CLIP=/path/clip.m4a python post.py lê a música para o pulso do kick. Para ajustar uma nova faixa a planos já renderizados, deslize uma janela de 30 s sobre a faixa e mantenha o deslocamento onde a força de onset nos tempos de corte é mais alta. O corte final do exemplo usa "Thunder & Rain Inst. & Construction Kits" por coruscate (https://ccmixter.org/files/Coruscate/61228), CC BY 3.0.

Habilidades Relacionadas