Prozedurale Planeten, Höhenkarten und Texturen

19

Ich arbeite derzeit an einem OpenGL prozeduralen Planetengenerator. Ich hoffe, dass ich es für ein Weltraum-Rollenspiel verwenden kann, bei dem die Spieler nicht auf die Oberfläche eines Planeten gelangen können. Ich habe also alles ignoriert, was mit ROAM zusammenhängt. Im Moment zeichne ich einen Würfel mit VBOs und mappe auf eine Kugel.

Ich bin mit den meisten Techniken zur Erzeugung fraktaler Höhenkarten vertraut und habe bereits eine eigene Version der Mittelpunktverschiebung implementiert (in diesem Fall ist das nicht so nützlich, wie ich es kenne).

Meine Frage ist, wie man die Höhenkarte am besten prozedural erzeugt. Ich habe bei libnoise sah , die ich Kachelbare Height / Texturen, aber so weit machen können , wie ich sehe , kann ich müsste ein Netz wie generieren diese .

Belassen Sie die Kacheln auf der Hand.

Kann mir jemand den besten Weg empfehlen?

Jede Eingabe wäre sehr dankbar.

henryprescott
quelle

Antworten:

18

Erstens bin ich mir nicht sicher, warum Sie eine Höhenkarte (dh Geometrieverschiebung) implementieren möchten, wenn die Leute nicht landen können. Es scheint nur effizienter zu sein, sie oder so etwas normal abzubilden.

Wenn dies gesagt ist, möchten Sie von einer beliebigen (x, y, z)in eine (u, v)triviale Koordinate konvertieren . Keine Cubemap erforderlich.

Alt-Text

Alt-Text

  1. Jedes (u, v)Texel hat eine Höhe (heightmap RGB = height) und eine Position (x, y, z) = pos.
  2. Finden und normalisieren Sie die Position NORMAL(x, y, z) = N.
  3. Neuer Scheitelpunkt = pos+N*height.

Dies funktioniert besser mit einer höheren Tessellation. Verwenden Sie auch die richtige libnoisesphärische Zuordnung für Ihre Höhenkarte, die ungefähr so ​​aussieht (aber schwarzweiß):

Alt-Text

David Titarenco
quelle
1

Die Kartierung der Mittelpunktverschiebungshöhe ist ein guter Ausgangspunkt. OP, warum denkst du, ist es nicht?

OP ist gut geeignet, um die Planetenoberfläche als Cubemap zu modellieren, da jede flache Karte (z. B. Mercator-Projektion) hässliche und komplizierte Verzerrungen aufweisen kann.

Wenn ich OP wäre, würde ich zunächst die großräumige Planetengeometrie vergessen. Ich würde eine Cubemap erstellen, bei der jede Fläche 2 ** N + 1 Pixel (2,3,5,9,17,33 ...) hat und jedes Texel eine Höhe [0..N] codiert, wobei 0 die Höhe von ist der erwartete tiefste Graben und N ist die Höhe des erwarteten höchsten Berges auf dem Planeten.

Ich würde dann zufällige Höhen für die acht Eckpunkte des Würfels berechnen und diese auf die sechs Quadrate der Würfelkarte verteilen, sodass jeder Eckpunkt dreimal auftaucht.

Wenn ich rekursiv fraktale Höhen für die Mittelpunkte der Kanten generiere, würde ich sicherstellen, dass die Eckpunkte der Flächenkanten auf die andere Fläche übertragen werden, die sie gemeinsam nutzt.

Sobald ich fertig bin, habe ich eine Würfelkarte, auf der alle Kantentexel verdoppelt und alle Eckentexel verdreifacht werden. Es muss nicht in eine normale Karte konvertiert werden - ich würde den Algorithmus in Morten Mikkelsens Artikel verwenden , um Normalen zur Laufzeit direkt aus der Höhenkarte zu rendern.

Zur Laufzeit würde ich wahrscheinlich ein Quad rendern, das die Projektion des Planeten auf den Bildschirm abdeckt, und im Pixel-Shader einen Schnittpunkttest mit einer einzelnen Strahlenkugel durchführen, um festzustellen, ob und wo ich den Planeten getroffen habe. Sicher schlägt Rastern eines stark tessellierten Sphärenmodells und erhält auch eine schöne glatte Kante.

bmcnett
quelle
1

Mit der maximalen Verschiebung, die durch die absolute Länge des Pixels skaliert wird, kann schnell eine sphärische Rauschkarte erstellt werden. Farbtabellen, die Höhe, Neigung und Sonnenlicht oder Länge als Parameter verwenden, können verwendet werden, um den Planeten automatisch zu beschatten.

Bjk
quelle