crearSapo()

función · three.js · sin escena ni cámara

crearSapo()

Una única función que construye un sapo completo —cuerpo regordete, ojos saltones con párpado, saco gular, verrugas del lomo y cuatro patas— usando solo primitivas de Three.js. Devuelve un THREE.Group listo para scene.add(). La función viaja sola: la escena, la cámara y la luz que ves aquí son solo de la demo.

Leer el código
Devuelve
1 Group
Primitivas
≈ 60
Líneas
—
demo en vivo · la función no trae escena

el código

Una función. Un sapo. Nada más.

crearSapo.js — exactamente lo que se copia listo para pegar
// cargando…

cómo usarla

Pegar, llamar y a la escena.

tu-proyecto.js — tu propia escena
import * as THREE from 'three';

const sapo = crearSapo();      // ← devuelve un THREE.Group
sapo.position.y = 0;
escena.add(sapo);              // tu escena, tu cámara, tus controles

// Ganchos de animación incluidos en el modelo:
sapo.userData.garganta;  // escálala para croar
sapo.userData.parpados;  // escala su .y para parpadear
sapo.userData.cuerpo;    // respira con su escala
sapo.userData.ojos;      // rótalos para mirar alrededor

El userData del grupo expone las partes móviles para que las animes sin buscar por el grafo:

  • sapo.userData.cuerpo

    El cuerpo entero: pulsa su escala para respirar.

  • sapo.userData.garganta

    Saco gular: inflándolo y desinflándolo croa.

  • sapo.userData.ojos

    Dos grupos: rótalos y el sapo mira a donde quieras.

  • sapo.userData.parpados

    Sube su escala en Y un instante: parpadeo.

  • sapo.userData.boca

    El tubo de la sonrisa, por si quieres abrir la boca.

FORMATO DE SALIDA — JSON EXACTO. Devolvé los cambios de UNA de estas dos formas: OPCIÓN A (preferida si el archivo es chico, < 15 KB, o el cambio afecta mucho al archivo): contenido completo del archivo. { "files": { "ruta/relativa": "contenido COMPLETO del archivo modificado" }, "nota": "breve explicación de lo que hiciste" } OPCIÓN B (para archivos grandes o cambios localizados): reemplazos exactos find/replace. { "edits": [ { "file": "ruta/relativa", "find": "texto EXACTO tal como está en el archivo actual", "replace": "texto nuevo que lo reemplaza", "all": false } ], "nota": "..." } REGLAS PARA LOS EDITS: - "find" debe ser un substring EXACTO del archivo actual (respetando espacios y mayúsculas). Si aparece varias veces y querés reemplazar todas, poné "all": true; si no, debe aparecer UNA sola vez. - Si un "find" no matchea, el cambio falla: preferí anchors largos y únicos (líneas completas con contexto). - Podés mezclar varios edits y tocar varios archivos. - Podés AGREGAR archivos nuevos con "files" (ej: un CSS nuevo) y referenciarlos desde index.html con un edit. Al terminar, la tarea debe cumplir su criterio_de_exito y el juego debe seguir funcionando. FORMATO DE SALIDA — JSON EXACTO. Devolvé los cambios de UNA de estas dos formas: OPCIÓN A (preferida si el archivo es chico, < 15 KB, o el cambio afecta mucho al archivo): contenido completo del archivo. { "files": { "ruta/relativa": "contenido COMPLETO del archivo modificado" }, "nota": "breve explicación de lo que hiciste" } OPCIÓN B (para archivos grandes o cambios localizados): reemplazos exactos find/replace. { "edits": [ { "file": "ruta/relativa", "find": "texto EXACTO tal como está en el archivo actual", "replace": "texto nuevo que lo reemplaza", "all": false } ], "nota": "..." } REGLAS PARA LOS EDITS: - "find" debe ser un substring EXACTO del archivo actual (respetando espacios y mayúsculas). Si aparece varias veces y querés reemplazar todas, poné "all": true; si no, debe aparecer UNA sola vez. - Si un "find" no matchea, el cambio falla: preferí anchors largos y únicos (líneas completas con contexto). - Podés mezclar varios edits y tocar varios archivos. - Podés AGREGAR archivos nuevos con "files" (ej: un CSS nuevo) y referenciarlos desde index.html con un edit. Al terminar, la tarea debe cumplir su criterio_de_exito y el juego debe seguir funcionando.