Das Präzisionsproblem
Von Anfang an wusste das Engineering-Team, dass die kontinuierliche Welt die Engine und das Content-Design erheblich beeinflussen würde, und das Kernproblem war die numerische Stabilität. Stellen Sie sich zwei Charaktere vor, die in zwei Metern Entfernung in östlicher Richtung vom Ursprung in Formation gehen. Irgendwann wird die Entfernung voneinander durch die Entfernung vom Ursprung überfordert, und die Zeichen scheinen sich „am selben Ort“ zu befinden.
Je weiter Sie mit dem Gleitkomma vom Ursprung entfernt sind, desto mehr Präzision verlieren Sie, was zu allen möglichen unangenehmen Problemen führen kann. Dinge sortieren nicht richtig, Risse erscheinen zwischen benachbarten Maschen, der Raum beginnt sich zu quantifizieren und Katzen und Hunde beginnen zusammen zu leben. Dungeon Siege verwendet die FPU im Einzelgenauigkeitsmodus, um die offensichtlichen Leistungsvorteile zu erzielen und die native Präzision der Videohardware zu erreichen. Aber selbst wenn wir die Präzision erhöhen würden, könnte dies das Problem letztendlich nie lösen, da die Welt unglaublich groß sein sollte und am Ende unglaublich groß sein sollte.
Aufgrund des Präzisionsproblems wäre es nicht möglich, wie bei den meisten anderen Spielen einen einheitlichen Weltkoordinatenraum zu haben. Stattdessen bestand die Lösung darin, die kontinuierliche Welt in eine Reihe unabhängiger Koordinatenräume zu unterteilen und regelmäßig zwischen diesen zu wechseln, um die Genauigkeit zurückzusetzen. Innerhalb dieser Einschränkungen wurden verschiedene Ideen ausprobiert, und wir entschieden uns schließlich für eine Variante eines Standardportalsystems.
Unsere Lösung besteht aus einem relationalen knotenbasierten Koordinatensystem, in dem jeder Geometrieblock (Siege Node) einen eigenen Koordinatenraum hat und über die Türen, die er mit diesen Nachbarn teilt, räumlich mit der benachbarten Geometrie verbunden ist. Die Anordnung der durch Türen verbundenen Knoten bildet einen durchgehenden Graphen, der die gesamte Weltkarte darstellt. Dieses Knotensystem entwickelte sich im Laufe der Zeit von seinem ursprünglichen Ziel, die FPU-Präzision beizubehalten, zur primären Methode zur effizienten Unterteilung des Raums und zur Wurzel unzähliger Optimierungen.
Um das Konzept einer 3D-Position in Bezug auf einen bestimmten Knoten einzukapseln, musste der herkömmliche Vektor (x, y, z) mit einer Knoten-ID (x, y, z, node) erweitert werden und einen Versatz zum Ursprung darstellen eines bestimmten Knotens statt. Dieses 4-Tupel ist als Belagerungsknotenposition oder SiegePos eingekapselt. Später haben wir ein SiegeRot (Quaternion, Node) hinzugefügt, um Vergleiche zwischen Ausrichtungen über Nodes hinweg zu ermöglichen.
Der Satz „Es gibt keinen Weltraum“ wurde für das Team zum Mantra, obwohl es buchstäblich Jahre dauerte, bis alle verstanden, was es bedeutete.
Für eine riesige zonenlose Welt würde ich entweder einen Vertex mit doppelter Genauigkeit oder einen Gleitkommawert mit kleineren Teilen wählen, die das Land teilen.
Jeder Chunk hätte ein eigenes Koordinatensystem. Wenn Sie die Grenze zu jedem dieser Abschnitte überschreiten, transformieren Sie alles in dieses Koordinatensystem. So machen sie es sowieso in Flugsimulationen.
Wenn Sie kleine Zonen haben, wird Float wahrscheinlich ausreichen.
quelle
Ich würde sagen, dass es für die tatsächliche Position ein Vektor von 3 Floats ist. Es gibt aber auch einen Zonenindex, der dem Spieler zugeordnet ist. (Aber nicht Teil des Speicherorts, da sich alle von diesem Zonenserver gehandhabten Daten in derselben Zone befinden und daher nicht in derselben Datenstruktur sein müssen.)
Denken Sie daran, dass es mindestens 4 Zonen gibt. Die 4 Hauptkontinente. Ich glaube nicht, dass einer von denen mehr als 10 km auf einer Seite ist. In diesem Blog vor der letzten Erweiterung wird beispielsweise die gesamte reisefähige Fläche mit 41 Quadratmeilen berechnet. Alle Schlachtfelder, alle Instanzen sind jeweils in ihrer eigenen Zone und koordinieren auch den Raum.
Mit der LUA-API können Sie die Position des Players ermitteln. GetPlayerMapPosition () gibt zwei Gleitkommazahlen von 0 bis 1 als Proportionen entlang der gesamten Weltkarte zurück.
quelle
Für WoW erwarte ich, dass sie ein einfaches float x / y / z verwenden - aber relativ zu einer bestimmten 'Zone'
Dies würde helfen, sich bewegende Zonen wie Boote und Zeppeline zu handhaben
quelle
In der Regel Online-Spiele wie Wow, Tibia usw. Speichern Sie den Spieler pos. mit drei Variablen X + Y + Z in der SQl-Player-Metatabelle. Runescape verzichtet auf das Z - so wird der Spieler immer oben auf dem Bodennetz dargestellt.
quelle
Ein Schwimmer? Nun, ein Array von 3 Floats für ein 3D-Spiel. Zumindest für uns verwenden wir Füße als Maßeinheiten, sodass Sie nur 3-4 Dezimalstellen benötigen, um an dem Punkt zu sein, an dem Schwebegeräusche kein Problem darstellen. Wenn eine große Zone nur ein oder zwei Kilometer von einer Seite entfernt ist, ist das keine große Sache. Was die transparente Zonierung in MMOs betrifft, ist das eine ganz andere Frage. In dem großen Schema schwieriger Probleme in einem MMO ist das Speichern von Positionen ziemlich weit unten auf der Liste.
quelle