소스 정보
- 저장소
- Ntizar/MasterMind
- 최근 소스 활동
- 2026년 9월 8일 14:54
- 감지된 SKILL.md 언어
- 스페인어
- 스타
- 2
- 포크
- 0
설치 방법
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
소스 파일 검토
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
메뉴
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
직접 명령은 검토 Prompt를 거치지 않습니다. 실행하기 전에 소스를 확인하세요.
npx skills add https://github.com/Ntizar/MasterMind --skill webgl-scene-to-video명령은 한 줄로 유지됩니다. 복사하기 전에 가로로 스크롤해 전체 내용을 확인하세요.
로컬 사본을 원하시나요? SkillsMP에서 현재 제공할 수 있는 파일을 다운로드하세요.
SKILL.md 표시 중
Restore Hermes from a backup repo or migrate machines.
Usa al analizar ADN crudo: ascendencia, rasgos, sexo.
Usar al operar Mastermind en Windows: repo, ChromaDB, crons, gateway Telegram (colapso por token revocado y su restauración), backups y monitorización.
| name | webgl-scene-to-video |
| description | Renderiza escena Three.js/WebGL a MP4 (Puppeteer+ffmpeg). |
| version | 1.0.0 |
| tags | ["video","threejs","webgl","puppeteer","ffmpeg","seek","shorts","render","headless"] |
| related_skills | ["short-form-video-generation","hyperframes-html-to-video","webgl-headless-verification"] |
| author | Mastermind (Ntizar) |
| license | MIT |
| metadata | {"hermes":{"tags":["video","threejs","webgl","puppeteer","ffmpeg","seek","shorts","render","headless"],"related_skills":["short-form-video-generation","hyperframes-html-to-video","webgl-headless-verification"]}} |
Convierte una escena Three.js/WebGL animada (no un slideshow de fotos) en un MP4 vertical 9:16 sincronizado con voz. Vía: Puppeteer (Chrome headless) captura frame a frame + ffmpeg. Alternativa a hyperframes-html-to-video cuando la escena usa Three.js y quieres control total (o HyperFrames no está instalado).
No es el pipeline de fotos/slides de short-form-video-generation. Aquí la escena es 3D real (objetos, cámara con dolly, partículas) renderizada a vídeo.
hyperframes no esté instalado o la escena use Three.js y prefieras control directo de la captura (frame a frame).puppeteer descargado), ffmpeg en el PATH, y edge_tts (venv Hermes) para la voz.Para capturar frame a frame de forma determinista, la animación NO puede depender del reloj real (performance.now en un bucle). Debe ser una función draw(t) que se pueda fijar en un tiempo arbitrario:
function draw(t){
// TODO el estado depende de t (cámara, objetos, partículas, textos)
renderer.render(scene, camera);
}
window.seek = t => draw(t); // fija y dibuja en el tiempo t
window.play = () => { // para previsualización en vivo
const s=performance.now();
(function f(now){ draw((now-s)/1000); requestAnimationFrame(f); })();
};
window.seek(0); // dibuja el primer frame
t de forma determinista, nunca acumulativo.(t*v % rango), NO y += 0.01 en cada frame (eso se acumula y rompe el seek).opacity/transform desde draw(t) en vez de CSS keyframes, para que también sean seekables.const puppeteer = require('puppeteer-core'); // usar el Chrome del sistema, no descargar otro
const CHROME = 'C:/Program Files/Google/Chrome/Application/chrome.exe';
(async () => {
const browser = await puppeteer.launch({ executablePath: CHROME, headless:'new',
args:['--no-sandbox','--window-size=1080,1920','--use-gl=angle','--use-angle=swiftshader','--enable-unsafe-swiftshader'] });
const page = await browser.newPage();
await page.setViewport({ width:1080, height:1920, deviceScaleFactor:1 });
await page.goto('http://localhost:8123/teaser.html', { waitUntil:'networkidle2', timeout:60000 });
await page.waitForFunction('typeof window.seek === "function"', { timeout:30000 });
const DUR=14.2, FPS=15, n=Math.ceil(DUR*FPS);
for(let i=0;i<n;i++){
await page.evaluate(tt => window.seek(tt), i/FPS);
await page.screenshot({ path:`frames/f_${String(i).padStart(4,'0')}.png` });
}
await browser.close();
})();
Servir el HTML con un python -m http.server 8123 en el directorio (el importmap/CDN de three.js funciona vía http; file:// puede fallar para módulos). npm i puppeteer-core es suficiente — no hace falta puppeteer completo ni descargar Chrome.
ffmpeg -y -framerate 15 -i frames/f_%04d.png -i voice.mp3 \
-c:v libx264 -pix_fmt yuv420p -c:a aac -b:a 192k \
-shortest -movflags +faststart out/video.mp4
# fades cinematográficos (opcional): duración = duración del audio
ffmpeg -y -i out/video.mp4 \
-vf "fade=t=in:st=0:d=0.5,fade=t=out:st=<DUR-0.5>:d=0.5" \
-af "afade=t=in:st=0:d=0.3,afade=t=out:st=<DUR-0.3>:d=0.3" \
-c:v libx264 -pix_fmt yuv420p -c:a aac -movflags +faststart out/final.mp4
requestAnimationFrame compite con seek(t). Si la página arranca un bucle con el reloj real, corre entre seek(t) y el screenshot y sobrescribe el estado → todos los frames salen iguales / el timing de los textos no sigue. No arranques el bucle automáticamente: deja seek(t) y play() como funciones, y usa seek(t) en la captura.--use-angle=gl (GPU nativa) dio THREE.WebGLProgram: Shader Error ... VALIDATE_STATUS false en Chrome headless. Usar --use-angle=swiftshader --enable-unsafe-swiftshader (software) — compila limpio. El rAF va a ~20 fps bajo SwiftShader, suficiente para la captura (la sincronización la da seek(t), no el fps).alpha:true en el WebGLRenderer + renderer.setClearColor(0x000000, 0) para que el gradiente de fondo se vea a través.python -m http.server), no file://, para los imports ES con importmap (CDN) en headless.ffprobe el MP4: 1080×1920, H.264/AAC, duración ≈ voz.t (0.5s, mitad, final) y comprobar visualmente que el timing de los textos cambia y la cámara hace dolly (los objetos se ven más grandes al final). Solo mirar un frame no confirma la animación.Neural (ej. es-US-AlonsoNeural), no es-US-Alonso.rate y pitch requieren signo: '+0%', '-8Hz'. '0%' falla con ValueError.rate='-15%' alarga la duración (~22s un guion de 220 chars); para un teaser corto usar rate='+0%' y acortar el guion.references/kit72h-teaser-madmax.md).#f59e0b-ish) — respetado en la estética Mad Max.es-ES-AlvaroNeural; para spots/promos cinematográficos David está abierto a una voz más grave (elegida por f0), como es-US-AlonsoNeural.references/kit72h-teaser-madmax.md — receta completa del teaser Mad Max de kit72h: esqueleto draw(t), render.js, ffmpeg, análisis de f0 para elegir voz, y los ajustes de la escena.