Erst die Regel, dann die Grafik
Ein Prototyp ohne jede Textur, aber mit der richtigen Regel, sagt mehr als eine schöne Szene ohne Einsatz. Im Ermittlungs- spiel bedeutet Regel fünf Figuren, acht Hinweise, von denen drei harte Beweise sind, vier Motive, vier Enden und eine 72-Stunden-Uhr, in der jede Zeile 10 Minuten abzieht und eine Bewegung 30. Die Stunden 00:00–07:00 werden automatisch übersprungen, damit die Uhr im Schlaf nicht verbraucht wird.
Die Szene im Browser, mit Three.js
Dieselbe Bibliothek in fünf Repositories: Three.js 0.184–0.185, manchmal über `@react-three/fiber` und `@react-three/drei`, manchmal direkt geschrieben. Zwei Projekte nutzen die React-Variante; zwei andere schreiben reines Three.js, bis zu dem Punkt, an dem wir die Buffer-Attribute manuell verwalten. Die größte Eigen-Engine umfasst 1.824 Zeilen und zeichnet alle Satelliten als ein einziges `THREE.Points`-Objekt, mit Positions-, Farb-, Größen- und Transparenzattributen, die frame für frame direkt aktualisiert werden.
Rendering, das auf schwachen Geräten automatisch heruntergeht
Der Shader auf dieser Seite hat drei Stufen: `low` mit 24 Raymarching-Iterationen und Pixelverhältnis 0,5, `medium` mit 40 und 0,65, `high` mit 80, Präzision `highp` und auf 2 begrenztem Verhältnis. Die Wahl erfolgt automatisch: Auf Mobilgeräten fällt er auf `low`, und jedes Gerät mit 4 oder weniger Kernen wird von `high` auf `medium` herabgestuft. Fehlt WebGL, schaltet sich die Komponente sauber ab, statt einen Fehler auszulösen. Dieselbe Disziplin in den anderen Projekten: Limit 1,6 in der Stadt-Szene und 1,75 in der Gelände-Szene, 1,5 auf Mobilgeräten im Welt-Demonstrator, wobei die Render-Schleife gestoppt wird, wenn das Canvas aus dem Bild läuft.
Große Szenen, die ein einziger Draw bleiben
Eine Stadt mit 9.506 Gebäuden bedeutet nicht 9.506 Objekte. Jeder Footprint aus OpenStreetMap wird zu einer `ExtrudeGeometry` ohne Abschrägung und mit `curveSegments: 1`, erhält die direkt in die Vertices geschriebene Farbe, bekommt das `uv`-Attribut gelöscht — und danach werden alle mit `mergeGeometries` zu einer einzigen Geometrie verschmolzen. Degenerierte geometrische Ringe aus öffentlichen Daten werden mit `try`/`catch` übersprungen und nicht die Seite zum Einsturz bringen gelassen.
Figuren, die lügen, sich erinnern und unter Bedingungen nachgeben
Die Wahrheit des Falls liegt nicht auf der Seite. Die Dossiers der fünf Figuren — Biografie, Geheimnis, die Bedingung, unter der sie zerbricht — liegen in einer Datei, die mit `import "server-only"` beginnt und nicht vom Client importiert werden kann. Die Figur signalisiert einen freigeschalteten Hinweis über einen Tag, den der Spieler nicht sieht, und der Server akzeptiert ihn nur, wenn diese Figur das Recht hat, diesen Hinweis zu geben. Ein Modell, das einen Hinweis erfindet, der ihm nicht gehört, wird ignoriert, nicht geglaubt.
Sprache als Mechanik, nicht als Übersetzung
Eine Figur antwortet auf Rumänisch kurz und defensiv, aber auf Russisch wird sie redselig und gefährlich ehrlich — die Regel steht in ihrem Dossier, und die erste Zeile auf Russisch erhöht ihr Vertrauen. Das Mikrofon folgt derselben Sprache (`ru-RU` oder `ro-RO`). Wo Lokalisierung klassisch ist, gehen wir weiter: Die Robotersimulation hat acht Sprachen, wobei Arabisch ausdrücklich als Schrift von rechts nach links markiert ist.
Simulation mit Formeln, nicht mit Eindrücken
Die Sprunghöhe skaliert mit dem Verhältnis der Gravitationswerte, die Gehperiode mit 2π√(L/g), die Froude-Zahl mit v²/(g·L), und der Luftwiderstand mit der Atmosphärendichte des Planeten. Die Batteriereichweite läuft durch eine temperaturabhängige Abfallfunktion mit vier Schwellen: über 20 °C unverändert, über 0 °C `0,85 + 0,0075·T`, über −20 °C `0,55 + 0,015·T`, über −40 °C `0,12 + 0,02·T`, und darunter 5 %. Das Gehen ist inverse Kinematik mit zwei Segmenten, gelöst mit dem Kosinussatz, mit einem Stützfaktor von 0,6 pro Zyklus.
Ton und Stimme konstruiert, nicht heruntergeladen
Die Atmosphäre des Ermittlungs- spiels hat keine einzige Audiodatei: Regen ist rosa Rauschen, gefiltert mit Tiefpass bei 1.400 Hz und Hochpass bei 300 Hz, geloopt; das Knistern von Vinyl sind kurze Impulse, die alle 180 ms erzeugt werden; Donner ist eine Rausch-Explosion mit exponentiellem Abklingen, geplant bei 18–48 Sekunden. Der visuelle Regen ist ein separates 2D-Canvas, bis zu 180 geneigte Tropfen. Die Stimme geht in beide Richtungen: Diktat über die Spracherkennungs-Schnittstelle des Browsers und synthetisierte Zeilen pro Figur über ElevenLabs `eleven_multilingual_v2`, MP3 44,1 kHz / 128 kbps.
3D-Modellformat, für das es noch keinen fertigen Loader gibt
Die Unitree G1- und Go2-Roboter kommen im MJCF, dem MuJoCo-Format, für das es keinen Standard-Loader für Three.js gibt. Wir haben ihn geschrieben: 170 Zeilen, die XML lesen, die Hierarchie der Körper rekonstruieren, jedes Gelenk mit seiner Achse und seinem Intervall extrahieren und die Geometrie über `STLLoader` und `OBJLoader` laden. In die Szene kommen 67 Mesh-Dateien, 62 MB — 29 angetriebene Gelenke beim Humanoid, 12 beim Quadrupeden, gezählt im `<actuator>`-Block jedes Modells.