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 pararender(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
- Música primeiro: corte os 30 s que deseja, encontre os tempos das linhas da letra, corte os planos neles (
CUTem scene.py e stick.py). - Blockout + stills + repintura + projeção exatamente como na painted-3d-short. Nenhuma pessoa nas pinturas.
- Posicione cada plano em
SHOTSdo stick.py: posição inicial do herói, direção,walkoustand, inclinação do rosto, meia-largura da faixa, raio da bolha, pessoas paradas nas bordas, andadores em ruas laterais (cross). - Teste quadros únicos:
NTEST=2 STICK_OFF=<frame> blender -b --factory-startup -P scene.py -- --proj --shots 4. Olhe para eles. - Renderização completa (no máximo 3 processos Blender),
post.py, junte com ffmpeg + o clipe da música. - 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) ehero(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.