Wie werden Voxel-Geländemotoren hergestellt?

53

Vor ein paar Tagen habe ich so etwas wie Voxel-Terrains gefunden und finde sie ziemlich cool. Aber ich weiß nichts, was sie erzeugt. Modellieren Sie es in Ihrer Modellierungssoftware oder verwenden Sie so etwas wie eine Höhenkarte? Ich habe auf Wikipedia gelesen, dass Voxel wie 3D-Pixel oder volumetrische Pixel sind.

Wie kann ich, nachdem ich das Voxel-Terrain erstellt habe, diese Voxel nehmen und zerstörbar / ausgrabbar machen ?


Ich wähle die beste Antwort basierend auf:

  1. Code und Algorithmen. bevorzugt in C #
  2. Erklärungen. Ich bin ein Anfänger mit Algorithmen, aber ich bin sehr vertraut mit objektorientierter Programmierung
  3. Schritt für Schritt Demonstrationen. Nicht nur Konzept, sondern auch Richtung.
  4. Diagramme / Abbildungen. Nein, keine Screenshots von anderen Engines.


Ich weiß, dass dies ein kompliziertes Thema ist. Aber danke für jede Hilfe!

Nein, ich versuche nicht, einen Minecraft-Klon zu machen.


Bearbeiten

Vielen Dank an alle für Ihre großartige Hilfe (insbesondere an Nick Wiggill)! Das habe ich geschafft (Work in Progress).

Daniel Pendergast
quelle
[Einheit] und C ? Das ... macht wenig Sinn.
Martin Sojka
Ich verstehe C.
Daniel Pendergast
8
Mit solch einer kühnen Bitte haben Sie viel Vertrauen in die Gemeinschaft. Ich meine, ein komplettes Papier über ein voll dynamisches Voxel-Terrain für die heutige Hardware mit gutem FPS sollte einfach sein, oder? Nun, das Thema ist so umfassend und schwierig, dass ich bezweifle, dass Sie eine generische Lösung finden werden, und selbst dann kann es für Ihren Fall völlig nutzlos sein. Aber wer weiß, es kann in Abhängigkeit von Ihrem Vorbild machbar sein. Möchten Sie ein Crysis 2- Voxel-Terrain oder ein Delta Force- Terrain ? Vielleicht machst du einen Minecraft- Klon oder brauchst nur eine Sand-Simulation für ein Grabspiel? Definieren Sie bitte einen Bereich.
Genug Tee
2
Schauen Sie sich diese Middleware an: forum.unity3d.com/threads/… . Insbesondere die Demo
Tetrad
1
GPU Gems 3 hat ein Kapitel über Voxel-Terrain: http.developer.nvidia.com/GPUGems3/gpugems3_ch01.html
Tamschi

Antworten:

58

Ein Voxel-Terrain erzeugen

(a) Eine gebräuchliche Methode ist das Erzeugen einer Höhenkarte unter Verwendung von Perlin-Rauschen. Eine Höhenkarte ist im Grunde ein monochromes Bild, das unterschiedliche Höhen durch die Dunkelheit oder Helligkeit seiner Pixel darstellt.

Bildbeschreibung hier eingeben

Sie sehen sich einzelne Pixel in dieser Höhenkarte an, um "Stapel" von Voxeln bis zu verschiedenen Höhen (z-Achse) an verschiedenen (x, y) Positionen entsprechend der Helligkeit dieses Pixels in der Höhenkarte zu erstellen. Da ein Perlin-Rauschbild glatt ist (keine scharfen Kanten von Licht gegen Dunkelheit), wird das Gelände als Ergebnis glatt gerollt.

(b) Sie können es inkrementell konstruieren, indem Sie die Landschaft aus verschiedenen Polyedern erstellen. Erstellen Sie eine polyedrische Vektorform, die sich der gewünschten Voxelform annähert. Überprüfen Sie mit einer beliebigen 3D-Punkt-in-Polyeder-Methode (meistens Punkt-in-Konvex-Hülle), welche Punkte Ihres Weltgitters in dieses polyedrische Volumen fallen. Definieren Sie beispielsweise eine Pyramide im Raum. Nachdem Sie jeden Punkt in der lokalen Region Ihres Weltraums mit diesem pyramidenförmigen Volumen abgeglichen haben, wissen Sie, welche Punkte in ihn fallen, und Sie können diese Zellen als "vorhanden" festlegen, dh, sie werden zu Voxeln und nicht zu leeren Räumen. Sie haben jetzt eine Voxelpyramide in Ihrem Raum. Sie können auf diese Weise weitere Formen beliebiger Art hinzufügen, bis Sie ein Terrain gebildet haben.

(c) (Wirklich dasselbe wie b ) Schreiben Sie ein Modellierungswerkzeug. Voxatron zeigt, wie das aussehen würde. Dabei werden nur die Voxel-Formulare in einer Ersatzwelt (dem Editor) erstellt und anschließend in Ihre eigentliche Laufzeit-Spielwelt importiert. Ich glaube, Voxlap hatte den ersten Open-Source-Editor für Voxel. Sie können einzelne Voxel platzieren oder einen Voxel-Pinsel mit verschiedenen Formen / Volumina verwenden, um Voxel in Ihre Welt zu ziehen.


Was Sie brauchen, um Ihr eigenes Voxel-basiertes Spiel zu erstellen

Ich schließe diesen Abschnitt ein, weil die Voxelstraße nicht einfach ist, zumindest derzeit nicht. In letzter Zeit wird von den Big Playern wieder viel Forschung in die Voxel-Engines gesteckt, und zwar in Richtung Rendering und Physikanwendungen.

Einfachheit kann ein Problem sein, da das dynamische Konstruieren einer Welt aus rohen Voxeln ein prozeduraler Ansatz für die Weltkonstruktion ist und dies nicht von Natur aus einfach ist . Es tut uns leid, aber hier werden einige Fachbegriffe vorkommen. Das Schreiben einer Voxel-Engine ist ein ziemlich schwerwiegendes Unterfangen und erfordert Kenntnisse in verschiedenen Bereichen der Game-Engine-Entwicklung, insbesondere in Bezug auf räumliche Konzepte. Dies bedeutet, dass Sie 3D-Vektor-Mathematik, -Matrizen und -Rechnungsgrundlagen bis zu einem gewissen Grad verstehen.

Allerdings erfordert Ihre "Erzeugung eines Voxel-Terrains" einen Kontext, in dem Sie arbeiten können, da Voxel-Engines nicht gerade weit verbreitet sind. Fahren wir mit einer grundlegenden Beschreibung der Funktionsweise einer Voxel-Engine fort.

Voxel sind die Grundbausteine ​​Ihrer Welt. Ihre Positionen werden durch ein ganzzahlig indiziertes 3D-Gitter (Array) und nicht durch einen kontinuierlichen Gleitkomma-Raum (wie in vektorbasierten 3D-Spielen verwendet) definiert. Dies werden die "Atome" Ihrer Welt sein. Sie könnten 3 Fuß hoch sein, wie in Spielen wie Minecraft, oder sie könnten kleiner sein, als das Auge Ihres virtuellen Charakters tatsächlich sehen könnte, es sei denn, sie sind in großer Anzahl zusammengeschlossen - ein bisschen mehr wie Moleküle. Es gibt zwei Arten:

  • Voxel auf der Basis von kubischen Netzen ( Beispiel ) - dies sind neuere Typen, die der Einfachheit halber verwendet werden und in Verbindung mit moderner Grafiktechnologie leicht zu verwenden sind. Wird in Spielen wie MineCrat und Dungeon Keeper verwendet.
  • Punktvoxel ( Beispiel , Beispiel ) - das ursprüngliche Voxel. Jedes ist ein einzelner kollidierbarer Punkt im Raum, obwohl es von einem kugelförmigen Begrenzungsvolumen umgeben sein kann. Sie sind einfacher, so dass Sie viel mehr von ihnen in Ihrer Welt haben können, und Sie können sie so kleiner machen, was im Allgemeinen günstig ist. Zwei Spiele, die diese verwendeten, waren Comanche und das Remake von Lords of Midnight aus den 1990er Jahren.

In beiden Fällen ist Ihr Ansatz zur Manipulation von Voxeln in Ihrer Welt ähnlich wie folgt.

Um Objekte in Ihrer Welt zu konstruieren und zu bewegen, benötigen Sie die oben genannten mathematischen Werkzeuge. So erstellen Sie beispielsweise eine Wand: Konstruieren Sie eine Box mit den entsprechenden Abmessungen im 3D-Raum unter Verwendung von Vektoren. Verwenden Sie die Matrixmathematik, um Ihre Box in die gewünschte Drehung und Position in Ihrer 3D-Welt (im kontinuierlichen Vektorraum) zu transformieren. Bei einer Voxel-Engine besteht der zusätzliche Schritt darin, mithilfe eines 3D-Punkt-in-Polyeder-Algorithmus zu bestimmen, welche Ihrer Voxel in diesen gedrehten Raum fallen.

Im Grunde ist dies die Art und Weise, wie Sie die meisten Objekte in Ihrer Welt konstruieren würden. Darüber hinaus können Sie Ihre eigenen Werkzeuge schreiben, um einen Charakter so zu "modellieren", wie Sie es beispielsweise von Maya oder 3DS Max erwarten. Aber da Sie Ihren Charakter aus Voxeln anstelle von Punkten, Kanten und Flächen modellieren, unterscheiden sich Ihre Methoden erheblich. Wenn Sie diese Objekte dann in Ihrer Welt drehen möchten, müssen Sie in ähnlicher Weise Matrixtransformationen verwenden.

Zerstörbares Gelände ist so einfach wie das Entfernen von jeweils einem Voxel nach einer Methode Ihrer Wahl oder die Verwendung von CSG-Operationen (Constructive Solid Geometry) für große Mengen von Voxeln, um sie nach einem vordefinierten Volumen zu entfernen. Wenn Sie beispielsweise einen Laserstrahl durch einen Felsen schießen, können Sie ein zylindrisches Volumen verwenden, um die Voxel zu subtrahieren, die der Strahl durch den Felsen schießt. CSG ist ein relativ einfacher Vorgang, bei dem die räumlichen 3D-Gitter, die Ihre Voxelwelt bilden, verwendet werden und jede Zelle in einem Abschnitt eines Basisgitters (in diesem Fall der Stein) mit einem anderen Gitter (in diesem Fall dem Laserstrahl) verglichen wird.

Um Material "fließen" zu lassen (wie Vigil in seinem Kommentar zu Sand angedeutet hat), müssen Sie sich mit Fluiddynamik und zellulären Automaten befassen. Diese wurden vom Autor der Zwergenfestung, Tarn Adams, in einer im Wesentlichen auch Voxelwelt verwendet (obwohl die Voxel in diesem Fall viel größer sind, vergleichbar mit Dungeon Keeper, bleibt das Prinzip dasselbe). Dies sind brandaktuelle Themen und keine Notwendigkeit für Voxel-Motoren, wie sie definiert wurden. Ich werde dies als "Stichprobe" für Ihre eigene Forschung belassen.

CSG und Fluiddynamik bringen mich schließlich zur Optimierung. Derzeit in der Entwicklung befindliche Voxel-Engines verwenden fast ausschließlich spärliche Voxel-Octrees (SVOs). Dies ist eine Methode, um den Voxel-Raum in verschiedene Auflösungen zu unterteilen, wie in diesem Video gezeigt wird, in dem die bevorstehende Atomontage-Engine vorgestellt wird. Die Verwendung von Octrees / SVOs ist aufgrund des Verarbeitungsaufwands, der mit der Verarbeitung eines massiven, einheitlichen Rasters verbunden ist, eher eine Notwendigkeit als eine Optimierungsentscheidung. Ein Octree ist im Wesentlichen ein Baum (gerichteter azyklischer Graph), bei dem jeder Knoten entweder 8 oder 0 untergeordnete Knoten hat, je nachdem, ob der von ihm dargestellte Raum physikalische Datenträger enthält. Diagramme zeigen , wie Octrees Raum unterteilen Voxel zu bilden , sind hier .

Die beste mir bekannte Open-Source-Voxel-Implementierung ist Ken Silvermans Voxlap Engine , die für Voxelstein3D verwendet wurde. Es ist in C ++ geschrieben und implementiert CSG-Operationen zur Deformation des Geländes.

Techniker
quelle
Die Wiki-Änderung in der Community ist permanent und kann nicht rückgängig gemacht werden. Sie müssten Ihre Antwort löschen und neu erstellen (natürlich Ihre vorhandenen Stimmen opfern)
Jesse Dorsey
Die Moderatoren von " meta.stackexchange.com/questions/2974/…" können diese entfernen. Ich weiß allerdings nicht, ob sich die Dinge geändert haben. Danke, dass du es dir so oder so angeschaut hast.
Ingenieur
1
Gehen Sie Figur, seien Sie beim nächsten Mal vorsichtig.
Jesse Dorsey
2
Ersteres ist ein diskretisierter Raum, in dem Entitäten nur direkt auf einer Zelle liegen können. Wie perfekt platzierte Figuren auf einem Schachbrett können sie nicht "zwischen" Zellen liegen oder die Ränder überlappen. Während ein kontinuierlicher Raum wie in den meisten Physik-Engines zu finden ist, dh er basiert auf Gleitkommazahlen und ist daher nicht quantisiert, sondern stetig. Ihre Entität kann an jeder beliebigen Position im Raum sitzen, die Sie wählen - genau wie im wirklichen Leben.
Ingenieur
1
Texturierung ist implizit. Echte Voxel, ob netzbasiert oder nicht, haben jeweils eine reine Farbe. Die oben genannten Ansätze erzeugen nur realistischere Details und ermöglichen einen kombinierten Maschenansatz (Google Unity VoxelForm). Je feiner Ihre Voxel sind, desto feiner sind die resultierenden Texturdetails. Beispiel: Modellieren Sie ein Flussbett als Stein (grau). Konvertieren Sie jedes Pixel innerhalb des x-Abstands von der Oberfläche in Sand, indem Sie diese Voxel so einstellen, dass material = "sand"; Sie können dann sandfarben gerendert werden. Darüber hinaus kann dies auch die physische Interaktivität beeinträchtigen, sodass Sand durch Wasser bewegt oder weggegraben werden kann.
Ingenieur
33

Der beste Weg, um interessantes Voxel-Terrain zu erzeugen, ist eine Perlin-Rauschdichtekarte. Verwenden Sie anstelle einer 2D-Perlin-Rauschkarte, die die Höhe einer 3D-Welt definiert, eine 3D-Perlin-Rauschkarte. Wichten Sie die Karte so, dass die Werte, die sich näher am unteren Rand befinden, mit größerer Wahrscheinlichkeit solide sind und die Werte, die sich näher am oberen Rand befinden, definitiv Luft sind. Dies gibt Ihrer Welt Höhe, ermöglicht aber auch Überhänge und Höhlen, ähnlich wie im Minecraft-Gelände , wie diese Seitenansicht eines Geländeteils zeigt:

Welt mit Überhängen

Von hier aus können Sie nach schwimmenden Inseln suchen oder Höhlensysteme mit fraktalem Lärm hinzufügen:

Welt mit Höhlensystem

Die obigen Bilder und Höhlensystem-Ideen stammen aus diesem ausgezeichneten Blog-Beitrag . Sie können alle über Perlin lernen Lärm hier , und es gibt einige Beispiele - Code für den Einstieg hier .

dlras2
quelle
4

Die anderen Antworten hier sind ausgezeichnet, aber ich habe einen etwas anderen Ansatz gewählt.

Ich erstelle eine Umgebung in einem Modellierungswerkzeug (3DSMAX) und erstelle daraus ein spärliches Octree. Jeder kubische, nicht leere Blattknoten ist ein Voxel. Beim Rendern verwende ich Raycasting (in HLSL implementiert), um zu ermitteln, welches Voxel welches Pixel belegt, und setze das Pixel auf die im Knoten gespeicherte Farbe, die ich beim Generieren des Baums durch Mitteln der Texturwerte aus dem Quellmodell berechnet habe.

Dies bietet Ihnen viele nützliche Vorteile - kostenlose Kollisionserkennung, variable LOD, Culling von Sichtfeldern usw. - und ist, abgesehen vom Raycaster, einfach zu implementieren.

Leider ist es nahezu unmöglich, einen Beispielcode von einem Telefon aus zu senden.

3Dave
quelle
+1 für eine Alternative. Obwohl die Implementierung mit angemessener Leistung nicht unmöglich ist, überwiegen die Vorteile bei weitem die Nachteile. Voxel-Raytracing belastet die GPU enorm. Die hierfür erforderlichen Arithmetik- und Bedingungen sind sehr kostspielig, wenn dieselben GPU-Zyklen eine Reihe beeindruckender Bildschirmraumeffekte anwenden könnten, z. SSAO. Das größte Problem ist, dass Raycasting mit mehreren Bounces, wie sie in der Radiosity zu finden sind, am besten aussieht - auch nicht für die Szene, die aus Millionen oder Milliarden von Voxeln besteht und in der jedes Strahlsegment einen erheblichen Aufwand für Bounce und Composite erfordert.
Ingenieur
... Deshalb habe ich Scaline Raycasting in meiner Antwort (VoxLap) nur als Randbemerkung erwähnt - auch wenn es schwierig ist, es gut umzusetzen. Wenn Sie einen vertikalen Scanline-Ansatz zum Laufen bringen können, sind die Kosten um eine Größenordnung geringer als beim Pro-Pixel-Raytracing, da Sie die Dimensionalität des Renderprozesses von 3D auf 2D reduziert haben. Diesen Ansatz stehe ich weiterhin zur Verfügung, obwohl er komplexe Beleuchtungslösungen ausschließt, die mit Ihrem herkömmlichen RTRT möglich sind.
Ingenieur