Ich bin neugierig, was die besten Praktiken in der Spieleentwicklungsbranche sind, um das 3D-Universum zu rendern.
Um genauer zu sein:
- Die Datenpunkte sind gegeben und statisch. Jeder Punkt hat Position, Farbe und Größe;
- Der gesamte Datensatz ist viel größer als der verfügbare Speicher.
- Benutzer sollte in der Lage sein, "herauszuzoomen", um ein größeres Bild auf einmal zu sehen;
Der naivste Ansatz wäre, das Universum in Würfel aufzuteilen und nur das zu rendern, was sichtbar ist. Ich bin mir nicht sicher, wie ich in diesem Szenario das "Herauszoomen" implementieren soll. Sollte ich Würfel für jede mögliche Zoomstufe vorberechnen? Oder gibt es vielleicht bessere Ansätze?
Ich suche eine technologieunabhängige Lösung.
infinite universe
Vergrößern von kann ähnlich sein wie das Verfolgen von Beziehungen zwischen zwei Punkten auf einer Mandelbrot-Kurve nach dem Zoomen auf verschiedene Ebenen. Auf einer bestimmten Ebene können Sie die Genauigkeit verlieren und sie nicht mehr unterscheiden oder sogar wiederfinden.Antworten:
Dies basiert auf meinen Spekulationen und dem Durchblättern von Celestias Quellcode.
Mit Celestia kannst du um einen Planeten fliegen und herauszoomen, um die gesamte Galaxie zu sehen. Ich habe seinen Quellcode durchsucht und festgestellt, dass er ein Octree verwendet, eine Struktur, um den Raum rekursiv in 8 Octanten zu unterteilen.
Der Renderer würde die Umgebung rendern, indem er den Octree durchquert, und nicht weit entfernte Objekte tief durchqueren.
Celestia verfolgt auch die absolute Größe eines Oktanten, wobei die absolute Größe eines Oktanten auf der absoluten Größe der Sterne innerhalb des Oktanten basiert. Wenn der Oktant nahe beieinander liegt, rendert Celestia die Sterne einzeln, und wenn der Oktant weit weg ist, rendert Celestia den Oktant als einen Stern der Größe des Oktanten.
Es kann auch eine sinnvolle Hierarchie geben, die Objekten zugeordnet ist. Wenn Sie sich beispielsweise einem Stern nähern (in der Datenbank angegebener Radius), werden dessen Planeten gerendert. Wenn ein Planet nah genug ist (ein Pixel-Cutoff auf dem Bildschirm), wird sein 3D-Modell gezeichnet.
Andere Weltraumspiele, die ich nennen kann, sind Orbiter und Kerbal Space Program, die Closed Source sind. Ich habe mir auch Frontier Galaxy angesehen, das prozedural Sternenkarten erzeugt hat. Es gibt eine Website, die analysiert, wie das Spiel nach seiner Zerlegung funktioniert: http://www.jongware.com/galaxy1.html
quelle
Es gibt eine Reihe von Teilen dieses Puzzles, von denen jedes ein tiefes und interessantes Kaninchenloch zur Erkundung bietet. Einige von ihnen sind:
Und Ihre eigene geheime Soße ist, welche Kombination dieser und anderer Techniken Sie verwenden und wann, basierend auf Ihren speziellen Anwendungsanforderungen.
quelle
Alles, was hierarchisch und / oder spärlich ist, sollte Ihnen hier weiterhelfen.
Es gibt viel leeren Raum, daher ist es ein Muss, keinen Speicher zur Darstellung des leeren Raums zu verwenden. Ein typischer hierarchischer Ansatz wäre so etwas wie ein Okt.-Baum, der den Raum rekursiv in 8 kleinere Würfel unterteilt, und Sie können Objekte in dem kleinsten Würfel speichern, den sie vollständig einnehmen können.
Ein Octree ist auch gut, wenn Sie eine Liste aller Objekte in einem Ansichtsstumpf abfragen können, sodass Sie nur eine Liste der Objekte abrufen können, die sich innerhalb Ihres Betrachtungswinkels befinden und nicht zu weit entfernt sind. Eine Sparse-Lösung kann so etwas wie ein Sparse-Grid sein, bei dem Sie Informationen zu beliebigen x-, y- und z-Positionen abrufen können. Sie müssen jedoch nur Informationen für Zellen speichern, die kein leerer Raum sind.
Andere gebräuchliche hierarchische Ansätze umfassen bsp-Bäume (sie teilen den Raum rekursiv in zwei halbe Räume auf) sowie kd-Bäume, die ähnliche Ergebnisse erzielen.
Ich persönlich denke, dass ein Octree ein guter Anfang für Sie sein könnte. Stellen Sie sicher, dass Sie nur so tief wie nötig unterteilen, damit Sie keinen Speicherplatz für leeren Speicherplatz verschwenden. Möglicherweise möchten Sie auch eine andere Lösung für Ihre statischen Objekte als für Ihre dynamischen Objekte.
Einige Lösungen (wie bsp) können sehr effizient sein, benötigen jedoch viel Zeit für die Erstellung, sodass sie normalerweise nicht für das Verschieben / Ändern von Objekten geeignet sind.
Hoffe das hilft, lass es mich wissen, wenn du Fragen zu den Details hast!
quelle