Wie kann man ein unendliches Universum rendern?

15

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.

Anvaka
quelle
2
Planen Sie eine maximale Betrachtungsentfernung oder haben Sie eine Möglichkeit, entfernte Punkte zusammenzuführen, damit Sie sie nicht einzeln rendern müssen, oder sind die "Punkte" undurchsichtig und so angeordnet, dass die meisten von ihnen dies tun von einem bestimmten Standpunkt aus verborgen sein? Denn wenn keine der oben genannten Aussagen zutrifft, kann ich den Benutzer nicht daran hindern, Kamerawinkel zu finden, aus denen die meisten Punkte (oder zumindest ein erheblicher Teil davon) gleichzeitig sichtbar sind.
Ilmari Karonen
4
Übrigens ein bisschen exotisch, aber haben Sie prozedural generierte Daten berücksichtigt? Sie haben nicht den Vorteil von benutzerdefinierten Herstellungsbereichen, aber das Ergebnis ist, dass der Inhalt auf Gleichungen basiert, nicht auf großen Datenmengen. Mit ein wenig Kreativität könnte dies vieles vereinfachen (:
Alan Wolfe,
1
Das Verkleinern / infinite universeVergröß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.
user2338816
1
@AlanWolfe Custom Crafting ist immer noch möglich - das beste Beispiel sind die alten Frontier-Spiele, bei denen Sol (einschließlich Sol und seiner eigentlichen Planeten und Monde) um etwa 1000 Sterne näher lag. Sie müssen nur sicherstellen, dass sie sich an Stellen befinden, die nicht prozedural generiert wurden, und sie als weitere "Ebene" hinzufügen.
Luaan
@IlmariKaronen ja, du hast recht. Ich habe die maximale
Sichtentfernung

Antworten:

8

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

Ming-Tang
quelle
12

Es gibt eine Reihe von Teilen dieses Puzzles, von denen jedes ein tiefes und interessantes Kaninchenloch zur Erkundung bietet. Einige von ihnen sind:

  • Detaillierungsgrad - Automatische (oder "manuelle") Auswahl detaillierter oder vereinfachter Modelle oder sogar von Sprites oder Punkten oder für Objekte, die weiter entfernt sind.
  • Culling - nur das zeichnen, was benötigt wird. Dies kann sein, was sich im Sichtfeld befindet (kegelstumpfförmiges Keulen), was sich nicht hinter anderen Dingen verbirgt (okklusives Keulen) oder andere Ad-hoc-Methoden. (In der Antwort von @Alan Wolfe werden einige Möglichkeiten zur Organisation Ihrer Daten beschrieben, die das Keulen erleichtern.)
  • Streaming - Ziehen von Weltdaten nach Bedarf aus dem Speicher in den Speicher, wenn nicht alle Daten gleichzeitig in den Speicher passen
  • Sky Box - sehr entfernte Objekte können vorab auf eine Kugel gerendert werden, die sich in "unendlicher Entfernung" von der Kamera befindet.

Und Ihre eigene geheime Soße ist, welche Kombination dieser und anderer Techniken Sie verwenden und wann, basierend auf Ihren speziellen Anwendungsanforderungen.

David van Rande
quelle
2

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!

Alan Wolfe
quelle