nD-Universen Engine
Aufbauend auf 4D-Geometrie als Standard für alle Objekte gibt es nun eine echte Graphen-Engine für beliebige nD-Universen. Wie man damit Alice-im-Wunderland-Türen baut und warum Bäume aus Graphen viel schöner sind als normale Bäume.
In 3D-Engines findet man sogenannte Szene-Graphen die abbilden in welcher Relation Objekte zueinander stehen.
Hier speichert man z.B. ab Sonnensystem -> Sonne, Sonnensystem -> Sonne -> Erde. Bewegt man nun die Sonne bewegt sich die Erde mit. Soweit so gut, nur ist das kein Graph, sondern ein Baum.
Problem an dieser Baum-Architektur ist die feste Vorgabe von Welt-Einheiten ohne die gar nix läuft. Ich erinnere mich noch gut an die Zeit der frühen 2000er und das Problem, dass man in vielen Spielen aus der Ego-Perspektive eine andere Größe sieht, als in der 3. Person. Eine Tür kann z.B. 2 WE hoch sein (etwa 2 Meter in der Engine) und aus der 3. Person passt das auch halbwegs - aber aus der Ego-Perspektive sieht die Tür viel kleiner aus.
Prinzipiell ist eine feste Welteinheit Unsinn. Ähnlich wie bei der Vorgabe Dinge nur mit Zirkel und (unbestimmten) Lineal zu zeichnen sollten alle Relationen der Objekte untereinander definiert sein, aber NIE absolut. Die einzige absolute Distanz von 1 ist gottgegeben und da wir in einem Graphen prinzipiell immer eine Art Gott für das betrachtete Universum sind (bedenken Sie bitte, ich rede hier von selbst erstellten Universen, Sie können ihre Meinung über Gott und UNSER Universum also für sich behalten) sollte diese Distanz nur dort angegeben werden wo wir das Universum als Betrachter betreten.
Zu Compass and Straight Edge sehr zu empfehlen:
How to Trisect an Angle with Origami - Numberphile
Wir legen also einen echten Szene-Graphen an, wie in der Spielplatz-Szene sieht der z.B. so aus:
// neues Universum
universe = new KreiseFigur('universe');
// Skybox erstellen
universe.graphs.skybox = new KreiseFigur3D('skybox');
// Shorthand
let skybox = universe.graphs.skybox
// Relative Größe 5
skybox.setScale(5);
skybox.setPosition([0, -5, 0, 0]);
// Anzahl der Wiederholungen
skybox.repeat = 2;
// Selbstreferenz
skybox.graphs.identity = universe;
Wie man sieht, enthält dieses Universum ausser sich selbst in Relation 5 nix - aber das genügt! Was ich auch ins Universum setze wird als Fraktal 5x vergrößert angezeigt.
Damit wir überhaupt was sehen, setzen wir noch eine Box und einen Spieler:
universe.children.box = new KreiseFigur3D('box');
let box = universe.children.box;
box.setPosition([3.1, 3.1, 3.1]);
box.makeCuboid(2, 2, 2);
universe.graphs.boxTwo = new KreiseFigur3D('boxTwo');
let boxTwo = universe.graphs.boxTwo;
boxTwo.setPosition([4, 4, 4]);
boxTwo.makeCuboid(4, 4, 4);
Hier ist nur wichtig zu verstehen, dass .children immer erzeugt werden, aber .graphs ein Limit in der Rekursion haben.
Nun zum Spieler, er hat 2 Funktionen, Kontroll- und Viewer-
// Player
universe.children.player = new KreiseFigur3D('player');
let player = universe.children.player;
player.children.playerShip = new KreiseFigur3D('playerShip');
let playerShip = player.children.playerShip;
playerShip.makeCuboid(.2, .2, .2);
playerShip.setPosition([0, 0, -.5]);
this.kontrollFigure = player as KreiseFigur3D;
this.viewerFigure = player as KreiseFigur3D;
player.setPosition([0, 10, -40]);
Damit wir ein absolutes Universum aus Spielersicht erhalten leiten wir jetzt aus diesem Graphen einen Baum ab:
this.perspectiveTreeFlat = universe.getPerspectiveTreeFlat();
Mit dem Code langweile ich hier ungern, der ist auch nicht ganz trivial, aber das Ergebnis gibt uns die Skybox 2x aus und damit etwa 6 Boxen und auch 3 Spieler, obwohl wir nur einen davon bewegen.
Wir haben jetzt aus einem Spieler im Graphen 3 Spieler im Baum gemacht, aber wir wollen ja die Ansicht ins Universum aus einer festen Sicht. In unserem Fall steuern wir zwar nur eine Instanz, aber wenn diese den "Rand" des Baums verlässt, ist ein Wechsel in die andere Ebene möglich - der Spieler verlässt dann einen Zweig, startet auf der anderen Seite des neuen Zweigs und ist 5x so groß.
Tja, weiter bin ich noch nicht, aber ich denke man erkennt, dass der Code an sich schon gut läuft.
Erster halbwegs lauffähiger Prototyp (Juli 2025):
Der nächste Prototyp (August 2025) kann schon Rotation in der 4. Dimension (ab etwa 00:25), aber bislang nur in einer Fläche (möglich wären 3) und rendert immerhin schon Dreiecke für geschlossene Oberflächen.
Dazu kamen noch versch. Projektionsarten (ortographisch, perspektivisch).
Aktuell kann die Engine stabile 4D->3D Schatten.