Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

12.05.2010, 18:32

3D Tiled Terrain - Terrain für Strategiespiele

Vorwort
Bestimmt standen schon viele vor dem Problem, dass man eine gute Idee für ein Spiel hat, aber an irgent einem Punkt einfach nicht weiter kommt. Wenn man ganz viel Pech hat, ist es ein Problem, dass sonst kaum jemand hat, da sich einfach niemand dafür interessiert. Bei mir war es das Terrain eines Strategie-Spiels wie WarCraft III oder StarCraft II, welches mir viele Kopfschmerzen bereitet hat. Aber bei soetwas hilft nur eines: Zettel und Stift raus holen, zeichnen, schreiben, skizzieren und im langweiligen Deutschunterricht weiter Skizzieren *grins*. Es ist einfach so, dass sich komischerweise kaum jemand für solche Terrains interessiert, oder einfach jeder der auffassung ist, dass ein solches Terrain so einfach ist, dass es sich garnicht erst lohnt dafür ein Tutorial zu schreiben. Ich bin der Meinung das diese Technik sehr wohl ihre Knackpunkte hat, was mich auch dazu entschlossen hat, ein Tutorial darüber zu schreiben.

Ich habe dieses Tutorial ohne Referenzen geschrieben, da ich leider nichts dazu im Netz finden konnte. Aus diesem Grund bin ich für jegliche Verbesserungs-Vorschläge dankbar!

Vorüberlegungn
Bevor wir anfangen, müssen wir uns ersteinmal klar machen, was wir eigentlich wollen. Fest steht, dass wir Klippen brauchen. Jedoch bringen uns Klippen allein recht wenig. Nehmen wir mal das Szenario, in dem der Gegner sein Lager auf einer sehr hohen Ebene aufbaut. Wir haben uns jedoch ein warmes Plätchen weit unten im Tal ergattert. Wir bauen unsere Türme, Gebäude und eine starke Armee die alles niedermetzelt was ihr über den Weg läuft. Nun machen wir uns auf den Weg zu unserem Gegner, doch kommen nicht weiter. Unsere Armee wird von einer Felswand aufgehalten. Also brauchen wir auch eine Möglichkeit, um auf höhere Ebenen zu gelangen.

Die Technik
Es gibt viele Ansätze, wie man soetwas realisieren könnte. Die wohl beste Lösung ist, wenn man das Terrain einfach in Maya oder 3DS Max modelliert. Dardurch hat man unbegrenzte Freiheiten und kann man was man will. Jedoch hat man einen großen Nachteil, die Terrain sind nur sehr schwer editierbat und soetwas wie ein WorldEditor für das Spiel wird wohl kaum möglich sein.
Ein ganz anderer Lösungsansatz ist, dass Terrain aus vielen kleinen Meshes zusammen zu bauen. Jedes Mesh ist eine Klippe. Ich habe mal eine kleine Zeichnung gemacht, wie das Terrain von oben aussehen könnte:


(Link)


Das Terrain ist in Quadraten aufgeteilt. Die kleineren weißen bzw roten Quadrate sind die Punkte, an denen man eine Anhöhung setzen kann, dabei sind die roten Punkte welche, an denen eine Anhöhung gesetzt wurde. Jedes dieser großen Quadrate stellt ein Mesh dar. Wenn man diese Zeichnung nun etwas genauer betrachtet, stellt man fest, das man ganz einfach Regeln aufstellen kann, welches Mesh man benutzt. Diese Regeln beziehen sich nur auf die vier kleineren Quadrate, also die Höhenpunkte, die an diesem großen Quadrat angrenzen:


(Link)


Jenachdem welche Höhenpunkte (grün) belegt sind, wird entschieden welches Mesh an dieser Stelle benutzt wird. Theoretisch sind 16 verschiedene kombinationen möglich (2^16 bzw 4*4), jedoch wird es nicht 16 verschiedene "basis Meshes" geben, da manchmal bei verschiedenen konstelationen das gleiche Mesh benutzt werden kann. Ein Beispiel wäre, wenn alle 4 Punkte belegt sind oder einfach kein Punkt belegt ist. In diesem Fall wird genau das gleiche Mesh benutzt, denn das Mesh würde einfach nur aus 2 Dreiecken bestehen und ganz flach liegen. Stellen wir mal ein paar Regeln auf, um dies zu verdeutlichen:


(Link)


Dies sind die 4 Grundtypen. Dabei muss man jedoch die ersten 3 Typen noch jeweils 3 mal drehen, damit diese dann auch in jede Ecke passen. Wer viel Wert darauf legt, möglichst wenig Speicher zu verbrauchen, kann diese einfach jedes mal um 90°, 180° oder 270° drehen. Dadurch spart man sich 9 Meshes, muss jedoch eine Rotationsmatrix nutzen, was bei vielen Meshes eine Menge Rechenleistung klaut. Ich persöhnlich bevorzuge es die Meshes bereits gedreht zu speichern.

Die Feinarbeit
Das Terrain ist noch sehr eckig und einseitig. Doch auch dagegen kann man was tun. Wenn man das Grundprinziep verstanden hat, ist der Rest eine recht einfache Sache. Um die Ecken los zu werden, kann man die jeweiligen Meshes ja etwas mehr Polygone verpassen. Man könnte unordentliche Erdklippen modelieren oder welche die aussehen wie die Wände eines Maya-Tempels. Wichtig ist jedoch, dass die Meshes alle gut aneinander passen, nicht dass unschöne Lücken im Terrain entstehen.
Trotzdem wird das Terrain immernoch sehr einseitig aussehen. Jede Klippe wiederholt sich wieder uns wieder. Nun kann man einfach für jeden Klippentyp mehrere verschiedene Meshes modelieren. In der Regel sollten 3 verschiedene Meshes pro Klippentyp reichen, damit das ganze etwas unordentlicher aussieht. Hierbei muss man jedoch wieder darauf auchten das die Klippen aneinander passen, aber das ist nicht so gemeint das die Vertices an den Seiten immer an der selben Position liegen müssen. Man kann nun einfach wieder ein paar Regeln aufstellen. Man sagt einfach, dass Klippe A and B und C passt, aber nicht and D und E. E passt dafür an B, D und E. Das Ganze führt man dann immer so weiter.

Wer mehr als nur 2 Ebenen haben will, muss was die Höhenpunkte angeht ein wenig anders entscheiden, welches Mesh er benutzt. Man betrachtet einen Höhenpunkt als gesetzt, wenn die Höhe höher ist als die der Anderen. Problematisch wird das ganze wenn man mehr als nur zwei Ebenen in einem Quad hat. Dann muss man noch ein paar Meshes hinzufügen um dies zu unterstützen.

Was die Texturierung angeht, kann man nun einfach jedem Klippentyp eine Textur zuweisen oder einfach jedes mal die selbe Textur benutzen. Für die Oberfläche würde ich Texturesplatting empfehlen. Diese Technik ist sehr einfach zu implementieren und bietet sehr gute Editierbarkeit. Außerdem finde ich sieht das auch viel besser aus als eine einfache Textur mit einer Detailmap oder aneinander gehäftete Tilesets.

Das Rendern
Jedem sollte nun sofort auffallen, das das ein mega Overkill wäre, wenn man Mesh für Mesh rendern würde. Man würde ständing auf 150 - 300 Drawcalls kommen, was viel zu viel ist. Stattdessen könnte man auch Instancing benutzen, da sich der gleiche Klippentyp in einer Szene recht oft wiederholen sollte. Oder man fasst mehrere Meshes beim Laden einfach zusammen.

Das Ende
Ich hoffe euch hat mein Tutorial gefallen. Über Lob oder Kritick würde ich mich freuen. Aber nicht einfach nur sagen das etwas in meinem Tutorial blöd ist, sondern schon Verbesserungs-Vorschläge außern ^^

Wie man auch sehen kann, ist das Tut noch lange nicht Fertig. Ich bin gerade dabei das ganze selbst zu coden. Später wird es nette Screenshots und ein paar Code ausschnitte geben!

C-/C++-Quelltext

1
2
3
4
while(true)
{
    printf("Schon wieder aufgehangen!?");
}

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Potatoman« (12.05.2010, 22:45)


2

12.05.2010, 18:36

Warum kann ich eigentlich keine Bilder einfügen?

// Okay, der Uploader hatte nur meine Bilder gelöscht.

C-/C++-Quelltext

1
2
3
4
while(true)
{
    printf("Schon wieder aufgehangen!?");
}

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Potatoman« (12.05.2010, 18:50)


3

30.05.2010, 10:06

lustig, ich bin grad dabei, genau sowas umzusetzten und hab mir natürlich auch so meine gedanken gemacht. dabei hab ich auch versucht, die editierbarkeit mit zu beachten. und ich wollt noch, dass man levels bauen kann, wo sich sachen überlagern, so dass man auf verschiedene Ebenen wechseln kann. (is bei gebäuden mit mehreren ebenen oder brücken ganz sinnvoll)
der ansatz mit den "markierbaren" ecken gefällt mir, ich denk, den übernehm ich.
allerdings werden bei mir diese markierten ecken einen ebenen-übergang kennzeichnen, so dass man 3 arten von ecken hat: normal, positiv, negativ.
ich habe bisher auch nich vor, diese meshes vorzumodelieren, ich denke, man kann da gute ergebnise mit bezierflächen erreichen, vieleicht etwas noise drauf, mal sehn
im leveleditor kann man dann einfach die werte dieser ecken ändern, denke, dass das einfacher ist als wenn man jeden mesh per hand setzen muss: einfach ne art pinsel um zu erhöhen oder runterzusetzen, kennt man ja aus andren spielen

marfi

Treue Seele

Beiträge: 100

Wohnort: Schwerte

  • Private Nachricht senden

4

30.05.2010, 20:11

Wieso hast du im Netz nichts darüber gefunden? Vielleicht verstehe ich deine Idee ja falsch, aber grundsätzlich gibt es sowas schon lange.

Ich habe selbst mal vor 6 Jahren ein Terrain programmiert.






(Link)

idontknow

unregistriert

5

31.05.2010, 22:35

Erstmal gute Idee für ein Tutorial!

2 Dinge sind mir aufgefallen (zu letzterem, ich hab leider kaum ahnung von 3D :()

Also 1. du redest nur von Klippen, aber eigentlich wäre es ja treffender, Klippen/erhöhungen zu verwenden oder beziehst du dich rein auf Klippen?
2. Wofür brauchst du die versch. meshes, ich meine du kannst ja wenn du so eine "Tilemap" erstellst nach deinem Prinzip, die 3 Ecke direkt rendern oder nicht?

6

01.06.2010, 12:39

Das was in deinem Bild zu sehen ist, ist kein Terrain das aus 3D Tiles besteht. Dies ist eine einfache Heightmap.

Mit einer 3D Tilemap hat man die Möglichkeit, klippen in allen möglichen Formen zu erstellen. Bei einer Heightmap bist du an dem regelmäßigen Gitter gebunden. Die folgenden Sachen wirst du mit einer Heightmap einfach nicht hin bekommen:

http://planetstarcraft.files.wordpress.c…ss48-hires1.jpg
http://gomeler.com/pic/Articles/Starcraf…ling%20Rush.jpg

Wie diese Tiles dann aussehen kann man selbst bestimmen. Alle möglichen Klippenarten kann man damit machen, mit allen möglichen Formen die man sich nur denken kann. Und ja, es erfordert schon ein wenig mehr Arbeit als eine einfache Heightmap, dafür sieht das Ergebnis dann auch dementsprechen viel besser aus ;)

C-/C++-Quelltext

1
2
3
4
while(true)
{
    printf("Schon wieder aufgehangen!?");
}

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Potatoman« (01.06.2010, 14:42)


marfi

Treue Seele

Beiträge: 100

Wohnort: Schwerte

  • Private Nachricht senden

7

02.06.2010, 12:28

Aha, habe ich doch nicht richtig gelesen ;)



Naja, die Bilder sehen schon um längen besser aus, als eine Heightmap.



Grundsätzlich bist du aber auch mit einer Heightmap flexibel, jedenfalls wenn man es flexibel programmiert :) Man könnte genauso gut auf die vertikalen Polygone eine Detailmap legen. Das meine Heightmap so "verschwommen" aussieht lag einfach an der Performance. Das besondere an meinem Bild ist, dass es eine Draufsicht ist und keine Perspektive. Aber ansonsten hast Du natürlich recht. Es ist relativ leicht umzusetzen. Wobei ich glaube das dass Editieren deiner Map dann relativ viel Zeit in Ansprucht nimmt. ABer das kann man dann ja mit einem Editor und vorgefertigten arrays unterstützen.



ABER ... jetzt bin ich mal auf dein Ergebnis gespannt und warte auf deine Tilemap. :)

8

02.06.2010, 13:33

Diese Tilemaps werden ja hauptsächlich aus dem Grund genommen, weil man damit das Terrain so wunderbar Editieren kann. Die beste Variante für Terrains und allem Anderen wo man aus der Vogelperspektive schaut sind immer noch Modelle die man per Hand macht. Doch da werden sich Modder nicht sehr freuen^^

Meine Tilemap habe ich vorerst auf Eis gelegt, werde daran warscheinlich später wieder weiter arbeiten.

C-/C++-Quelltext

1
2
3
4
while(true)
{
    printf("Schon wieder aufgehangen!?");
}

Werbeanzeige

Ähnliche Themen