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:
- 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.