Önce kural, sonra grafik
Tekstürsüz ama doğru kuralı olan bir prototip, risksiz güzel bir sahneden daha çok şey söyler. Soruşturma oyununda kural, beş karakter, üçü sağlam delil olan sekiz ipucu, dört motiv, dört son ve her repliğin 10 dakika azalttığı, her hareketin 30 azalttığı 72 saatlik bir saat anlamına gelir. 00:00–07:00 saatleri otomatik olarak atlanır, böylece saat uykuda tüketilmez.
Browserda sahne, Three.js üzerinde
Aynı kütüphane beş depoda: Three.js 0.184–0.185, bazen `@react-three/fiber` ve `@react-three/drei` üzerinden, bazen doğrudan yazılmış. İki proje React sürümünü kullanıyor; diğer iki proje, buffer özniteliklerini elle yönettiğimiz düzeye kadar saf Three.js yazıyor. En büyük özel motor 1.824 satır ve tüm uyduları konum, renk, boyut ve şeffaflık öznitelikleri her karede yerinde güncellenen tek bir `THREE.Points` nesnesi olarak çiziyor.
Zayıf cihazlarda kendiliğinden düşen render
Bu sitedeki shader üç kademeye sahip: `low` için 24 raymarching yinelemesi ve 0,5 piksel oranı, `medium` için 40 ve 0,65, `high` için 80, `highp` hassasiyeti ve 2 ile sınırlı oran. Seçim otomatik: mobilde `low`a iner, 4 çekirdekli veya daha az çekirdeğe sahip her cihaz onu `high`tan `medium`a düşürür. WebGL yoksa bileşen hata fırlatmak yerine temizce kapanır. Diğer projelerde de aynı disiplin: şehir sahnesinde 1,6 ve arazi sahnesinde 1,75 üst sınır, dünya demonstratöründe mobilde 1,5; canvas ekrandan çıktığında render döngüsü durur.
Tek çizim olarak kalan büyük sahneler
9.506 binaya sahip bir şehir, 9.506 nesne demek değildir. OpenStreetMap’teki her ayak izi, pahsız ve `curveSegments: 1` ile bir `ExtrudeGeometry` olur, tepelerde doğrudan yazılan rengi alır, `uv` özniteliği silinir — ve sonra hepsi `mergeGeometries` ile tek bir geometriye birleştirilir. Kamu verilerindeki dejenerik geometrik halkalar `try`/`catch` ile atlanır, sayfayı yıkmalarına izin verilmez.
Yalan söyleyen, hatırlayan ve koşullarda çöken karakterler
Vakanın gerçeği sayfada durmaz. Beş karakterin dosyaları — biyografi, sır, hangi koşulda kırıldıkları — `import "server-only"` ile başlayan ve istemciden import edilemeyen bir dosyada durur. Karakter, oyuncunun görmediği bir etiketle açılmış bir ipucu bildirir ve sunucu bunu yalnızca o karakterin o ipucunu verme hakkı varsa kabul eder. Kendisine ait olmayan bir ipucu uyduran bir model yok sayılır, inanılmaz.
Çeviri değil, mekanik olarak dil
Bir karakter Rumence kısa ve savunmacı cevap verir, ama Rusçada konuşkan ve tehlikeli derecede dürüst olur — kural onun dosyasına yazılmıştır ve Rusçadaki ilk replik güvenini artırır. Mikrofon da aynı dili izler (`ru-RU` veya `ro-RO`). Yerelleştirmenin klasik olduğu yerde daha ileri gideriz: robot simülasyonu sekiz dile sahiptir, Arapça açıkça sağdan sola yazı olarak işaretlenmiştir.
İzlenimlerle değil, formüllerle simülasyon
Sıçrama yüksekliği yerçekimi oranıyla ölçeklenir, yürüme periyodu 2π√(L/g) ile, Froude sayısı v²/(g·L) ile, hava direnci ise gezegen atmosferinin yoğunluğuyla. Batarya ömrü, dört eşikli sıcaklığa bağlı bir azalma fonksiyonundan geçer: 20 °C üstünde değişmez, 0 °C üstünde `0,85 + 0,0075·T`, −20 °C üstünde `0,55 + 0,015·T`, −40 °C üstünde `0,12 + 0,02·T`, bunun altında %5. Yürüyüş, kosinüs yasasıyla çözülen iki segmentli ters kinematik olup, çevrim başına 0,6 destek faktörüyle çalışır.
İndirilen değil, kurulmuş ses ve seslendirme
Soruşturma oyununun atmosferinde hiçbir ses dosyası yok: yağmur, 1.400 Hz’de alçak geçiren ve 300 Hz’de yüksek geçiren filtreden geçirilmiş, döngüye alınmış pembe gürültüdür; plak çıtırtısı her 180 ms’de üretilen kısa darbelerdir; gök gürültüsü ise 18–48 saniyede bir zamanlanan, üstel sönümlü bir gürültü patlamasıdır. Görsel yağmur ayrı bir 2D canvas’tır, 180’e kadar eğik damla ile. Ses iki yönde çalışır: tarayıcı konuşma tanıma arayüzü üzerinden dikte ve ElevenLabs `eleven_multilingual_v2` ile karakter başına sentezlenen replikler, MP3 44,1 kHz / 128 kbps.
Hazır yükleyicisi olmayan 3D model formatı
Unitree G1 ve Go2 robotları MJCF ile gelir, Three.js için standart bir yükleyicisi olmayan MuJoCo formatı. Biz yazdık: XML’i okuyan, gövde hiyerarşisini yeniden kuran, her mafsalı ekseni ve aralığıyla çıkaran ve geometriyi `STLLoader` ve `OBJLoader` ile yükleyen 170 satır. Sahneye 67 mesh dosyası, 62 MB girer — humanoidde 29, dört ayaklıda 12 tahrikli mafsal, her modelin `<actuator>` bloğunda sayılmıştır.