Mission on Mars: Ein Tile aus einer Highmap

Lesezeit: 4 Minuten

Ich möchte die Tiles der Oberfläche des Mars realistisch darstellen. Zunächst habe ich das Tile ja „manuell“ erzeugt. Nun berechne ich ein Objekt aus einer Schwarz-Weiß-Grafik – der sogenannten Highmap.

Highmap

Die Highmap ist Computergrafikern sehr bekannt. Es handelt sich um ein Schwarz-Weiß-Bild. Weiß bedeutet hoch, schwarz niedrig und alle Graustufen dazwischen sind die Mittelwerte. Nachteil einer Highmap ist, dass man nicht weiß, wie hoch oder tief das sein soll. Soll z.B. Schwarz 5m tief oder 50m tief sein? Das behalte ich im Hinterkopf.

Mit einem Grafikprogramm (GIMP oder Photoshop oder ähnliches) krickel ich mir auf einem grauen Hintergrund was zusammen. Dabei verwende ich einen „weichen“ Pinsel, damit die Ränder ein bisschen verschwimmen – das Hintergrundgrau ist RGB 128/128/128:

Das Bild hat eine Auflösung von 4096×4096.

Mesh modifizieren

Im ersten Schritt möchte ich die z-Koordinate meines Meshes jetzt dieser Grafik anpassen. Also lade ich die JPG-Datei auf den Server (highmap_01.jpg).

Aufbauend auf http://www.mission-on-mars.com/blog/example/tile6 erstelle ich ein siebtes Beispiel, nämlich  http://www.mission-on-mars.com/blog/example/tile7.

Sinnige Parameter sind:

und anschließend lade ich die highmap:

Nun möchte ich die z-Koordinaten meines Mesh in Abhängigkeit des Farbwertes der übergebenen JPG-Datei bestimmen:

Benötige ich also nur eine Funktion, die für einen Punkt der Highmap 1 ausgibt, falls dieser Weiß ist, -1 für Schwarz, 0 für den Grauwert 128 und entsprechende Fließkomma-Zahlen für Werte dazwischen – diese Funktion ist es Wert in die Bibliothek GfxLib aufgenommen zu werden:

Eine Kleinigkeit ist noch zu beachten. Die Highmap soll ja genau wie die Textur von links unten gemappt werden. Bei PHP Bildoperationen ist der Punkt (0,0) allerdings der linke obere Pixel. Das kompensiere ich durch zwei mitgeführte Zähler. Hier das komplette Beispiel für Tile 7:

Hier die Ausgabe für $tileDiff = 8:

Ansatzweise erkennt man die Auswirkungen der Highmap. Scheinbar ist aber die Differenzierung des Tiles „zu klein“ – bei $tileDiff = 16 wird es besser:

Das macht mich mutiger mit $tileDiff = 32:

$tileDiff = 64:

Schlussendlich $tileDiff = 128:

Probleme

  • Wie man erkennt, wird das Objekt mit $tileDiff=128 nicht mehr vollständig angezeigt.
  • Wie man auch erkennt, ist für so eine Struktur die Anzahl der Vertices extrem gestiegen (links unten).
  • Die Zackenbildung an den Rändern wird zwar weniger, aber schaut trotzdem nicht gut aus.
  • Für $diffTiles >=64 musste ich das Speicherlimit für PHP-Scripte erhöhen, d. h. auch der Server hat schon was zu tun (Stichwort: memory_limit).

An der APP habe ich, bis auf die Anpassung, Beispiel 7 zu laden, nichts geändert – daher auch keine wirklich neue Revision, lediglich die iOS/MAC-Variante habe ich auf neuesten Stand gebracht.

Revision 64

Android, iOS, MAC

Weiterführende Links

In den folgenden Blogs beschäftige ich mich mit der Lösung obiger Probleme und robbe mich weiter an die Marsoberfläche ran: Mission on Mars: Die NASA war schon da

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.