ソース情報
- リポジトリ
- 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コマンドは1行のまま表示されます。コピー前に横へスクロールして全体を確認してください。
ローカルで確認しますか?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.