Zum Inhalt springen
Entwicklungstagebuch

Die Karte, die eine dritte Dimension bekam

8 Min. Lesezeitvon Manuel

Runara zeichnet jetzt eigene Trail-Karten aus OpenStreetMap-Daten und fliegt deine Läufe durch echtes 3D-Gelände und Gebäude nach, alles auf dem iPhone gerendert. Wie eine Privacy-First-App zu ihrem eigenen Planeten kam.

Der 3D-Flyover beim Nachfliegen eines Laufs durch eine Stadt aus extrudierten 3D-Gebäuden

Das Bautagebuch war eine Weile still, die Versionsnummer nicht: Seit dem letzten Beitrag ist Runara von 1.1.1 auf 1.6 gesprungen. Dazwischen kamen die Screen-Stile, die fünf Designsprachen, die ein Watch-Screen jetzt tragen kann, und der Konfigurator wurde eine Galerie aus Live-Vorschauen. Diese Updates fühlten sich an, als würde die App mehr sie selbst. Die letzten zwei Monate waren etwas anderes. In den letzten zwei Monaten bekam die Karte eine dritte Dimension, und Runara hörte still auf, sich fremde Kartografie zu leihen.

Mein eigener Planet, offenbar

Offline-Karten gibt es in Runara seit Mai: Region am iPhone einrahmen, Kacheln exportieren, und die Watch rendert sie selbst, mitten im Nirgendwo. Die Kacheln kamen aus Apple Maps, einer guten Straßenkarte, die zufällig auch Berge enthält. Die Screens, auf die ich im Training tatsächlich starre, sind Waldtrails, und auf einer Allzweck-Karte ist ein Waldtrail ein blasser grauer Nachgedanke.

Also hat Runara jetzt eine eigene Karte. Sie heißt OSM Outdoor, ist aus OpenStreetMap-Daten gebaut und zuerst eine Trail-Karte: Wanderwege und Pfade als gestrichelte bernsteinfarbene Linien, die man im Vorbeilaufen liest, Schummerung, damit das Gelände Form hat, Landbedeckung, damit ein Wald wie ein Wald aussieht, Gipfel und Hütten beschriftet, weil das die Landmarken sind, die dort oben zählen. Der Stil ist dunkel, wie alles in dieser App, und die Volt-Routenlinie sitzt darauf, als wäre es nie anders gedacht gewesen.

Der Teil, den ich nicht erwartet hatte, als ich anfing: Wer einen Kartenstil selbst rendern will, braucht den Planeten. Es gibt jetzt einen Protomaps-Build der OpenStreetMap-Daten der ganzen Welt, dazu einen Höhendaten-Spiegel für die Schummerung, in einem Object-Storage-Bucket, den die App über schlichte HTTP-Range-Requests liest. Kein Tile-Server, keine API, kein Pro-Anfrage-Irgendwas, nur statische Dateien und Mathematik. Das iPhone holt die Vektordaten für deine eingerahmte Region, rendert die Kartografie selbst und schickt die fertigen Kacheln über dieselbe lokale Pipeline wie bisher auf die Watch. Deine Watch spricht nie mit dem Bucket. Deine Workouts sprechen weiterhin mit gar nichts.

Die Kartenquelle pro Region wählen kann, wer will, Apple Maps ist nicht verschwunden. Aber OSM Outdoor ist jetzt der Standard, und zwei Einstellungen kamen dazu, weil der echte Gebrauch sie verlangte: Die Watch rendert jede Kartenfläche jetzt standardmäßig aus deinen geladenen Paketen, statt zu streamen, wann immer zufällig Verbindung da ist, womit die Kartografie aufhört, mitten im Lauf zwischen zwei Stilen zu flackern, und der Akku aufhört, für einen Stream zu zahlen, den niemand bestellt hat. Und stammen deine alten Regionen aus der anderen Quelle, exportiert ein Tipp sie alle in deine bevorzugte Karte neu und tauscht sie auf der Watch an Ort und Stelle. Die Zoom-Stufen-Stepper im Export sind auch weg. Jeder Export deckt jetzt einfach den vollen Detailbereich ab. Niemand sollte über Zoom-Stufen nachdenken müssen, während er einen Trail-Lauf plant.

Der Flyover bekommt echtes Gelände

Der 3D-Flyover ist mein Lieblingsfeature, seit es ihn gibt: eine Verfolgerkamera fliegt deine aufgezeichnete Route, während ein Punkt das Workout nachläuft. Aber seine dritte Dimension gehörte immer jemand anderem, was auch immer die Plattform-Karte an dem Tag zeichnen wollte. Dieses Release hat ihn neu gebaut, buchstäblich vom Boden auf.

feat(flyover): OSM 3D - true SceneKit terrain engine with real buildings

Der neue Stil OSM 3D baut die Szene selbst: echte Geländemeshes aus Höhendaten, sodass Bergrücken aufsteigen, abfallen und die Route dahinter tatsächlich verdecken; die OSM-Outdoor-Kartografie als Haut aufs Gelände gebacken; und Gebäude in ihren echten OpenStreetMap-Höhen extrudiert, aus rohen Vektor-Kacheln dekodiert, Dach für Dach trianguliert. Deine Route ist ein Band, das über all das drapiert liegt, gefärbt nach Herzfrequenz, Tempo oder Anstieg, Meter für Meter enthüllt, während der Punkt vorrückt. Flieg einen Lauf durch deine Stadt, und die Häuserblöcke, zwischen denen du gelaufen bist, stehen um dich herum auf. Flieg eine Gratlinie, und der Berg ist einfach da, in der richtigen Form, weil er aus denselben Höhendaten gebaut ist, die die Schummerung liest.

Und weil es der Gelände-Engine egal ist, was ihre Haut ist, gibt es einen zweiten neuen Stil gratis dazu: Satellite 3D drapiert Satellitenbilder über dieselben Meshes und dieselben Gebäude. Gleicher Flug, gleiches Band, fotografischer Boden. Ein kleiner Schalter blendet die 3D-Gebäude mitten in der Wiedergabe sofort ein und aus, was unbedeutend klingt, bis man begreift, dass die Engine die Meshes dafür die ganze Zeit warm hält.

Alles rendert auf dem iPhone, spielt wie jeder andere Stil und exportiert durch dieselbe Video-Pipeline. Und es hatte Bugs, natürlich hatte es die. Mein Liebling aus der Fix-Runde: Das Aufwärmen jedes Laufs renderte als graue Linie, weil Herzfrequenzen unter Zone 1 durch die Farbzuordnung fielen, und der erste Kilometer jedes Laufs ist exakt der Ort, an dem die Herzfrequenz unter Zone 1 liegt. Der sichtbarste Abschnitt jedes einzelnen Flyovers, grau. Ist behoben, das Aufwärmen nimmt jetzt die kühlste Farbe der Rampe, den ehrlichen Platz für „leichter als Zone 1“.

Das Poster am Kühlschrank

Noch eine Teilen-Sache, klein und absichtlich. Das Flyover-Video endet auf einer Abschlusskarte, die Form der Route in Volt über vier Zahlen. Diese Karte kann jetzt allein stehen: Ein Teilen-Knopf auf jeder Workout-Detailseite rendert sie als Standbild-Poster, ein Tipp, kein sechzig-Sekunden-Export, gar kein Flyover nötig. Es funktioniert für die Laufband-Einheit, die keine Route zum Überfliegen hat, denn ein Workout zu teilen ist eine Eigenschaft des Workouts, nicht der Wiederholung. Es ist ein PNG in Handybildschirm-Größe, und es sieht aus wie die App: Tinte, Volt, Zahlen, Papagei.

Der kleine ehrliche Rest

Drei Dinge kamen noch, die nie eine Überschrift tragen werden, aber ändern, wie sich die App täglich anfühlt. Audio-Hinweise sind jetzt pro Sportart konfigurierbar, jede Workout-Art kann deinem globalen Setup folgen, eine komplett eigene Konfiguration tragen oder stumm bleiben, was es gibt, weil Bahnen im Pool nicht reden sollten und lange Läufe vielleicht schon. Das Trainingslast-Diagramm projiziert eine Woche über heute hinaus, ein gepunkteter „Wenn du ruhst“-Ausläufer, womit die Frage, für die das Diagramm existiert, wann bin ich wieder frisch, endlich vom Diagramm selbst beantwortet wird statt vom Schielen darauf, wohin die Kurve zu wollen scheint. Und der Tagescursor ist jetzt dauerhaft da, parkt auf heute, mit seiner Anzeige in einer richtigen Kopfzeile statt schwebend über dem Plot.

Auch die Co-Author-Zeile hat sich weiterentwickelt, für alle, die diesen Faden verfolgen: Teile dieses Releases wurden mit einem Claude-Modell gebaut, das eine Million Tokens Kontext hält, was für diese Codebasis bedeutet, dass das Modell die ganze App auf einmal im Kopf hat. Die Form der Zusammenarbeit ist unverändert gegenüber dem, was ich im Juni geschrieben habe. Es schreibt mehr vom Code als je zuvor. Zu entscheiden, dass das graue Aufwärmen ein Bug ist und keine Rendering-Entscheidung, verlangt immer noch, mit dem Ding am Handgelenk gelaufen zu sein.

Jetzt draußen

Runara 1.6 ist als kostenloses Update im App Store. Der Planeten-Bucket ist der erste Server, den dieses Projekt je hatte, also lass mich präzise sein, was er ist: statische Kartendaten, gelesen von deinem iPhone, wenn du eine Region exportierst oder neu renderst, von nichts anderem, zu keiner anderen Zeit. Kein Konto, keine Analytics, keine Workout-Daten, die deine Geräte verlassen, wie am ersten Tag. Der Berg wird auf deinem Telefon gerendert, und dort bleibt er.

Man sieht sich auf den Trails. Sie sind jetzt bernsteinfarben gestrichelt.