Saltar al contenido
Docs

Modelos, texturas y sonidos

La versión 1.2 del contrato: modelos 3D en .glb, texturas de imagen y sonidos grabados en un juego, cómo se usan desde la escena y desde el script, sus límites y los créditos.

Corresponde aFormato 1, API 1.2 Para quien escribe código

En esta página

Desde la versión 1.2 del contrato un juego puede traer modelos 3D con malla, materiales, texturas, esqueleto y clips de animación, texturas de imagen para las piezas y sonidos grabados. Todo es aditivo: un juego que no los usa sigue igual.

Dónde va cada archivo#

Dentro de la carpeta del juego
modelos/<id>.glb         el modelo
modelos/<id>.json        opcional: cómo choca
texturas/<id>.png        imágenes sueltas (png, jpg o webp)
sonidos/<id>.wav         sonidos grabados (wav o mp3)
creditos.json            autor, licencia y origen de cada uno

El <id> lleva minúsculas, números y guiones, hasta 48 caracteres, como las láminas: robot-azul. greengames empaquetar lleva todo al .ggx.

El formato de un modelo#

El único formato que entra a un juego es un .glb (glTF 2.0 binario) que cumple un subconjunto estricto. Lo escriben el taller y el importador, y lo revisa greengames validar.

  • Todo va dentro del archivo: un solo buffer, sin uri, con las imágenes incrustadas. Nada apunta afuera.
  • Y es arriba y el frente mira hacia +Z. Una unidad del archivo es una unidad del mundo: el avatar mide 0,8 de ancho y 1,8 de alto.
  • Se acepta: hasta 256 nodos, 32 primitivas de triángulos y 16 materiales; hasta 8 imágenes PNG, JPEG o WebP de hasta 1024 píxeles por lado; hasta 4 esqueletos de 64 huesos; hasta 32 clips de hasta 30 segundos, con nombre de minúsculas, números y guiones.
  • Extensiones: solo KHR_materials_unlit, KHR_materials_emissive_strength, KHR_mesh_quantization y EXT_texture_webp.
  • Se rechaza: cámaras, objetivos de deformación, accesores dispersos, la clave extras y cualquier otra extensión, también la compresión de mallas. No hay código en un modelo.
  • Tamaño: hasta 2 MB por archivo y 20 000 triángulos por modelo.

Los códigos GB700 a GB715 del validador dicen qué falla y cómo resolverlo.

Un modelo en la escena#

escenas/principal.json (una pieza)
{ "id": "guardia", "forma": "modelo", "modelo": "robot", "animacion": "caminar",
  "posicion": [4, 0.9, 0], "rotacion": [0, 90, 0], "tamano": [1.1, 1.8, 0.6], "material": "blanco" }
  • modelo es el id del archivo modelos/<id>.glb.
  • tamano es la caja que ocupa: el modelo se estira para llenarla, y posicion es el centro de esa caja, como en toda pieza. Para no calcular el tamaño natural, crea la pieza desde el script con mundo.crearModelo.
  • animacion es el clip que se reproduce en bucle desde el principio. Sin ella, el modelo queda en reposo.
  • material se exige como en toda pieza, pero no se dibuja: el modelo trae sus materiales. opacidad y visible sí se aplican.
  • fisica, solida, movimiento, grupo, etiquetas y los eventos de toque funcionan como en cualquier pieza.

Cómo choca#

Nunca contra los triángulos. Cada modelo choca como su caja (por defecto), como una cápsula de pie, como una envolvente convexa de 4 a 32 puntos o no choca, según modelos/<id>.json:

modelos/robot.json
{ "colision": { "tipo": "capsula" } }

Los tipos son caja, capsula, envolvente (con puntos: x, y, z seguidos, dentro de la caja del modelo) y ninguna.

La animación no cambia el juego#

La animación es solo dibujo: no mueve la pieza ni cambia cómo choca. Lo único de un clip que la lógica puede usar es su fin, pieza.alTerminarClip, y ese momento sale de la duración del clip y del reloj de la partida: es el mismo cuadro en todos los equipos. Por eso un juego con modelos sigue siendo determinista.

Personajes con modelo#

El jugador y los actores pueden dibujarse con un modelo:

  • En la escena: "avatar": { "modelo": "robot" }.
  • En un actor: apariencia: { modelo: 'robot' }.
  • Desde el script: jugador.apariencia = { modelo: 'robot' }.

El modelo se dibuja a la altura del avatar (1,8), con los pies en el suelo, y usa solo sus clips quieto, caminar, saltar y caer; el que falte se reemplaza por el más parecido. La colisión del personaje no cambia: sigue siendo la del avatar.

Desde el script#

ts
const robot = mundo.crearModelo('robot', { id: 'r1', posicion: [0, 0.9, 5], escala: 1 });   // pieza a tamaño natural
robot.clips;                                    // ['quieto', 'caminar', 'saludar']
robot.reproducir('saludar', { repetir: false, mezcla: 0.2, velocidad: 1 });   // desde el principio
robot.alTerminarClip((clip) => robot.reproducir('quieto'));                    // solo clips que no se repiten
robot.animacion;                                // 'saludar' (null en reposo); asignarla reproduce en bucle
robot.pararAnimacion(0.3);                      // vuelve al reposo mezclando 0,3 s
mundo.modelo('robot');                          // { id, tamano, clips: [{ nombre, duracion }], triangulos }
mundo.modelos();                                // ids de los modelos del juego

Las firmas están en la referencia: mundo y sonido.

Texturas#

Una imagen de texturas/ (PNG, JPEG o WebP, de hasta 1024 píxeles por lado y 1 MB) se usa de dos maneras:

  • En el material de una pieza, repetida: "material": { "color": "blanco", "textura": "ladrillo", "repetir": [2, 2] }.
  • Como imagen plana, con su transparencia: { "forma": "lamina", "textura": "cartel", "tamano": [2, 1, 0.2] }. Admite espejo y mirarCamara, como una lámina.

Las texturas de un modelo van dentro de su .glb. El terreno de cubos no usa texturas: sus bloques llevan colores planos.

Sonidos grabados#

sonido.muestra('campana', { volumen: 0.8, tono: 1.2, para: jugador }) reproduce sonidos/campana.wav (o .mp3). Un sonido pesa hasta 1 MB y cuenta para el límite de sonidos por segundo, como los sintetizados.

Créditos#

creditos.json es una lista con una entrada por modelo, textura o sonido:

creditos.json
[{ "recurso": "modelos/robot", "titulo": "robot.glb", "autor": "Ana", "licencia": "CC-BY-4.0",
   "origen": "Kit de plataformas", "cambios": "Convertido al formato del juego." }]

autor y licencia son obligatorios. Lo que hiciste tú se anota con "licencia": "propia". El validador avisa (GB742) de los recursos sin crédito. Los créditos viajan dentro del .ggx; el juego todavía no los muestra en pantalla.

Límites#

QuéHasta
Modelos por juego, y peso de un .glb64, de 2 MB
Triángulos por modelo y por escena (sumando cada pieza con modelo)20 000 y 150 000
Piezas con forma modelo vivas a la vez300
Texturas sueltas por juego64, de 1 MB y 1024 píxeles por lado
Sonidos grabados por juego32, de 1 MB
Modelos, texturas y sonidos de un juego, en total12 MB
Archivo .ggx y paquete descomprimido5 MB y 20 MB, como siempre

Los binarios viajan en base64 dentro del .ggx: ocupan un tercio más. Todos los límites están en Límites vigentes.

Desde la terminal#

greengames importar convierte archivos de otras herramientas a este formato:

sh
greengames importar heroe.fbx --juego games/mi-juego --alto 1.8 --colision capsula --autor "Ana" --licencia CC-BY-4.0

Las opciones están en Herramienta de línea de comandos.

Sigue con#