Întâi regula, apoi grafica
Un prototip fără nicio textură, dar cu regula corectă, spune mai mult decât o scenă frumoasă fără miză. În jocul de investigație regula înseamnă cinci personaje, opt indicii din care trei sunt probă tare, patru motive, patru finaluri și un ceas de 72 de ore în care fiecare replică taie 10 minute, iar o deplasare 30. Orele 00:00–07:00 se sar automat, ca ceasul să nu se consume în somn.
Scena în browser, pe Three.js
Aceeași bibliotecă în cinci depozite: Three.js 0.184–0.185, uneori prin `@react-three/fiber` și `@react-three/drei`, alteori scrisă direct. Două proiecte folosesc varianta React; alte două scriu Three.js pur, până la nivelul la care gestionăm manual atributele de buffer. Cel mai mare motor propriu are 1.824 de linii și desenează toți sateliții ca un singur obiect `THREE.Points`, cu atribute de poziție, culoare, mărime și transparență actualizate în loc, cadru cu cadru.
Randare care coboară singură pe dispozitive slabe
Shaderul de pe acest site are trei trepte: `low` cu 24 de iterații de raymarching și raport de pixeli 0,5, `medium` cu 40 și 0,65, `high` cu 80, precizie `highp` și raport plafonat la 2. Alegerea e automată: pe mobil coboară la `low`, iar orice dispozitiv cu 4 nuclee sau mai puține îl retrogradează pe `high` la `medium`. Dacă WebGL lipsește, componenta se stinge curat în loc să arunce eroare. Aceeași disciplină în celelalte proiecte: plafon 1,6 în scena de oraș și 1,75 în cea de teren, 1,5 pe mobil în demonstratorul de lume, cu bucla de randare oprită când canvasul iese din ecran.
Scene mari care rămân un singur desen
Un oraș cu 9.506 clădiri nu înseamnă 9.506 obiecte. Fiecare amprentă din OpenStreetMap devine o `ExtrudeGeometry` fără teșitură și cu `curveSegments: 1`, primește culoarea scrisă direct în vârfuri, i se șterge atributul `uv` — și apoi toate se contopesc într-o singură geometrie prin `mergeGeometries`. Inelele geometrice degenerate din datele publice sunt sărite cu `try`/`catch`, nu lăsate să dărâme pagina.
Personaje care mint, își amintesc și cedează în condiții
Adevărul cazului nu stă în pagină. Dosarele celor cinci personaje — biografie, secret, condiția în care se rupe — stau într-un fișier care începe cu `import "server-only"` și nu poate fi importat din client. Personajul semnalează un indiciu deblocat printr-un tag pe care jucătorul nu-l vede, iar serverul îl acceptă doar dacă acel personaj are dreptul să dea acel indiciu. Un model care inventează un indiciu care nu-i aparține e ignorat, nu crezut.
Limba ca mecanică, nu ca traducere
Un personaj răspunde scurt și defensiv în română, dar în rusă devine vorbăreț și periculos de sincer — regula e scrisă în dosarul lui, iar prima replică în rusă îi crește încrederea. Microfonul urmează aceeași limbă (`ru-RU` sau `ro-RO`). Unde localizarea e clasică, mergem departe: simularea de roboți are opt limbi, cu araba marcată explicit ca scriere de la dreapta la stânga.
Simulare cu formule, nu cu impresii
Înălțimea săriturii scalează cu raportul gravitațiilor, perioada de mers cu 2π√(L/g), numărul Froude cu v²/(g·L), iar rezistența aerului cu densitatea atmosferei planetei. Autonomia bateriei trece printr-o funcție de scădere pe temperatură cu patru praguri: peste 20 °C nemodificată, peste 0 °C `0,85 + 0,0075·T`, peste −20 °C `0,55 + 0,015·T`, peste −40 °C `0,12 + 0,02·T`, iar sub asta 5 %. Mersul e cinematică inversă cu două segmente, rezolvată prin legea cosinusului, cu factor de sprijin 0,6 pe ciclu.
Sunet și voce construite, nu descărcate
Atmosfera jocului de investigație nu are niciun fișier audio: ploaia e zgomot roz filtrat trece-jos la 1.400 Hz și trece-sus la 300 Hz, buclat; pârâitul de vinil sunt impulsuri scurte generate la fiecare 180 ms; tunetul e o explozie de zgomot cu descreștere exponențială, programată la 18–48 de secunde. Ploaia vizuală e canvas 2D separat, până la 180 de picături înclinate. Vocea merge în ambele sensuri: dictare prin interfața de recunoaștere a browserului și replici sintetizate per personaj prin ElevenLabs `eleven_multilingual_v2`, MP3 44,1 kHz / 128 kbps.
Format de model 3D pentru care nu există încărcător gata făcut
Roboții Unitree G1 și Go2 vin în MJCF, formatul MuJoCo, care nu are un încărcător standard pentru Three.js. L-am scris: 170 de linii care citesc XML-ul, reconstruiesc ierarhia de corpuri, extrag fiecare articulație cu axa și intervalul ei, și încarcă geometria prin `STLLoader` și `OBJLoader`. În scenă intră 67 de fișiere de mesh, 62 MB — 29 de articulații acționate la humanoid, 12 la patruped, numărate în blocul `<actuator>` al fiecărui model.