6cc90558d4
Promueve el caso 1 del report 0217 (animacion de sprites de personaje) a un pipeline one-shot: de un prompt de personaje a un sprite sheet + GIF/WEBP en loop, frame-by-frame dirigido por pose (ControlNet OpenPose + seed fija + Rembg) con cada frame pixelizado a NxN RGBA. Nuevas funciones reutilizables (issue 0087, crecimiento por composicion): - comfyui_walk_cycle_oneshot (pipeline): orquesta poses -> generacion -> pixelizado -> ensamblado. No-throw, salta frames que fallan. Modo openpose (esqueletos reales) con fallback prompt-pose. - render_openpose_walk_skeletons: dibuja N esqueletos OpenPose COCO-18 del walk cycle (el insumo que el report 0217 marco como faltante). - comfyui_pixelize_sprite_png: PNG existente -> NxN RGBA pixel-art real (compone crop_to_content + pixeloe_downscale + comfyui_pixelize_image). - assemble_animated_sprite: frames RGBA -> sprite sheet horizontal + WEBP/GIF loop. - comfyui_build_walk_cycle_workflow (pura): grafo API del workflow animado para la UI (ControlNet OpenPose -> KSampler xN seed fija -> ImageBatch -> Rembg -> SaveAnimatedWEBP). Verificado en GPU: GIF/WEBP de caballero andando, 4 frames 32x32 (y 64x64) RGBA con fondo transparente y 16 colores, identidad de silueta consistente, piernas que cambian. Metodo de poses usado: OpenPose real (sin fallback). Evidencia en report 0221. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
5.3 KiB
5.3 KiB
name, kind, lang, domain, version, purity, signature, description, tags, uses_functions, uses_types, returns, returns_optional, error_type, imports, params, output, tested, tests, test_file_path, file_path
| name | kind | lang | domain | version | purity | signature | description | tags | uses_functions | uses_types | returns | returns_optional | error_type | imports | params | output | tested | tests | test_file_path | file_path | ||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| render_openpose_walk_skeletons | function | py | ml | 1.0.0 | impure | def render_openpose_walk_skeletons(out_dir: str, *, frames: int = 4, width: int = 512, height: int = 768, facing: str = 'right', line_width: int = 4, point_radius: int = 6, filename_prefix: str = 'walk_pose') -> dict | Dibuja con PIL una secuencia de N esqueletos OpenPose COCO-18 (18 keypoints, 17 limbs, colores canonicos) de un ciclo de caminar lateral, una fase del paso por frame, sobre fondo negro, y los guarda como PNG. Son la ENTRADA fija del ControlNet OpenPose (control_v11p_sd15_openpose_fp16) para animar un personaje frame-by-frame: el esqueleto NO lo genera la IA, lo aportas dibujado. Para frames=4 produce las 4 fases canonicas (contact-izq, passing, contact-der, passing); para mas frames muestrea el ciclo parametrico continuo. Piernas en oposicion a los brazos + rebote vertical del cuerpo (walk cycle de manual de animacion). facing='right'|'left' espeja en X. Impura: escribe N PNGs. Devuelve {ok, skeleton_paths, frames, width, height, error}. |
|
false | error_go_core |
|
dict con ok (bool, True si todos los PNG se generaron), skeleton_paths (list[str], rutas de los PNG en orden de fase), frames (int, frames generados), width (int), height (int), error (str, vacio si OK). | false | python/functions/ml/render_openpose_walk_skeletons.py |
Ejemplo
import sys, os
sys.path.insert(0, os.path.join(os.environ["HOME"], "fn_registry", "python", "functions"))
from ml.render_openpose_walk_skeletons import render_openpose_walk_skeletons
res = render_openpose_walk_skeletons("/tmp/walk_skeletons_demo", frames=4)
# {'ok': True,
# 'skeleton_paths': ['/tmp/walk_skeletons_demo/walk_pose_00.png', ..._03.png],
# 'frames': 4, 'width': 512, 'height': 768, 'error': ''}
# 8 fases mirando a la izquierda, lineas/puntos mas finos:
res8 = render_openpose_walk_skeletons(
"/tmp/walk_poses_left", frames=8, facing="left",
line_width=3, point_radius=5,
)
Los PNG resultantes se conectan luego con comfyui_build_controlnet_workflow
(uno por frame, control_net_name="control_v11p_sd15_openpose_fp16.safetensors")
para generar el personaje animado fotograma a fotograma.
Cuando usarla
Usala cuando vayas a animar un sprite/personaje 2D con ComfyUI + ControlNet OpenPose y necesites el insumo que la IA NO genera: la pose-map del esqueleto. Llamala ANTES de montar el workflow ControlNet — produce las N pose-maps del walk cycle (el caso mas comun de animacion de personaje) que el modelo seguira frame a frame. Tambien sirve como base para otras acciones ciclicas si ajustas las fases. Si necesitas una pose suelta (idle, ataque) en vez de un ciclo, extrae el patron a una funcion hermana — esta es especifica de caminar.
Gotchas
- Escribe N PNGs en disco (impura): si
out_dirno es escribible devuelveok=Falsecon el error; siout_diresNonelanzaValueError(unico caso que lanza — el resto de fallos se capturan enerror). - El orden de los 18 keypoints es COCO-18 EXACTO (0 nose ... 17 left_ear) y los colores son los canonicos de OpenPose/controlnet_aux. NO cambies el orden ni la paleta: el preprocesador/ControlNet identifica las articulaciones por color y posicion; alterarlos degrada o rompe el guiado de pose.
- Es un esqueleto sintetico parametrico, no una captura real: las proporciones son humanas estandar y la vista es estrictamente lateral. Para vistas 3/4 o proporciones no humanas (chibi, criaturas) habria que reparametrizar.
- Fondo NEGRO solido (RGB 0,0,0) por diseño — es lo que el ControlNet OpenPose espera como lienzo. No lo compongas sobre otra imagen.
frames=4da exactamente las 4 fases canonicas; valores que no dividan bien el ciclo (p.ej. 3, 5) siguen muestreando t=i/frames de forma uniforme y producen fases validas pero no necesariamente las "de manual". Para animacion fluida usa multiplos de 4 (8, 12, 16).- Necesita Pillow (PIL); si no esta instalado devuelve
ok=Falsecon error en vez de lanzar.