- Ausgehend vom falschen Pi-Wert im Doom-Quellcode wird untersucht, wie sich Rendering und Raumgefühl eines Ego-Shooters verändern, wenn man mathematische Konstanten absichtlich weiter verfälscht
- Spielgrafik stützt sich nicht nur auf Pi, sondern auch auf Trigonometrie und verschiedene mathematische Verfahren; schon kleine mathematische Änderungen können daher beeinflussen, wie man die Welt sieht und sich darin bewegt
- Doom ist ein klassischer FPS, dessen Quellcode 1999 unter der GPL veröffentlicht wurde, und konnte deshalb als Experimentierobjekt dienen, um Pi sowie trigonometrische Funktionen und Konstanten zu verändern
- Das Experiment beleuchtet auch Optimierungstechniken, mit denen Doom auf der damaligen Hardware gut lief, und bietet eine Anleitung, um eine Version mit falscher Mathematik selbst zu kompilieren
- Es wird untersucht, ob nicht-euklidische Geometrie in Spielen neue räumliche Erfahrungen schaffen kann; außerdem werden andere Spiele mit falschen Pi-Werten und öffentliche Quellcode-Repositories verlinkt
Dooms Mathematik absichtlich aus dem Tritt bringen
- Pi gilt als Konstante mit festem Wert, doch im Doom-Quellcode wird ein falscher Pi-Wert verwendet
- Grafik-Rendering hängt nicht nur von Pi ab, sondern auch von Trigonometrie und verschiedenen mathematischen Verfahren
- Das Experiment prüft, wie sich das Spiel verändert, wenn der Pi-Wert im Doom-Quellcode noch ungenauer gemacht wird
- Auch andere trigonometrische Funktionen und Konstanten werden verändert, um zu sehen, wie das Verständnis und das Bewegungsgefühl in der vertrauten virtuellen Welt ins Wanken geraten
Doom-Quellcode und Umfang des Experiments
- Doom ist ein bekannter klassischer Ego-Shooter
- Der Doom-Quellcode wurde 1999 unter der GPL veröffentlicht
- Das Experiment umfasst unter anderem:
- Änderung des Pi-Werts auf einen noch falscheren Wert
- Änderung anderer trigonometrischer Funktionen auf falsche Werte
- Ungenaue Änderung zugehöriger mathematischer Konstanten
Möglichkeiten nicht-euklidischer Spiele
- Wenn man die Mathematik verändert, können sich auch die Struktur des virtuellen Raums und das Bewegungsgefühl ändern, die Spieler bisher kannten
- Es wird untersucht, ob solche Veränderungen zu interessanten Spielmöglichkeiten auf Basis nicht-euklidischer Geometrie führen können
Performance-Optimierung und selbst ausführen
- Kurz behandelt werden auch Optimierungstechniken, mit denen Doom auf der damaligen Hardware gut lief
- Gegen Ende des Vortrags gibt es eine Anleitung, um die Doom-Version mit falscher Mathematik selbst zu kompilieren
Weiterführende Materialien
- Es werden auch Links zu anderen Spielen mit falschen Pi-Werten und zu öffentlichen Quellcode-Repositories bereitgestellt
- Das Vortragsvideo ist als MCH2022-Inhalt auf media.ccc.de verfügbar
1 Kommentare
Meinungen auf Hacker News
Im klassischen Duke Nukem 3D gab es auch so ein Beispiel: das Level „Lunatic Fringe“ von Richard „Levelord“ Gray.
https://dukenukem.fandom.com/wiki/Lunatic_Fringe
Dieses Level hatte außen einen kreisförmigen Korridor, der zwei vollständige Runden drehte, ohne sich selbst zu schneiden, und nutzte die damals wegweisende Fähigkeit der Build-Engine, Bereiche über raumbasierte Verbindungen zu trennen. Diese Funktion wurde auch für die „Room-over-Room“-Technik verwendet.
Im Multiplayer machte das Spaß, und die optische Täuschung hielt ziemlich gut. Wenn ich mich richtig erinnere, hatte der zentrale Raum vier Eingänge, aber bei jeder Runde außen herum begegnete man nur zwei davon.
Beim Experimentieren mit der Engine habe ich mit dieser Technik auch einmal ein Spielzeug-Level gebaut, das das Rätsel löste, „3 Häuser und 3 Versorgungswerke zu verbinden, ohne dass sich Linien kreuzen“.
Duke könnte so etwas wie nichteuklidische Geometrie sein, aber diese Pi-Änderung in Doom hat wenig mit Geometrie zu tun und wirkt eher wie „Garbage in, garbage out“.
Bei überlappenden Sektoren ging im Grunde nur Doom kaputt.
[1] https://www.lhowon.org/level/marathon/30
Wenn man das Innere einer konvexen Form rasterisieren kann, kann man auch eine Sektor-Portal-Welt rasterisieren: Man markiert eine bestimmte Fläche als Portal, setzt den Bereich, in dem diese Fläche sichtbar wäre, als Clipping-Region oder Stencil Buffer und rendert dann mit der passenden Transformation aus den Portaldaten und der Sektor-ID auf der anderen Seite den Sektor dahinter.
Kollisionserkennung durch Portale hindurch ist viel schwieriger als das Rendering hinter Portalen.
Lunatic Fringe ist ein Beispiel, das unmögliche Geometrie in Build direkt vorführt, aber Duke3D-Maps enthalten noch viel mehr sich schneidende Geometrie. In Doom kann man für solche Strukturen keinen BSP-Baum bauen, und da Spieler oder Monster nur X/Y-Koordinaten verfolgen, ist das natürlich unmöglich.
Ich las gerade Poul Andersons Klassiker Operation Chaos.
https://en.wikipedia.org/wiki/Operation_Chaos_(novel)
Er spielt in einer Parallelwelt, in der Magie real ist und sich zusammen mit der Wissenschaft rasant weiterentwickelt. Edwin Land erfindet zum Beispiel ein Gerät, das mithilfe von Polarisation Werwölfe ohne Mondlicht verwandelt.
Das Kind der Hauptfiguren wird entführt und in die Hölle gebracht, und sie erfahren, dass das Militär 20 Jahre zuvor versucht hatte, die Hölle zu untersuchen, woraufhin alle wahnsinnig wurden. Der Gegenspieler lässt den Hinweis fallen, dass sich die Raumzeitgeometrie der Hölle von unserer unterscheidet und man daher zu dem Moment zurückkehren kann, in dem das Kind dort ankommt, um es zurückzuholen.
Allein aus diesem Hinweis erkennen die Wissenschaftler, dass die Geometrie der Hölle nichteuklidisch ist, und berechnen Zauber, um sicher hineinzukommen, dort zu überleben und zurückzukehren. Um den Weg zu finden, beten sie um die Hilfe zweier Geometer des 19. Jahrhunderts, von denen einer ein Heiliger ist.
Die Werke von Poul Anderson, die ich gelesen habe, darunter auch das hervorragende High Crusade, sind ähnlich: Er legt nicht viel Wert auf den wissenschaftlichen Anstrich und prescht lieber grob voran.
Als anderes Werk über nichteuklidische Geometrie ist mir Christopher Priests Inverted World in guter Erinnerung geblieben.
John Carmack mag sich bei der 10. Nachkommastelle von Pi falsch erinnert haben, aber es wäre gut, wenn alle in ihrer Codebase nach 84.600 suchen und prüfen, ob jemand die Anzahl der Sekunden pro Tag vertippt hat.
Das kommt überraschend häufig vor und ist eine Lektion dazu, ob man Konstanten direkt ins Programm schreiben oder lieber die Werte verwenden sollte, die bereits in der Standardbibliothek der Programmiersprache vorhanden sind.
https://github.com/search?type=code&auto_enroll=true&q=84600
https://github.com/mysql/mysql-server/blob/824e2b4064053f7da...
https://github.com/textmate/textmate/blob/346b52b108b387462d...
15 * 60 * 60definiert hatte.In der Praxis werden Grafik und Bewegung erst seltsam und am Ende unspielbar. Statt das nicht-euklidisches Doom zu nennen, scheint „die Folge davon, an den Konstanten des Universums herumzuschrauben“ passender.
Bei echtem nicht-euklidischem Doom hätte ich eher so etwas erwartet: https://youtu.be/kEB11PQ9Eo8?si=0HNlpGFBii2AIK1n
https://youtu.be/yqUv2JO2BCs?si=AutaqS5unvT7cDjw
Wenn man sich in dem Doom-Video die seltsamen Geometrieeffekte ansieht, etwa dass Objekte beim Vorwärtslaufen seitlich zu rutschen scheinen, wirkt es bis zu einem gewissen Grad vertretbar, dieses Doom nicht-euklidisch zu nennen.
Man konnte normale Geometrie darstellen, aber die Geometrie musste in keiner Weise sinnvoll sein, und beliebige Verbindungen zwischen Räumen waren ebenfalls erlaubt. Ich will nicht kleinlich sein, aber das ist ein verbreitetes Missverständnis.
Für echte nicht-euklidische Sachen empfehle ich die Arbeiten von ZenoRogue. Zum Beispiel ein einfaches Spiel mit Nil-Geometrie[1], einen riesigen Bosskampf in einem Roguelike mit nicht-euklidischer Welt[2] oder allgemeine geometrische Merkwürdigkeiten[3]. Man kann sich im Grunde irgendetwas von ihnen ansehen.
[1] https://m.youtube.com/watch?v=gejRg_q70EA&pp=ygUJemVub3JvZ3V...
[2] https://m.youtube.com/watch?v=jcnXI8IArRI&pp=ygUJemVub3JvZ3V...
[3] https://m.youtube.com/watch?v=yqUv2JO2BCs&pp=ygUJemVub3JvZ3V...
Wenn ich es mir recht überlege, ist inzwischen genug Zeit vergangen, dass es wieder Spaß machen dürfte.
Für die Darstellung normaler Geometrie war das kein Problem, aber es gab keine Bedingung, dass die Geometrie zwingend Sinn ergeben musste, und Räume konnten beliebig miteinander verbunden werden.
https://www.youtube.com/watch?v=tl40xidKF-4
Doom ist keine Simulation, daher ist das Ändern einer einzelnen Konstante kein gutes Beispiel für irgendetwas.
Es läuft eher darauf hinaus, ein paar Routinen kaputtzumachen, weshalb die meisten Änderungen das Spiel unspielbar machen.
Man kann den Quellcode seines bevorzugten Konsolen-Emulators nehmen und beliebige Gleitkommafehler einbauen oder die Bedeutung einiger Branch-Instruktionen umdrehen. Je älter das Spiel, desto höher die Wahrscheinlichkeit, dass es noch läuft, und desto größer auch die Chance, dass es wie ein schlechter Halluzinationstrip aussieht.
Es gab auch Glitch-Art-Projekte, bei denen bestimmte Abschnitte bekannter Bild- und Videodateien beschädigt wurden, um etwas Neues zu erzeugen. Ich würde beides gern wiederfinden, finde es aber nicht mehr.
Marathon 1 (1994) unterstützte zwar nichteuklidische Räume, nutzte sie aber nur selten. Man spielt sich durch ein ganzes Spiel mit mehreren Leveln samt Karte, und nur in ein oder zwei Leveln tauchen unmögliche Räume auf — ohne dass das Spiel davor warnt oder darauf hinweist, dass so etwas möglich ist.
Vielleicht war es deshalb der beste Ort für ein Easter Egg, den man im Spiel finden konnte.
Ein Demo-Video habe ich auch gefunden: https://www.reddit.com/r/Marathon/comments/vclu55/probably_n...
Die letzte Frage lautet: „Was ist der maximale Wert von pi, der noch spielbar ist und nicht abstürzt?“ Der Grund, warum es bei pi = 4 zu einem Segmentation Fault kommt, dürfte sein, dass einige Zugriffe auf Lookup-Tabellen über das Tabellenende hinausgehen. Falls das stimmt, liegt der maximal spielbare Wert wahrscheinlich nur ganz geringfügig über pi selbst.
Ich hätte mir gewünscht, dass dieses Video stärker auf die Spielmechanik eingeht und genauer erklärt, warum die Änderung von Pi auf diese Weise Probleme verursacht hat.
Ich frage mich, ob dieses Experiment im erwähnten Raytracing-Doom interessanter wäre. Das Ergebnis des Hackens einer Konstante in der Rasterisierungstechnik entsprach ziemlich genau den Erwartungen. Mit Raytracing könnten aber spannendere Ergebnisse herauskommen.