Ich entwerfe ein Spiel, das teilweise aus Planetenerforschung besteht. Ich möchte Pseudozufallsgenerierung für sie verwenden und aus einem definierten Startwert regenerieren, wenn ich sie laden muss, anstatt jedes Detail zu speichern, das zu schwer wäre. Ich speichere also nur den zufälligen Startwert und die vom Player vorgenommenen Änderungen in einer Datei.
Der Spieler muss in der Lage sein, den Planeten von der Umlaufbahn aus zu sehen (mit sehr geringen Details). Dann muss er auf den Boden sinken, die Details der Region, in der er landet, langsam erhöhen und die auf der anderen Seite befindlichen entladen des Planeten, die außerhalb des Sichtfeldes des Spielers gehen.
Wenn ich es auf einem ebenen Boden machen müsste, würde ich es leicht mit einem quadratischen Brocken-System machen. Das Problem dabei ist jedoch, dass Planeten - fast - Kugeln sind.
Was wäre also der beste Weg, um Bodendetails (Reliefs und geerdete Objekte) um einen bestimmten Punkt zu laden?
Ich habe zwar schon zwei Lösungen, aber beide haben eine Schwachstelle:
1. Schneiden Sie die Kugel in quadratische Stücke.
Sobald der Spieler nahe genug am Boden ist, muss ich nur die Details der nächsten Felder von seiner Position aus verbessern.
Wenn es nicht ausreicht, kann ich trotzdem jedes Quadrat in Unterquadrate schneiden, um es zu laden, wenn sich die Spieler auf oder nahe am Boden befinden.
Aber wie Sie auf dem Bild sehen können, gibt es ein Problem, wenn der Spieler versucht, auf einer Stange zu landen: Quadrate werden zu sehr schmalen Rechtecken oder sogar Dreiecken für die letzte Zeile und zusätzlich zu der Tatsache, dass es viele zu laden gäbe. Generation würde verzerrt erscheinen.
2. Ausgehend von einem Ikosaeder.
Hier könnte ich einfach die Dreiecks-Tessellation um die Position des Spielers erhöhen, wenn er sich nähert.
Aber ich weiß nicht, wie ich Dreiecke in der Nähe des Spielers ausfindig machen soll. Ich habe gehört, dass kartesische Koordinaten in diesem Fall nützlich sein könnten, aber ich weiß nicht, wie ich sie verwenden soll.
Ich verwende dafür C ++ / OpenGL, daher müssen hier hauptsächlich Scheitelpunkte generiert und geladen werden, die das Oberflächenrelief und die Farbe / Textur darstellen.