Communitygithub.com

thuann-vn/stick-crowd-mv

Crea un videoclip musical vertical de unos 30 s en el que una figura de palitos camina sola entre una multitud en una calle 3D pintada a mano. Se apoya en el skill painted-3d-short para el decorado y añade una multitud animada por código.

¿Qué es stick-crowd-mv?

Este skill construye un videoclip musical corto y vertical (30 s, 720 fotogramas a 24 fps) combinando un decorado 3D pintado a mano (construido con el skill `painted-3d-short`) con una multitud de 100‑200 figuras de palitos generadas proceduralmente. La figura principal (el héroe) camina o permanece quieta en medio de la calle mientras el resto de la multitud se mueve con pasos realistas (plantados, sin deslizamiento) y lleva accesorios como paraguas, teléfonos y sombras proyectadas. El skill funciona sobre Blender (EEVEE) y se apoya en herramientas Python (`tools/stick.py`, `tools/gait.py`, `tools/post.py`) para generar la geometría, la animación y el posprocesado. El resultado final incluye un efecto de lapso de tiempo en el que la multitud se mueve 10 × más rápido que el héroe, efectos de blooming, viñeteado, grano y pulsos sincronizados con el ritmo de la canción. Es ideal para creadores que quieran producir un videoclip con una estética pictórica y una multitud animada de forma eficiente.

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

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

Stick crowd MV (pintado 3D + multitud por código)

Ejemplo práctico en example/: «the lonely one in the crowd» — 2 tomas en una calle de libros vietnamita (día, atardecer), 4 tomas en una calle comercial japonesa lluviosa de noche, y un final en lapso de tiempo donde la cámara sube hacia el cielo. 30 s, 720 fotogramas, 24 fps.

Este skill se apoya en painted-3d-short (https://github.com/thuann-vn/claude-painted-3d-shorts): su p3d.py construye el bloqueo, renderiza las imágenes fijas, proyecta las pinturas y llama a tus setters en cada fotograma. Lee primero ese skill. Éste añade las personas.

Archivos

  • tools/stick.py — la multitud. setter = stick.make(globals(), "<lugar>"), pásalo a render(SHOTS, [setter]).
  • tools/gait.py — la marcha (solo numpy, comprobable sin Blender).
  • tools/post.py — paso de acabado sobre los fotogramas renderizados.
  • example/scene.py, example/book.py — los dos decorados y sus tomas. example/jobs.json — los prompts de repintado. example/paint/ — las pinturas. example/m2m.json — clips de reposo (Mesh2Motion, CC0).

Orden de trabajo

  1. Canción primero: corta los 30 s que quieras, encuentra los tiempos de las líneas de la letra, corta las tomas sobre ellas (CUT en scene.py y stick.py).
  2. Bloqueo + imágenes fijas + repintado + proyección exactamente como en painted-3d-short. Sin personas en las pinturas.
  3. Escenifica cada toma en SHOTS de stick.py: inicio del héroe, dirección, walk o stand, inclinación facial, semiancho de carril, radio de burbuja, personas quietas en los bordes, caminantes en calles laterales (cross).
  4. Prueba fotogramas individuales: NTEST=2 STICK_OFF=<fotograma> blender -b --factory-startup -P scene.py -- --proj --shots 4. Míralos.
  5. Renderizado completo (3 procesos de Blender como máximo), post.py, unión con ffmpeg + el clip de la canción.
  6. Mide antes de llamarlo suave: diferencia absoluta media entre fotogramas consecutivos por toma; máximo ÷ mediana por encima de ~2 significa que algo apareció de repente (encuentra el fotograma, míralo).

Cómo se construyen las personas (stick.py)

  • Geometría real dentro del decorado, para que la calle pintada las oculte correctamente. Las extremidades de todos = UNA malla de prismas de 6 lados cuyos vértices se reescriben en cada fotograma (numpy → foreach_set). Las cabezas = esferas con un sombreador cel de 3 tonos en espacio de cámara + casco invertido. 200 personas renderizan en menos de un segundo por fotograma en EEVEE.
  • El centro de la cabeza se sitúa en la línea del cuello (cuello + dir × radio × 0.86), o la cabeza flota fuera del cuerpo.
  • Luz: una lista de lámparas por lugar (posición, color, intensidad). Cada cabeza recibe la suma como color de objeto; normaliza por el canal más grande, no recortes (recortar lo vuelve todo blanco). Sombra proyectada = la misma malla de extremidades proyectada sobre el suelo desde la lámpara suspendida más cercana (longitud recortada), o a lo largo del sol en exterior; más una mancha de contacto suave.
  • Paraguas (lluvia): un objeto de cúpula de 8 paneles por persona, color desde el color del objeto, un tercio de ellos de vinilo transparente; el brazo derecho se reposiciona para sostener el mango; la cubierta proyecta una sombra redonda. El héroe no tiene.
  • Teléfonos: mano izquierda en la oreja, una losa fina contra la mejilla que brilla por la noche.
  • Lluvia: una caja de quads delgados orientados a la cámara frente al objetivo, al menos a 1.9 m de distancia.

La marcha (gait.py)

La captura de movimiento sobre una figura lineal parece desordenada (los brazos anclados en el cuello se abren mucho, las manos son ruidosas). La marcha es procedural:

  • Los pies están plantados: un pie de apoyo permanece en su lugar mientras el cuerpo pasa sobre él; la posición en el suelo proviene de la distancia caminada, por lo que cualquier velocidad está libre de deslizamiento (medido: < 0.2 mm por fotograma).
  • Las caderas se elevan sobre la pierna de apoyo y bajan en el doble apoyo; IK de pierna de 2 huesos con la rodilla hacia adelante.
  • Los brazos cuelgan del cuello cerca del cuerpo y se balancean opuestos a las piernas; la cabeza permanece tranquila.
  • Especificaciones: normal, stroll, brisk (zancada, cadencia, balanceo de brazos, inclinación varían por persona) y hero (pasos cortos, cabeza baja, brazos colgando). Cadencias reales: paseo 80–105 pasos/min, normal 105–125, rápido 125–140.

Reglas de la multitud por las que se pagó

  • Un carril recto por caminante durante toda la toma. Dirigir durante la toma (alrededor del héroe, alrededor del objetivo) hace que las personas se desvíen lateralmente. En su lugar, antes de que comience la toma, simula cada caminante a lo largo de la toma y mueve su carril a un lado una vez si entraría en el círculo vacío del héroe, pasaría cerca del objetivo o se interpondría entre el objetivo y el héroe.
  • El bucle debe salir de la vista. Llena la calle desde ~6 m detrás de la cámara hasta ~50 m adelante y desvanece solo en el borde. Un bucle dentro de la imagen es una persona saltando a otro lugar.
  • Nunca encojas ni desvanezcas a una persona dentro de la imagen.
  • Densidad que se lea como «abarrotada»: 2–2.7 personas por metro en una calle de 6 m de ancho.
  • Un clip de pose con dos fotogramas clave en bucle hace que la figura tiemble: mantenlo quieto (timeScale = 0).
  • Una persona quieta nunca está inmóvil: respiración, un cambio lento de peso, el rostro girando.
  • Las parejas caminan lado a lado con la misma especificación, medio ciclo separadas.

Lapso de tiempo (toda la película)

  • En cada toma, el reloj de la multitud corre 10 × más rápido (LAPSE, warp()); el héroe solo vive en tiempo real. Ese contraste es la idea de la película.
  • Renderiza 6 subfotogramas por fotograma (SUB; el recuento de fotogramas de la toma × 6 en scene.py); post.py los promedia en luz lineal, por lo que las personas se convierten en estelas y las luces permanecen brillantes. 30 s = 4320 renderizados, unos 25 minutos en tres procesos de Blender.

Movimientos de cámara dentro de la pintura

Una pintura proyectada solo sobrevive a un pequeño desplazamiento hacia adelante. Pero la cámara de renderizado puede GIRAR, ACERCARSE y ROTAR libremente dentro de la pintura: una rotación pura no tiene paralaje. CAMK en stick.py contiene claves por toma — (parte de la toma, zoom, paneo, inclinación, rotación, apuntar al héroe) — aplicadas después de look() de p3d; el paneo y la inclinación se limitan al espacio que deja el zoom, y un fotograma rotado se acerca lo suficiente para permanecer dentro de la pintura. Dale a cada toma un movimiento con una razón:

  • empezar cerca de él, inclinar hacia arriba y retroceder para revelar la calle abarrotada;
  • acercamiento lento al rostro mientras camina hacia nosotros;
  • desde los letreros de neón hacia la calle hasta que lo encontremos;
  • un horizonte inclinado que se estabiliza mientras nos acercamos;
  • un paneo sobre paraguas que pasan hasta llegar a él;
  • desde arriba: cerca de la cabeza descubierta, girando, retrocediendo sobre los paraguas;
  • el final: UNA imagen muy amplia (14 mm, apuntando ~20° arriba) y una cámara de renderizado de 28 mm que se inclina desde él hacia el cielo.

Para una órbita o un movimiento de grúa real, pinta una imagen extra amplia para esa toma.

Paso de acabado (post.py)

Brillo en lo que es realmente brillante, viñeteado, grano (más fuerte en la oscuridad), un poco de aberración cromática, deriva lenta de cámara en mano (no en el lapso de tiempo), zoom y destello en cada corte, y un pequeño pulso de zoom y resplandor en el golpe de la canción (banda baja del audio, fotograma a fotograma). Mantén cada efecto pequeño; juntos son suficientes.

Música

Usa música de la que tengas derechos; no hay audio en este repositorio. CLIP=/ruta/clip.m4a python post.py lee la canción para el pulso del golpe. Para ajustar una nueva pista a tomas ya renderizadas, desliza una ventana de 30 s sobre la pista y conserva el desplazamiento donde la intensidad de inicio en los tiempos de corte sea más alta. El corte final del ejemplo usa «Thunder & Rain Inst. & Construction Kits» de coruscate (https://ccmixter.org/files/Coruscate/61228), CC BY 3.0.

Skills relacionados