Kachelkarte / Geländeimplementierung mit unterschiedlichen Höhen benachbarter Kacheln

10

Ahoi!

Ich suche nach Informationen über Kachelkarten oder vielmehr darüber, wie eine bestimmte Art von Kachelkarte genannt wird.

Ich interessiere mich für die Art der Implementierung, die in Achterbahn-Tycoon oder der Transport-Tycoon-Reihe von Spielen verwendet wird, und habe mich mit Vektorfeld-Terrain und Höhenkarten-Terrain befasst, aber ich bin nicht sicher, ob sie für das geeignet sind, was ich suche entwickeln.

Es war ein Kampf, anständige Informationen zu finden, da die meisten Leute sie als isometrische Kachelkarte bezeichnen, aber ich möchte etwas in 3D mit einer festen orthografischen Perspektive erstellen. Ich verstehe, dass der zugrunde liegende Speicher der Kachelkarte nichts damit zu tun hat, wie sie gerendert wird, aber ich möchte keine 2D-Kachelkarte wie Pokemon / Zelda-Spiele der alten Schule erstellen, sondern eher nach dem Vorbild von Diablo mit der Fähigkeit zum Einschließen überhängende Klippen und abfallendes Gelände.

Ich versuche nur, die richtigen Begriffe zu finden, um Google und Stackoverflow nach Ressourcen zu durchsuchen, damit ich entscheiden kann, welchen Weg ich einschlagen soll.

Bisher habe ich es geschafft, eine grundlegende Kachelkarte zu erstellen, ohne die in einem VBO gespeicherte und als Drahtmodell gerenderte height / y-Komponente zu verwenden. Bisher sieht das gut aus, aber ich gehe davon aus, dass ich Probleme haben werde, wenn ich versuche, einen einzelnen Scheitelpunkt zu manipulieren, um Klippen und Hänge zu erstellen, ohne eine benachbarte Kachel zu beeinflussen.

Gibt es eine bestimmte Art der Implementierung, die ich prüfen sollte? Ich dachte, ich hätte es geknackt, als ich eine ganze Menge Informationen über Vektorfeldgelände gefunden habe, aber ich bin mir nicht sicher, ob dies auch zu den richtigen Ergebnissen führen würde.

Wenn mir jemand etwas Licht ins Dunkel bringen kann, wäre die Hilfe sehr dankbar :)

Aktualisieren

Ich habe ein Bild zur weiteren Verdeutlichung beigefügt, was ich erreichen möchte:

2.5D Kachelkarte

Bild entlehnt von So erstellen Sie gekippte (Höhen-) isometrische Kacheln

Dieses Bild zeigt den Geländetyp, den ich generieren möchte, enthält jedoch nicht die "Klippen" oder überhängenden Geländetypen, die ich modellieren möchte. Es wirft jedoch einige andere Fragen auf, die ich nicht berücksichtigt hatte, nämlich:

  • Wie würden „Schichten“ wie das Wasser (oben links im Bild) behandelt, um den sichtbaren Boden unter dem Wasser einzuschließen?
  • Wie würden die "Kanten" der Karte berücksichtigt, damit die Erde / der Schlamm gerendert wird, um die Welt als eine nicht flache Einheit darzustellen?
  • Könnte der zugrunde liegende Speicher für diese Art von Gelände verwendet werden, um Physik wie einen Ball, der einen Hügel hinunter rollt, oder die Bewegungsgeschwindigkeit eines Spielers, der einen Hang überquert, zu modellieren?

Ich hatte die Idee, dass jede Kachel des Geländes mit 8 Scheitelpunkten modelliert werden könnte, wobei die 4 Hauptscheitelpunkte die eigentliche Kachel selbst abdecken und die verbleibenden 4 Scheitelpunkte zum Modellieren der Seiten / Wände jeder Kachel verwendet werden. Die beiden Probleme, die ich bei dieser Implementierung sehe, sind, dass a) die Weltkarte im Wesentlichen doppelt so groß ist und b) da nicht alle Kacheln "Wände" enthalten, einige Kacheln redundante Eckpunkte haben, die nicht verwendet werden.

Ich möchte einen Terrain-Editor erstellen, mit dem jede Kachel deformiert werden kann und der die Möglichkeit bietet, das Terrain während des Spiels zu ändern. Dies wirft an sich zusätzliche Fragen auf wie: Kann ein VBO verwendet werden, um das Gelände zu speichern und zu rendern, während es im laufenden Betrieb geändert wird, und ist es auch möglich, Scheitelpunkte zu ändern, ohne benachbarte Kacheln zu beeinflussen?

Ich habe den Eindruck, dass ich die Dinge entweder überkompliziere oder auf eine Analyse-Lähmung stoße, weil ich es versäume, Code zu schreiben, um das Problem zu lösen, ohne eine klare Vorstellung davon zu haben, wie ich das erreichen würde, was ich will.

Auch hier bin ich wirklich nur auf der Suche nach einem Schub in die richtige Richtung. Gibt es eine bestimmte Art von Tilemap- / Terrain-Implementierung, die es ermöglicht, dass eine 3D-Karte sowohl von einem Karteneditor als auch während des Spiels deformiert wird, oder muss ich sozusagen meine eigene rollen? Ich versuche hier nicht, das Rad neu zu erfinden, aber ich habe Schwierigkeiten, Ressourcen zu finden, da ich nicht sicher bin, wonach ich suchen soll.

Wenn jemand Informationen, Ressourcen oder Codefragmente bereitstellen kann, wäre dies sehr dankbar, da ich bestrebt bin, mir die Hände schmutzig zu machen und etwas anderes als das flache Drahtmodell zu produzieren, das ich derzeit habe.

Danke fürs Lesen!

Captain Redmuff
quelle

Antworten:

2

Wenn ich Sie wäre, würde ich mich mit Voxeln befassen, insbesondere mit dem Cube-Rendering vom Minecraft- Typ. Im Gegensatz zu Höhenkarten können sie Überhänge, Höhlen, Gebäude mit mehreren Stockwerken usw. handhaben.

Sie würden Ihr Terrain in einem 3D-Array von Ganzzahlen speichern, wobei Zahlen einem bestimmten Terrain-Typ zugeordnet werden: 0 = Luft, 1 = Schmutz, 2 = Wasser usw. Um dann das zu rendernde Netz zu erstellen, würden Sie Erstellen Sie die Flächen eines Würfels für jedes nicht leere Voxel.

Dieses Tutorial ist eine großartige Erklärung, wie dies in C ++ mit Ogre3D gemacht wird. Ich nehme an, Sie müssten in OpenGL etwas tiefer gehen.

Nach dem Erstellen der Würfel möchten Sie die Kanten glätten, um das in Ihrem Bild gezeigte flüssige Gelände zu erstellen. Ich glaube, dass PolyVox (auch in C ++) dies tut; Sie könnten einen Blick auf ihren Code werfen. Ich denke, Sie machen im Grunde genommen in 3D, was das Bild in 2D zeigt: Durchschnitt der umgebenden Würfelpositionen, um zu wissen, wo jeder Scheitelpunkt platziert werden soll.

BEARBEITEN:

  • Generieren Sie die Flächen für die Würfel neben dem Wasser, als ob die Wasserfliese leer wäre, und rendern Sie die Wasserflächen transparent.
  • Gesichter am "Rand" können wie normale Gesichter erzeugt werden, wenn Sie Voxel außerhalb der Welt als leer betrachten.
  • Physik: Sie können das gerenderte Netz wahrscheinlich als statisches Objekt Ihrer Physik-Engine zuführen.
  • Karteneditor: Sie möchten die zugrunde liegenden Voxeldaten bearbeiten, nicht das Netz selbst! (Das Netz sollte die Daten spiegeln, sodass das Bearbeiten der Voxel Änderungen in Ihrem Netz hervorrufen sollte.) Möglicherweise möchten Sie Modell, Ansicht, Controller (MVC) nachschlagen, wenn Sie nicht damit vertraut sind.

Wenn Sie weitere Fragen haben, können Sie gerne einen Kommentar hinterlassen. Willkommen bei gamedev.SE!

Wackidev
quelle
Dies ist eine sehr komplizierte Lösung für ein relativ einfaches Problem. Viele Spiele haben das getan, was das OP verlangt, ohne die Komplexität von Voxeln.
Sean Middleditch
Ich bin damit einverstanden, dass Voxel kompliziert sein können. Würden Sie bitte auf diese Spiele verlinken? Ich bin daran interessiert zu hören, wie sie es gemacht haben.
Wackidev
Ich spielte mit der Idee, Voxel zu verwenden. Würde diese Implementierung bedeuten, dass alle Würfel Einheitsabmessungen haben, oder könnte ein einzelner Würfel extrudiert werden? Ich vermute, die Welt müsste in Schichten gelagert werden, um Wasser und andere Kacheln zu berücksichtigen, die sich entlang der y-Ebene "überlappen" können.
Captain Redmuff
Ja, normalerweise haben Voxel eine Einheitsgröße. Ich nehme an, man könnte sie extrudieren, aber ich denke, das würde es nur komplizierter machen. Ich bin mir nicht sicher, ob ich verstehe, was du mit Ebenen meinst. Beziehen Sie sich auf Wasserfliesen mit variabler Höhe?
Wackidev
Etwas in diese Richtung. Ich dachte mehr darüber nach, einfach einen "Boden" zu definieren, der ein extrudierter Würfel sein könnte, auf dessen Oberseite sich dann ein Wasserwürfel befindet, der durch die Ebene definiert ist, in der sich die beiden schneiden. Vielleicht bin ich damit fertig, die Dinge wieder zu komplizieren. Ich werde noch etwas über Voxel lesen und sehen, wohin mich das führt.
Captain Redmuff
6

Dies: http://30.media.tumblr.com/tumblr_m06qv6OREt1r2qjpao1_500.png ist ein Beispiel für eine Karte, die ich vor einiger Zeit erstellt habe.

Ich hatte eine XML, die die Karte und verschiedene Arten von Kacheln darstellt. Jeder Typ hätte einige Attribute:

  • Höhe
  • Position
  • Zusammenführungstyp: Welche Art der Zusammenführung dieser Kachel würde funktionieren ALL(wenn sie mit einer Kachel um sie herum zusammengeführt werden sollte) EQUAL(nur mit Kacheln desselben Typs zusammenführen)?NONE (niemals zusammenführen).
  • Zusammenführungshöhe: Die maximale Höhe für Steigungen (gut für Überhänge). Angenommen, Sie möchten, dass eine Kachel nur mit Kacheln auf derselben Höhe oder einer Differenz von 1 zusammengeführt wird. Der Wert wäre eins.

Ich würde dann alle Kacheln lesen und sie in der Szene erstellen. Zuerst nur unter Berücksichtigung der Position. Jedes Plättchen musste seinen Nachbarn kennen, also musste ich zweimal durch die Karte gehen, einmal, um alles zu erstellen, und noch einmal, um jeden Scheitelpunkt an die richtige Position zu bewegen.

Obwohl meine Modelle Hexen sind, ist das Konzept dasselbe. Sie würden einen Würfel benötigen, um Ihre Kachel darzustellen. Dann würden Sie die Basisscheitelpunkte auf die unterste Ebene verschieben und die Oberseite des Würfels mit den Würfeln um ihn herum "glätten". Sie würden auch prüfen, ob zwei Seiten der Würfel zusammengeführt wurden, sodass Sie diese Seite einfach aus dem Würfel entfernen können (wenn sie nicht zusammengeführt werden, handelt es sich wahrscheinlich um eine Klippe oder etwas anderes).

Über Physik hängt von Ihrem Ziel ab. Wenn Sie so etwas wie Achterbahn-Tycoon machen, brauchen Sie sie nicht wirklich. Sie können einfach die Spielerhöhe zwischen den einzelnen Plättchen überprüfen und die Gehgeschwindigkeit bestimmen. Sie können dasselbe für ein Objekt tun, das sich von selbst bewegt (wie der Ball), Sie können die Kacheln (oder den aktuellen Kachelwinkel) überprüfen und eine Richtung / Geschwindigkeit festlegen. Wenn Sie realistische Physik (wie Schwerkraft, Reibung usw.) benötigen, müssen Sie eine Physik-Engine verwenden, und Sie können die 3D-Darstellung des Würfels in der Engine verwenden.

Ebenen sind ebenfalls möglich, aber Sie benötigen so etwas wie Minecraft (mit Glättung der Würfel in der höchsten Ebene). Wenn Sie nur Schichten für Wasser benötigen, können Sie eine "Wasserquelle" auf einer Kachel haben und Ihren Code jeden Raum um sie herum füllen lassen, der sich auf derselben Höhe oder niedriger befindet (eine rekursive Lösung würde hier gut passen).

Ein Terrain-Editor wäre auch einfach. Wenn Ihr Code flexibel genug ist, können Sie die Transformationen auf eine einzelne Kachel (die, die Sie ändern) oder auf eine Liste von Kacheln (wenn Sie einen Pinsel verwenden) anwenden auswählen und verschieben). Der gleiche Code kann verwendet werden, um das Gelände im Spiel zu ändern. Und ja, Sie können die Scheitelpunkte auf dem VBO ändern. Es ist auch möglich, Scheitelpunkte zu ändern, ohne andere zu beeinflussen (dies hängt auch davon ab, dass Sie so codieren).

Luke B.
quelle
+1 Vielen Dank für Ihre Eingabe. Sie sprechen einen guten Punkt über die Schichtung in Bezug auf die "Wasserquelle" an, den ich vorher nicht in Betracht gezogen hatte. Ich werde versuchen, den VBO sofort zu ändern, da ich weiß, dass es möglich ist :)
Captain Redmuff