KWEngine, Teil 18: Unebenes Terrain

Ein Terrain-Modell ist ein 3D-Modell wie jedes andere. Man muss es aber zunächst generieren lassen. Dazu braucht man eine Height-Map.

Beispiel für eine Height-Map (128×128 Pixel)

Eine Height-Map ist ein Graustufenbild, in dem die hellen Pixel die Höhe des Terrains angeben. Dunkle Pixel bedeuten hingegen, dass das Terrain an diesen Stellen wenig oder gar keine Höhe aufweist.

Das Terrain-Modell sollte zu Beginn der Prepare()-Methode der gewünschten Welt-Klasse generiert werden:

public override void Prepare()
{
    KWEngine.BuildTerrainModel(
                "MyTerrainName",        // Name, unter dem das Terrain-Modell in der Engine verfügbar sein soll
                @".\heightmap.png",     // Name der Height-Map-Datei (Schwarzweiß-Bild als jpg, png) 
                @".\bodentextur.jpg",   // Name der Bodentextur-Datei (jpg, png oder dds)
                50,                     // Länge des Terrains entlang der X-Achse (in Metern)
                5,                      // Höchster Punkt des Terrains (z.B. 5m über dem Meeresspiegel)
                50,                     // Länge des Terrains entlang der Z-Achse (in Metern)
                10,                     // Texturwiederholungen der Bodentextur in X-Richtung
                10                      // Texturwiederholungen der Bodentextur in Z-Richtung
                );
}

Anschließend benötigen Sie eine neue Klasse (z.B. Terrain), die wie alle anderen Klassen von GameObject erbt. Legen Sie diese wie alle anderen GameObject-Klassen zuvor an.
In der Prepare()-Methode der Welt-Klasse muss dann anschließend ein Objekt dieser Klasse angelegt werden:

// Erzeuge Objekt der Klasse Terrain und nenne es t:
Terrain t = new Terrain();

// Setze für Objekt t das 3D-Modell auf das zuvor generierte Terrain-Modell:
t.SetModel("MyTerrainName");   

// Optional: Markiere das Objekt als Kollisionsobjekt
t.IsCollisionObject = true; 

AddGameObject(t);

Einschränkungen

  • Ein Terrain kann seine Position verändern (z.B. via SetPosition()) aber kann nicht mit SetScale() oder SetRotation() vergrößert bzw. rotiert werden.
  • Die Height-Map-Datei sollte idealerweise eine maximale Auflösung von 256×256 Pixeln aufweisen. Generell reichen bereits Auflösungen von 64×64 Pixeln aus.
    Beispiel:
    Bei 256×256 Pixeln werden für jeden Pixel (256 * 256 = 65536 Pixel) Punkte im 3D-Modell erzeugt. Bei 512×512 Pixeln wären es schon 262144 Punkte. All diese Punkte müssten von der Grafikkarte gezeichnet und berechnet werden und sorgen für eine schlechtere Performance. Verwenden Sie deshalb wirklich nur Height-Maps mit geringer Auflösung, um die Spielszene nicht unnötig zu verlangsamen.
Beispiel für ein erzeugtes Terrain-Objekt

Schreibe einen Kommentar

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