Zeichnen einer Landschaft
-
Hallo zusammen,
ich hab bisher mit Spiele- und Grafikprogrammierung noch nicht all zu viel zu tun gehabt. Doch jetzt will ich mich etwas ranwagen an die Sache ;).
Dabei schwebt mir etwas spezielles vor. Ich möchte gerne einen Terrainaufbau entwickeln ähnlich wie der von dem Spiel Tropico oder Railroad Tycoon 2 (falls die jemand kennt). Man sieht also eine Landschaft aus der Vogelperspektive und kann auf dieser 2 dimensional scrollen (um das mach ich mir allerdings weniger Sorgen).
Mein Hauptproblem ist erstmal die Landschaft auf den Bildschirm zu bringen.
Hat einer von euch schon mal was ähnliches gemacht und kann mir ein paar Tipps und Tricks geben, wie ich an die Sache rangehen sollte? Eine "Engine" hab ich, denke ich
, auch schon. Hab mich für Allegro entschieden, oder gibts was passenderes für mein Vorhaben?
Hab mir auch schon ein wenig was zu dem Zeichnen der Landschaft überlegt. Und zwar, dass ich meine Karte in einzelne Bereiche einteile (z. B. 10 x 10 pixel oder so) und die Mittelpunkte mit Linien verbinde. Ist das schon mal ein guter Ansatz oder total falsch?AJ
Edit: E-Mail-Benachrichtigung
-
-
Danke, aber soweit bin ich leider noch nicht. Mir fehlen eben die Voraussetzungen, die in dem Beitrag genannt werden.
Das Scrollen mit Allegro geht auch relativ einfach, habe ich gesehen. Man kann dort einen virtuellen Screen anlegen, der größer sein kann als der richtige Screen und auch die aktuelle Position auf dem virtuellen Screen bestimmen, die angezeigt werden soll.
-
Hmmm, kann oder will mir keiner einen Tipp geben??
Nun gut, ich vermute mal ich liege richtig mit meiner Vermutung zwecks den Orientierungspunkten. Kann mir dann vielleicht noch jemand sagen, wie man in Allegro eine Textur über einen Bereich legen kann? In den Examples und den Funktionen hab ich bisher nichts gefunden dazu. Oder muss ich das irgendwie selber einbauen? Wie macht man das, ohne dass sich Überschneidungen ergeben? Schon ein Linke würde mir helfen. Werde auch dann selber mal suchen, ob ich dahingehend fündig werde...
AJ
-
Es kann und will keiner Antworten, da man nicht genau weiß was du meinst, willst du eine 3D Landschaft erstellen und diese nur 2D scrollen, oder willst du ein 2D Landschaftsbild in Tiles stückeln und diese Scrollen?
Vieleicht solltest du mal deine Vorstellung etwas detailreicher Darstellen damit wir wissen was du meinst und "nein ich kenne deine genannten Spiele nicht", daher habe ich keine Vorstellung von deinem Wunsch.
-
Hi,
Meine vielleicht recht subjektive Meinung dazu: Versuche es mit einem eigenen Software Renderer. Du machst deine Algorithmen und den gesamten Prozess der Darstellung selber und kannst dir dabei fundiertes Wissen aneignen. Es dauert sicher nicht allzu lange, einen einfachen 2D Renderer zu machen (falls es das ist was du willst). Grundlegende Sachen wie einfache sind unschwer zu realisieren, und in 2D gibts nicht so viele und so komplexe Effekte und Algorithmen wie in 3D.Was Terrain betrifft, so baut man das üblicherweise (AFAIK) mit einzelnen kleinen Quadraten auf, die jeweils die Terraintextur beinhalten. Äußerst einfach eigentlich. Sowas wie bei Tropico, mit fließenden Übergängen und Höhenunterschieden ist schon wesentlich schwieriger.
Wie groß ein Feld ist, das kannst du eigentlich selbst wählen. Bei vielen kleinen ist es nur etwas aufwändiger als bei wenigen großen, dafür lassen diese das Terrain evtl. grob aussehen.
-
Ok vielleicht hätte ich doch dazuschreiben sollen, dass man nachfragen sollte, wenn man was nicht versteht. Aber ich dachte, dass das automatisch klar wäre
.
Ich versuche es also mal detailierter zu erklären:
Ich möchte also eine 3D Landschaft zeichnen und diese nur 2 dimensional scrollen. Die 3D Landschaft sollte allerdings keine Krümmung haben (man sollte also von einer flachen Welt ausgehen ;)). Der Blickwinkel sollte in etwa 45° haben, wenn das wichtig ist (und nicht dynamisch zu machen sein sollte). Die Landschaft sollte Erhöhungen und Senken aufweisen können. Flüsse und Seen möchte ich auch noch machen, aber erstmal gehts mir um die Landschaft an sich. Das Scrollen dürfte, wie schon gesagt, das geringste Problem sein.
Falls noch Fragen bestehen oder ich es noch genauer beschreiben sollte, dann bitte Fragen :).
-
Und das willst du gleich für den Anfang erreichen? Dürfte schwierig werden.
Hast du die mathematischen Grundkenntnisse für 3D-Grafik?
Und willst du dafür nicht lieber DirectX nehmen?
-
Warum machst du das 3D wenn du bloß 2D sehen willst? Nimm ein Programm, dass dir ein Bildchen nach 3D aus deinem Winkel umrechnet und zeig einfach das am Bildschirm an?!
Für den Anfang baust du dir so deine 2D-Landkarte aus 3D-Bildern zusammen und scrollst den einfach am Bildschirm vorbei.
Wenn du ein Häuslein in die Landschaft setzen willst setzt du einfach das in "3D" berechnete Bildchen drüber, fertig.
MfG SideWinder
-
randa schrieb:
Und das willst du gleich für den Anfang erreichen? Dürfte schwierig werden.
Man wächst mit seinen Aufgaben
Hast du die mathematischen Grundkenntnisse für 3D-Grafik?
Die da wären, in deisem Fall? Ich will, wie gesagt, nicht durch eine 3D-Landschaft gehen, sondern nur eine 3D Landschaft, also mit Bergen und Tälern, von der Vogelperspektive aus zeichnen. Oder ist das so kompliziert??
Und willst du dafür nicht lieber DirectX nehmen?
Ich möchte es eigentlich relativ plattformunabhängig machen.
-
SideWinder schrieb:
Warum machst du das 3D wenn du bloß 2D sehen willst? Nimm ein Programm, dass dir ein Bildchen nach 3D aus deinem Winkel umrechnet und zeig einfach das am Bildschirm an?!
Für den Anfang baust du dir so deine 2D-Landkarte aus 3D-Bildern zusammen und scrollst den einfach am Bildschirm vorbei.
Wenn du ein Häuslein in die Landschaft setzen willst setzt du einfach das in "3D" berechnete Bildchen drüber, fertig.
MfG SideWinder
Hmmm, ich hab aber keine Bildchen. Außerdem will ich das dynamisch machen mit der Landschaft. Allerdings nicht alla Civilization, wo jedes Quadrat seinen festen Standpunkt hat und auf dem Feld dann Hügel, Berge oder sonstiges zu sehen sind.
-
AJ schrieb:
Die da wären, in deisem Fall? Ich will, wie gesagt, nicht durch eine 3D-Landschaft gehen, sondern nur eine 3D Landschaft, also mit Bergen und Tälern, von der Vogelperspektive aus zeichnen. Oder ist das so kompliziert??
Ja, das ist es. Ohne die Algorithmen zu verstehen kannst du nichts machen. Da steckt ne ganze Menge dahinter. Kauf dir nur mal ein Buch dazu, und du wirst sehen was es bedeutet ein dynamisches 3D Terrain darzustellen.
Wirklich, fange klein an. 2D ist ein guter und wenig komplizierter Ausgangspunkt.Ich möchte es eigentlich relativ plattformunabhängig machen.
Dann nimm vielleicht OGL.
-
AJ schrieb:
Die da wären, in deisem Fall? Ich will, wie gesagt, nicht durch eine 3D-Landschaft gehen, sondern nur eine 3D Landschaft, also mit Bergen und Tälern, von der Vogelperspektive aus zeichnen. Oder ist das so kompliziert??
? das problem ist wohl eher, daß es vollkommen egal ist aus welchem winkel oder welcher richtung du das ansiehst. vor allem bei vogelperspektive (von oben "gerade" runter?) ist 3d absolut unsinnig und du kannst gleich ein großes quadrat mit textur nehmen (und damit es "plastisch" wirkt ne normalmap druff und fertig).
aber ohne halbwegs genaue anforderungen kann dir auch keiner eine gute methode vorschlagen (wie groß soll die landschaft sein? soll man beliebig zoomen können? WAS soll daran dynamisch sein? nur die höhen oder alles mögliche?)
-
AJ schrieb:
wie der von dem Spiel Tropico oder Railroad Tycoon 2
ist das bei tropico nicht komplett flach und bei RT2 schon mit erhebungen und senkungen?
ich würde dir ja gerne helfende tips geben, ich hab schon viele iso engines geschrieben, aber du müßtest irgendwie genauer sagen was du machen möchtest. wenn du wirklich nur ein 3d terrain haben möchtest aus 45°, dann wäre vielleicht auch eine heightmap mit mehreren layer mit oGL dargestellt einfacher zu machen als 2d-iso.
selbst bei iso-darstellungen in komplett 2d gibt es viele möglichkeiten sowas zu zeichnen.
rapso->greets();
-
@trienco
Also eine direkte Draufsicht (90°) soll es nicht sein. Dann würde ich einfach ein paar Landschaftsbilder zeichnen und diese Nebeneinander anzeigen (was ich bereits kann und dafür eigentlich nicht haben will).Wie groß die Landschaft sein soll, hab ich mir noch nicht überlegt. Ist das wichtig für die Darstellung von Erhebungen und Senken?
Zoombar sollte sie auch werden, aber nicht beliebig sondern die Stufen sollten fest vorgegeben sein. Ich will ja nicht was groß kompliziertes.Von der Darstellung her sollen nur die Höhen dynamisch sein.
@rapso
Soviel ich weiß, ist die Engine von Tropico(2) und RT2 die gleiche. Dort kommen Erhebungen und Senken vor.Wie schon beschrieben, möchte ich eigentlich nur eine Landschaft aus einem festen Winkel betrachten (z. B. 45°). Zoomen sollte auch funktionieren, aber wie oben beschrieben in festen Schritten. Drehen der Karte wäre natürlich auch ein Schmankerl, aber nicht individuell sondern in 4 Schritten, also sozusagen einmal von Norden, Westen, Osten oder Süden aus.
Vielleicht sollte ich auch einfach mal meine Überlegungen schildern. Also ich hab mir gedacht, dass ich ein Feld habe, z. B. 4 x 4.
char feld[4][4];
Ein Element dieses Feldes hat dann nur eine Angabe, die die Höhe des Teilstücks ist.
Um das nun auf den Bildschirm zu bringen, hab ich mir überlegt die 16 Elemente als Punkte zu platzieren. Dabei setze ich die Punkte gleichweit auseinander, nur dass ich noch die Höhe abziehe, damit der Punkt also am Bildschirm höher ist.Wenn also mein Startpunkt bei 100 (x), 100
liegt, wäre der erste Punkte, bei einer Höhe von 5, an der Stelle 100 (x), 95 (y), usw.
Diese Punkte würde ich dann mit Linien verbinden und die Flächen, die sich daraus ergeben würde ich gerne mit einer Texture, z. B. Gras füllen.
Die Punkte und Linien wären später dann natürlich nur gedacht bzw. berechnet.
-
axo, tropico2 hab nur den ersten teil angesehen (da fehlte eindeutig die 2 bei dir
)
so wie du das beschreibst klingt das als ob du polygone zeichnen wollen würdest. polygone sind ja nunmal ein umriss mit linien und gefüllt werden sie von einer graka auch (natürlich auch texturiert).
das sollte nicht so schwer zu realisieren sein mit oGL. natürlich ist die qualität nicht so hoch wie bei einer iso-engine aber du kannst es auf ein ziemlich hoches niveau annehern.
oder ist 3D komplett ausgeschlossen?
rapso->greets();
-
Tropico und Tropico2 sehen eigentlich ziemlich ähnlich aus, finde ich, aber egal du weiß was ich meine :).
Bin ich mit meinen Überlegungen also schon richtig dran oder muss man noch was dran ändern?
Wie ich im ersten Post schon geschrieben habe, möchte ich Allegro verwenden. Kennst du dich damit aus? Kann ich es da auch einfach realisieren? Ist eine parallele Benutzung von Allegro und OpenGL überhaupt möglich?
-
ich sprech von oGL weil ich allegro nicht nutze. aber bei einem kurzen blick auf deren hp ist mir das bzw. das aufgefallen, das müßtest du umschreiben, sodass du dort deine punkte reinschreibst und deine gewünschte kameraposition setzt und dann könnte es auch schon vielleicht funktionieren
womit ich an deiner stelle anfangen würde, wäre, dass ich eine flache plane zeichnen würde und die kamera drüber positioniere, sodass du die plane sehen kannst.
das sollte mit dem tutorial hoffentlich einfach zu machen sein.
rapso->greets();
-
AJ schrieb:
Wie ich im ersten Post schon geschrieben habe, möchte ich Allegro verwenden. Kennst du dich damit aus? Kann ich es da auch einfach realisieren? Ist eine parallele Benutzung von Allegro und OpenGL überhaupt möglich?
allegro (so wie sdl und zig andere libs) helfen dir in der hinsicht erst mal gar nichts und sobald du ein fenster+context hast haben die nichts mehr mit der sache zu tun.
das einfachste dürfte für den fall wohl sein, wenn du eine latte fertige stücke hast, sprich sowas wie flach, eine ecke "oben" (in 2-3 höhen), 2 oben, 3 oben, etc.. wie letztlich die richtige textur draufkommt hängt auch wieder schwer davon ab, was du haben willst. reichen 2-3 gehts einfach, soll mehr abwechslung dabei sein brauchts ein bißchen mehr. das ergebnis wird dann aber vermutlich eher wie populous anno tobak und weniger wie 3d anno fast 2005 aussehen ,-)
am ende wirds eben ein lustiger kompromiß zwischen optik, kartengröße und speicherverbrauch... also eigentlich wie immer.
-
Ich habe vor einiger Zeit mal eine 3D-Landschaft generiert:
Und zwar habe ich ein Graustufen-Bitmap genommen, jedes Pixel
ausgelesen und den Wert (0-255) als Höhenwert genommen.
Die resultierenden Punkte habe ich Trianguliert. Für die
entstanden Dreiecke habe ich die Normalen berechnet, um sie
zu schattieren (z.B. Flat-Shading).
Als Ergebnis hatte ich eine halbwegs anschauliche 3D-Landschaft.
Man kann auch noch Texturen draufpacken, Gras o.ä.
Gibt auch viele Bücher zu diesem Thema.kris