Saltar al contenido
megapromotingVamos a hablar

Experticia · Juegos y simulaciones

Juegos, simulaciones y experiencias interactivas que se abren desde un enlace, construidos sobre Three.js encima de WebGL.

Construimos experiencias interactivas en el navegador: reglas que se aplican, un estado que cambia y un motivo para que la persona dé un paso más. Cinco proyectos construidos sobre la misma pila, cuatro de ellos abiertos públicamente ahora mismo.

Ya construidoCinci implementări proprii pe aceeași stivă, dintre care patru se pot deschide de oricine fără să ne întrebe pe noi: humanoid-sim.megapromoting.com, vision.megapromoting.com, www.megapromoting.com/satelit/ și relieva.vercel.app — toate 200 la verificarea din 06.09.2026. Three.js apare în 17 fișiere sursă scrise de noi, în cinci depozite. Rezerva care schimbă jumătate din pagină: Unity și Unreal NU apar nicăieri în codul nostru — nici într-un fișier, nici într-un proiect, nici măcar ca aplicație instalată. Partea aceea rămâne ofertă cu condiții și e scrisă ca atare, nu ca realizare.

Construimos juegos, simulaciones y experiencias interactivas que se abren desde un enlace. Sin instalación, sin tienda, sin plugin: el motor es Three.js sobre WebGL, y el público entra pulsando una dirección. Esa es la pila que podemos mostrar — cinco proyectos construidos, cuatro de ellos públicos, todos abiertos por cualquiera que quiera verificarlos.

Un juego no es una página bonita. Son reglas que se aplican, un estado que cambia y un motivo para que la persona dé un paso más. En nuestro juego de investigación, el motivo es un reloj de 72 horas: una réplica te cuesta 10 minutos, un desplazamiento por la ciudad 30, y a la hora de cierre el dossier se cierra contigo o sin ti. En la simulación de robots, el motivo es la curiosidad: el mismo robot, el mismo salto, otra gravedad.

La parte que tomamos más en serio de lo habitual es la procedencia. En una simulación, la mentira más fácil es dejar que una animación bonita pase por física demostrada. En la simulación de robots, las 15 acciones de la interfaz están marcadas en el código como `cinematic`, el panel de evidencias de la aplicación declara `actionValidation: "none"`, y la puerta de lanzamiento del proyecto responde hoy «Release qualification: blocked». Preferimos publicar la puerta que rechaza antes que una afirmación que no podemos sostener.

Sobre Unity y Unreal decimos las cosas de frente: los tomamos por encargo, pero no tenemos ningún proyecto entregado en ellos. Lo que sigue después de esta frase — las condiciones, los riesgos y cómo empezamos — está escrito abajo, no escondido en una nota al pie.

Qué incluye

El trabajo, por componentes

Primero la regla, luego la gráfica

Un prototipo sin ninguna textura, pero con la regla correcta, dice más que una escena bonita sin apuesta. En el juego de investigación, la regla significa cinco personajes, ocho indicios de los cuales tres son prueba fuerte, cuatro motivos, cuatro finales y un reloj de 72 horas en el que cada réplica recorta 10 minutos, y un desplazamiento 30. Las horas 00:00–07:00 se omiten automáticamente, para que el reloj no se consuma mientras duermes.

La escena en el navegador, en Three.js

La misma biblioteca en cinco repositorios: Three.js 0.184–0.185, a veces a través de `@react-three/fiber` y `@react-three/drei`, otras veces escrita directamente. Dos proyectos usan la variante React; otros dos escriben Three.js puro, hasta el nivel en que gestionamos manualmente los atributos del buffer. El motor propio más grande tiene 1.824 líneas y dibuja todos los satélites como un solo objeto `THREE.Points`, con atributos de posición, color, tamaño y transparencia actualizados in situ, fotograma a fotograma.

Renderizado que baja solo en dispositivos débiles

El shader de este sitio tiene tres niveles: `low` con 24 iteraciones de raymarching y ratio de píxeles 0,5, `medium` con 40 y 0,65, `high` con 80, precisión `highp` y ratio limitado a 2. La elección es automática: en móvil baja a `low`, y cualquier dispositivo con 4 núcleos o menos degrada `high` a `medium`. Si falta WebGL, el componente se apaga limpiamente en lugar de lanzar un error. La misma disciplina en los demás proyectos: límite 1,6 en la escena de ciudad y 1,75 en la de terreno, 1,5 en móvil en el demostrador de mundo, con el bucle de renderizado detenido cuando el canvas sale de la pantalla.

Grandes escenas que siguen siendo un solo dibujo

Una ciudad con 9.506 edificios no significa 9.506 objetos. Cada huella de OpenStreetMap se convierte en una `ExtrudeGeometry` sin bisel y con `curveSegments: 1`, recibe el color escrito directamente en los vértices, se le borra el atributo `uv` — y luego todo se fusiona en una sola geometría mediante `mergeGeometries`. Los anillos geométricos degenerados de los datos públicos se saltan con `try`/`catch`, no se dejan derribar la página.

Personajes que mienten, recuerdan y ceden en condiciones

La verdad del caso no está en la página. Los expedientes de los cinco personajes —biografía, secreto, la condición en la que se rompe— están en un archivo que comienza con `import "server-only"` y no puede importarse desde el cliente. El personaje señala un indicio desbloqueado mediante una etiqueta que el jugador no ve, y el servidor lo acepta solo si ese personaje tiene derecho a dar ese indicio. Un modelo que inventa un indicio que no le pertenece se ignora, no se cree.

El idioma como mecánica, no como traducción

Un personaje responde breve y a la defensiva en rumano, pero en ruso se vuelve hablador y peligrosamente sincero — la regla está escrita en su expediente, y la primera réplica en ruso le aumenta la confianza. El micrófono sigue el mismo idioma (`ru-RU` o `ro-RO`). Donde la localización es clásica, vamos más lejos: la simulación de robots tiene ocho idiomas, con el árabe marcado explícitamente como escritura de derecha a izquierda.

Simulación con fórmulas, no con impresiones

La altura del salto escala con la relación de las gravitaciones, el período de marcha con 2π√(L/g), el número de Froude con v²/(g·L), y la resistencia del aire con la densidad atmosférica del planeta. La autonomía de la batería pasa por una función de disminución según la temperatura con cuatro umbrales: por encima de 20 °C sin modificar, por encima de 0 °C `0,85 + 0,0075·T`, por encima de −20 °C `0,55 + 0,015·T`, por encima de −40 °C `0,12 + 0,02·T`, y por debajo de eso 5 %. La marcha es cinemática inversa con dos segmentos, resuelta mediante la ley de cosenos, con factor de apoyo 0,6 por ciclo.

Sonido y voz construidos, no descargados

La atmósfera del juego de investigación no tiene ningún archivo de audio: la lluvia es ruido rosa filtrado pasa-bajo a 1.400 Hz y pasa-alto a 300 Hz, en bucle; el crepitar de vinilo son impulsos cortos generados cada 180 ms; el trueno es una explosión de ruido con decaimiento exponencial, programada entre 18–48 segundos. La lluvia visual es un canvas 2D aparte, hasta 180 gotas inclinadas. La voz va en ambos sentidos: dictado mediante la interfaz de reconocimiento del navegador y réplicas sintetizadas por personaje mediante ElevenLabs `eleven_multilingual_v2`, MP3 44,1 kHz / 128 kbps.

Formato de modelo 3D para el que no existe cargador listo

Los robots Unitree G1 y Go2 vienen en MJCF, el formato de MuJoCo, que no tiene un cargador estándar para Three.js. Lo escribimos: 170 líneas que leen el XML, reconstruyen la jerarquía de cuerpos, extraen cada articulación con su eje y su intervalo, y cargan la geometría mediante `STLLoader` y `OBJLoader`. En la escena entran 67 archivos de mesh, 62 MB — 29 articulaciones accionadas en el humanoide, 12 en el cuadrúpedo, contadas en el bloque `<actuator>` de cada modelo.

Qué aspecto tiene

El recorrido, paso a paso.

01

La regla en papel, antes de cualquier píxel

Escribimos qué gana el jugador, qué pierde, cuánto le cuesta una acción y cuándo termina. Entregamos el documento de reglas y la lista de estados — no un moodboard. Si la regla no se sostiene al leerla, tampoco se sostiene dibujada.

02

Prototipo jugable sin claves y sin costes

El juego de investigación se recorre por completo y sin ninguna clave de API: la ruta cae en un conjunto de réplicas guionizadas de 237 líneas, y las voces pasan a ser las del navegador. Así se puede ver el juego de principio a fin antes de pagar por el primer token. La misma lógica la aplicamos en cualquier proyecto: el modo demostrativo es un requisito de entrega, no un consuelo.

03

El presupuesto de renderizado, fijado antes del contenido

Definimos desde el principio el objetivo: qué dispositivo debe funcionar de forma aceptable, cuál es el tope de relación de píxeles, cuántos niveles de calidad hay y cuándo se detiene el bucle. Después el contenido se ajusta a ese presupuesto. Es el orden inverso al habitual, y es la razón por la que nuestras escenas no se caen en el teléfono.

04

Lo que se demuestra se etiqueta, lo que no — igual

Cada valor mostrado recibe un estado: medido, deducido de fuentes o simulado. El terreno en la simulación de robots lleva en escena la marca `visual_only`, para que nadie lo confunda con una superficie de colisión. Entregamos la etiqueta junto con el valor; es trabajo extra en la construcción y lo único que mantiene la página honesta después de que nos vayamos.

05

Entrega con todo y lo que falta

Al final entregamos el código, los activos con sus licencias y la lista escrita de lo que no está listo. La simulación de robots se publica como un build estático servido por Nginx y no tiene pipeline automático de publicación — está escrito en su propio README, no en una nota interna. Preferimos que la lista de faltantes salga de nosotros.

1Regula scrisă pehârtie2scena în browser peThree.js3treapta de randarecare coboară singurăpe dispozitiv slabAceeași ordine în toate cele cinci proiecte.
El recorrido, en 3 pasos

Los datos

Qué tocamos, dónde están y cuánto se quedan

Las preguntas que hace cualquiera que tenga un delegado de protección de datos — hechas aquí antes de que las haga él.

Qué sale del navegador y qué no
En el juego de investigación, el guardado está en `localStorage` bajo la clave `dosarul14-save-v1` y no se va a ninguna parte. Al servidor solo va la conversación, recortada a los últimos 20 mensajes, con un máximo de 600 caracteres por mensaje. Las claves del modelo y de la voz están exclusivamente en el servidor, en las rutas de API; la página pública nunca las ve. En el demostrador de mundo, el comando de voz lo reconoce el navegador — el audio no se envía a ninguna parte.
De dónde vienen los datos y los modelos
Los robots G1 y Go2 se derivan de Google DeepMind MuJoCo Menagerie y conservan la licencia BSD-3-Clause, con el aviso incluido junto al modelo. La ciudad de la escena urbana es OpenStreetMap sobre Copernicus DEM GLO-30, con la fecha del instantáneo escrita en el archivo de datos (2026-07-02). Las fotografías a nivel de calle llevan cada una su autor, licencia y página de origen. El coche del demostrador de mundo y todo el decorado de la simulación de robots se generan a partir de primitivas — no son activos comprados.
Proveniencia mostrada, no solo respetada
La escena urbana tiene un modo que recolorea la ciudad para mostrar qué edificios tienen la altura declarada en OpenStreetMap y cuáles se deducen del número de plantas — 1.128 declaradas frente a 8.378 estimadas, es decir, 11,9 %. La exageración vertical ×3 está escrita en la leyenda, junto al intervalo real del terreno, 37,7–155,9 m. El demostrador de mundo etiqueta cada cambio en la escena con una de cuatro fuentes, y la capa creativa se muestra literalmente como „simulado”.
Qué significa «validado» para nosotros
En la simulación de robots, una acción solo se convierte en validada después de un escenario versionado, una ejecución de física autoritaria, validación independiente, tolerancias declaradas y un artefacto reproducible. Hoy ninguna cumple las cinco, así que las 15 están marcadas `cinematic` y la interfaz lo dice. Los informes de MuJoCo existen y están versionados: la caída pasiva del humanoide en la Tierra se ejecuta con MuJoCo 3.10.0 y paso de tiempo de 1 ms, sobre un modelo con 31 cuerpos, 72 geometrías, 30 articulaciones y masa total de 33,341142 kg, con la huella `sha256` del archivo. La verificación de la aceleración en caída libre pasa a −9,806650 m/s² con tolerancia 0,049033.
La puerta que dice «no»
Ejecutado el 06.09.2026, el verificador de pruebas del proyecto responde: determinismo — pasado; física — pasado; tope de articulación calibrado — falso; calificación para lanzamiento — bloqueada. El motivo está escrito: la respuesta de 5 ms del tope no está calibrada en hardware real. La puerta sigue roja hasta que lo esté.

Un caso

Una simulación de entrenamiento que se niega a mentir

La situación

Un equipo quiere mostrar en presentaciones cómo se comporta un robot en la Luna frente a la Tierra, sin que el público técnico de la sala pueda decir «esto es solo una animación».

Qué construimos

El modelo del robot se carga desde su formato real — MJCF, mediante el cargador escrito por nosotros, con cada articulación y su rango; en el humanoide entran 29 articulaciones accionadas. La marcha es cinemática inversa de dos segmentos, con factor de apoyo 0,6. La gravedad cambia los valores de las fórmulas, no la velocidad de una animación: la altura del salto se escala con la relación de las gravedades, el período del paso con 2π√(L/g), la autonomía de la batería pasa por la reducción por temperatura con cuatro umbrales. El terreno se genera de forma determinista a partir de la semilla del planeta — 80 m de lado, amplitud 0,18 m en la Tierra y 0,58 m en la Luna — y lleva en la escena la marca `visual_only`, para que nadie lo tome por una superficie de colisión. Separada del navegador corre una validación numérica en MuJoCo, con un paso de 1 ms, que escribe su resultado en un informe JSON versionado, con la huella del modelo.

Qué salió

La escena se abre desde un enlace, en ocho idiomas, incluso con escritura de derecha a izquierda. Cada acción de la interfaz está etiquetada con honestidad — hoy, todas como vista previa cinemática — y un panel desplegable muestra exactamente qué se validó numéricamente y qué no. Cuando alguien en la sala pregunta «¿está demostrado?», la respuesta está en pantalla, no en el discurso.

Qué no dice el caso

Supone un modelo del robot en un formato abierto, con su licencia verificada; una lista escrita de los valores que deben mostrarse; y el acuerdo de que los valores no validados sigan marcados como tales, incluso en las presentaciones de ventas. Sin el tercer punto, el proyecto no es este.

Preguntas

Lo que nos pregunta la gente antes de llamar

¿Sobre qué motor construyen y por qué precisamente sobre él?

Three.js sobre WebGL, en el navegador. El motivo es práctico: el entregable es un enlace. No hay instalación, no hay tienda, no hay proceso de revisión, y una corrección llega a todos en el momento de la publicación. Lo usamos en cinco repositorios — las versiones 0.184 y 0.185 — a veces mediante `@react-three/fiber` y `@react-three/drei`, otras veces escrito directamente, hasta el nivel en que gestionamos manualmente los atributos del buffer. Cuatro de los proyectos son públicos ahora mismo, así que la afirmación puede verificarse sin preguntarnos a nosotros.

¿Pueden hacerlo en Unity o Unreal?

Los tomamos por encargo, pero la respuesta honesta empieza de otra manera: no tenemos ningún proyecto entregado en Unity o Unreal. Hemos buscado en todo el código de la máquina de trabajo — ninguna referencia a `UnityEngine`, ningún archivo `.uproject`, ningún `.csproj`, ninguna macro de Unreal. Los motores ni siquiera están instalados. Qué cambia en la práctica si eliges uno de ellos: el entregable deja de ser una dirección web y pasa a ser un build por plataforma; la distribución pasa por tienda o instalador; y los términos de licencia son los publicados por Unity, respectivamente Epic, en la fecha del proyecto, y los verificamos entonces, no los suponemos. Cómo procedemos: empezamos con un prototipo de pago y, si el proyecto exige experiencia de motor que no tenemos internamente, lo decimos antes del contrato.

¿Funciona en el teléfono?

Sí, y es una decisión tomada en la construcción, no una esperanza. El shader de este sitio tiene tres niveles de calidad — 24, 40 y 80 iteraciones — y baja solo: en móvil arranca en el más ligero, y en cualquier dispositivo con 4 núcleos o menos el nivel máximo pasa a ser el intermedio. El ratio de píxeles está limitado en todas partes: 0,5 en el nivel bajo aquí, 1,5 en móvil en el demostrador de mundo, 1,6 y 1,75 en las dos escenas del mapa urbano. Cuando el canvas sale de la pantalla, el bucle se detiene. Lo que no te puedo dar: una cifra de fotogramas por segundo en un teléfono concreto — no tenemos una medición así publicable, así que no inventamos una.

¿El juego se abre en el navegador o se instala?

Todo lo que hemos construido hasta ahora se abre en el navegador. Tres de los proyectos son builds estáticos servidos por Nginx desde nuestro servidor; uno está en Vercel. Un juego instalable — escritorio, teléfono o consola — es una conversación distinta: supone cuenta de desarrollador, proceso de revisión, clasificación por edad y, muy probablemente, otro motor. Ninguno de nuestros proyectos se distribuye por una tienda, así que ese sería un camino nuevo, con sus propios pasos.

¿Quién posee el código y los activos al final?

El código escrito para tu proyecto te pertenece, y los términos se escriben en el contrato antes de que empiece el trabajo. Para los activos, la distinción importa: los generados a partir de primitivas o de datos públicos vienen sin restricciones adicionales — la máquina del demostrador de mundo está construida con cajas, cápsulas y cilindros, la ciudad de la escena urbana es OpenStreetMap sobre Copernicus DEM. Los importados conservan su licencia: los robots Unitree son BSD-3-Clause de MuJoCo Menagerie, con la notificación junto al modelo. En un proyecto con gráficos creados por encargo, la fuente y la propiedad de cada activo se establecen en lista, activo por activo.

¿Qué pasa con el multijugador?

Esta es la reserva más honesta que tenemos. Ninguno de los cinco proyectos tiene estado compartido entre jugadores: el juego de investigación guarda todo en `localStorage`, la simulación de robots guarda el estado en la memoria de la página. Un juego con varias personas al mismo tiempo necesita un servidor autoritativo de estado, sincronización y tratamiento del lag de red: piezas nuevas, no una opción que se marque. Se puede construir, pero entra en el proyecto como subsistema separado, con su propio trabajo, no como opción.

¿Cuánto falta para ver algo jugable?

No te doy una cifra que no pueda sostener. Te doy el orden: la primera entrega es un prototipo jugable con la regla correcta y la gráfica mínima, y debe funcionar sin ninguna clave de API —como nuestro juego de investigación se recorre íntegramente con réplicas scriptadas. Solo después de que la regla se sostenga, se añade la gráfica, la voz y el modelo. Si un proveedor te promete el plazo antes de ver la regla, promete algo que no ha medido.

¿Cuánto consume mantener a los personajes “vivos”, es decir, en el modelo?

El consumo lo controlas mediante los límites escritos en el código, no por esperanza. En el juego de investigación: el historial enviado al modelo se corta a los últimos 20 mensajes, el mensaje del jugador a 600 caracteres, la respuesta a 400 tokens, y el tiempo máximo de espera es de 45 segundos. La síntesis de voz corta el texto a 900 caracteres. Cada uno de estos umbrales es una línea que podemos mover juntos, con efecto directo en la factura. Y sigue existiendo el modo sin claves, en el que el juego funciona con réplicas scriptadas y no consume nada.

¿Qué no hacéis?

No sostenemos que una animación sea una demostración física. En la simulación de robots, las 15 acciones están marcadas en el código como `cinematic`, el panel de evidencias declara `actionValidation: "none"`, y el verificador de lanzamiento responde hoy “Release qualification: blocked”, porque la respuesta de 5 ms del tope de articulación no está calibrada en hardware real. No entregamos multiplayer como opción oculta. No nos presentamos como estudio de Unity o Unreal. Y no ponemos un demo en la oferta sin decir si es público —nuestro juego de investigación, por ejemplo, solo funciona localmente y no tiene dirección.

En qué se basan las afirmaciones anteriores (25 fuentes)
  1. Cele patru demonstratoare publice răspund 200: humanoid-sim.megapromoting.com (974 B), vision.megapromoting.com (619 B), www.megapromoting.com/satelit/ (1.160 B), relieva.vercel.app (680.122 B)https://humanoid-sim.megapromoting.com/ · https://vision.megapromoting.com/ · https://www.megapromoting.com/satelit/ · https://relieva.vercel.app/ · 2026-09-06

24 de ellas son código y archivos de nuestros repositorios. No publicamos su nombre ni la línea: juntos, en una sola página, describirían con demasiada precisión cómo están construidos sistemas que no son solo nuestros. Los repasamos contigo, en el repositorio, a petición — la verificación sigue siendo posible, solo que se hace en una conversación.

¿Qué te gustaría que funcionara mejor?

Cuéntanos tu proceso. Juntos decidimos qué merece la pena construir, qué podemos conectar y cómo verificamos el resultado.

Vamos a hablar