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.