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:
- Code und Algorithmen. bevorzugt in C #
- Erklärungen. Ich bin ein Anfänger mit Algorithmen, aber ich bin sehr vertraut mit objektorientierter Programmierung
- Schritt für Schritt Demonstrationen. Nicht nur Konzept, sondern auch Richtung.
- 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).
procedural-generation
terrain-rendering
voxels
csg
Daniel Pendergast
quelle
quelle
Antworten:
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.
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:
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.
quelle
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:
Von hier aus können Sie nach schwimmenden Inseln suchen oder Höhlensysteme mit fraktalem Lärm hinzufügen:
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 .
quelle
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.
quelle