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

28.08.2003, 11:46

Terrain-Theorie

Hallo,

ich habe eine Frage: Ich möchte für mein Spiel (eine Art Flugsimulator) eine Terrain-Klasse schreiben. Ich habe schon rumgegoogelt. Gefunden habe ich leider nichts. (English kann ich noch nicht so gut verstehen).

Aber zum Terrain (geladen aus Heightmap):

Dies hatte ich so vor:

Der Spieler hat eine maximale Sichweite (4000). Ab 4000. Soll ein 1000 Einheiten langer Nebel angezeigt werden. AlleObjekte (und Terrain-Tiles) die hinter dieser maximalen Sichtweite+1000 liegen, werden nicht gerendert. (Ausserdem rendert man von Hinten nach vorne). Also brauch man "nur ein Grundterrain", (ein Rechteck), mit den Maßen 2*Maximale Sichweite+2*1000 | Maximale Sichweite+1000, dies rekursiv aufgeteilt wird. (Das habe ich aber noch fast keine Ahnung, wie ich das mache)

Nur jetzt kommte der Haken. Erstmal wollte ich per Clipping (die 6 Ebenen) gucken, ob das "Tile" sichtbar ist. Ausserdem sollte geguckt werden, ob das Tile von einem vorderen, größerem Objekt, wie z.B. einem Berg verdeckt wird. (Dann muss es ja nicht gerendert werden.). Aber jetzt meine eigentliche Frage: Ist das machbar (und läuft das auch auf einem Mittelstands-PC) und, wie kann ich dieses Terrain Dynamisch machen...

Schüssi,

Chrissi

2

28.08.2003, 13:22

ui..da haste dir aber viel Vorgenommen.

Zum Clipping. Die Maximale Reichweite kannst du schon mit der Projection Matrix angeben. Gib dann dann als Far Plane deine 5000 Einheiten an (inkl. Nebel). Den Nebel selber kannst ja leicht mit den Renderstates setzen. Andere Möglichkeit währe dann natürlich das ViewFrustum. Das ist die einfachere der beiden Möglichkeiten. Besser währe da aber vieleicht Occlusion Culling. Einfach mal googlen.

Die Reihenfolge ist doch eigentlich egal. Oder haste ein 2D Spiel mit DDraw? Ich nehme ja an das dein Terrain keine Transparent Vertice enthält ;)

Zur Dynamik. In Zerbis Buch Band 2 ist eine Methode beschrieben, wie man ein Dynamisches Terrain Implementiert.

Zur Performance. Ob das ganze dann noch auf einem Mittelständischen PC läuft? Kommt ganz darauf an was du darunter verstehst. Aber auf einem P2 800 wird es wohl nicht mehr so schnell laufen.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

3

28.08.2003, 15:07

Die Ferien sind zwar bald um, aber ich werde das mal probieren. (Vorraussichtlicher ErscheinunggsTermin meines Spieles: Ostern. Ostern, 2005 ;) ). Verstanden habe ich das zwar alles nicht so ganz, aber es wird sicher alles gnz klar. Nur, Wer ist Zerbi?! Nie von dem gehört. Kann mich mal jemand aufklären?

DarthB

Treue Seele

Beiträge: 265

Beruf: Schüler

  • Private Nachricht senden

4

28.08.2003, 15:48

http://www.zfx.info
Kennst die Seite nicht.
Stefan Zerbst alias "Zerbi" ist der Autor von zwei deutschen Büchern die das Thema Spieleprogrammierung mit DirectX behandeln. Ist heute zu tage der berühmteste deutsche Autor in diesem Gebiet. Der dritte Teil der Zerbst Serie ist auch schon in Arbeit.
Aber wer weiß vieleicht lösst David ihn ja bald ab in punkto Berühmtheit? ;)

Ciao DarthB :huhu:

5

03.09.2003, 20:05

Hi,

erstmal danke fur die Antwort. Echt super Forum. Zurück. Ich habe leider nicht das Buch dieses Zerbst und ich habe auch nicht das Geld mir das zu kaufwen. (Ich habe im Mai oder Juni mit C++ angefangen (so halb konnte ich es) und ich habe mir jetzt 3 Bücher gekauft, und 110 € sind da schon drauf gegangen.)

Aber, ich würde das so machen. Ein Vector der Größe des Terrains wird angelegt. Am Anfang werden die Daten des Terrains (der Heightmap) auf einer Oberfläche gespeichert, ausgewertet und dann in diesen Vector gespeichert. Dann wird in jedem Frame geguckt (oder Besser, wenn das Terrain neu generiert werden muss), ob das Ursprungsterrain mit dem Terrain aus dem Array übereinstimmt. (Die Oberfläche könnte man im Prinzip weg lassen, da aber man diese vielleicht für eine Karte gebrauche könnte, lasse ich sie vorsichtshalber da.)

Ausserdem noch eine Frage: Das Klipping muss doch ausgeführt werden. Das Tile wird ja nicht gerendert, aber es wird ja noch berechnet. (Oder irre ich mich!?)

Ich hoffe auf Hilfe,

Chrissi

PS: Ich glaube, wenn man diese Terrain-Klasse leicht ändern würde, könnte man sie ja auch für eine Engine verwenden. (TriBase!) Oder gibt es schon eine EnGine(Mit SourceCode, da ich die Klasse im Bereich OberflächenTexturen ändern möchte...) mit einer solchen Terrain-Klasse. Dann müsste ich mir ja nicht die Arbeit machen.

6

04.09.2003, 01:29

Stimmt die Vertice werden noch berechnet. Darum gibt es ja Techniken wie ViewFrustum und QuadTree's.

An dem Spiel an dem ich grad Arbeite, soll das Terrain auch während der Laufzeit geendert werden. Immer dann wenn eine Rakete im Boden einschlägt. Ich hab mir Überlegt, bei jedem Raktentyp eine kleine Heigtmap beizulegen. Die Heightmap gibt die größe des Areals an das geendert werden muss und wie es geendert werden muss. Die Werte in der Heightmap werden dann an der passenden Position mit den Vertexdat Multipliziert oder Addiert (Das muss ich dann noch sehen, was besser aussieht). Auf diese weise brauch ich nicht immer jeden Frame abtesten ob irgendwo was geendert wurde, oder gar immer das gesamte Terrain neu zu generieren.

Mein Terrain habe ich in einem Quadtree Partitioniert, was aber noch nett ganz Funktioniert. Mein vierter Child Node Produziert immer eine Endlosschleife :(
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

7

04.09.2003, 17:44

Das ist ja witzig. Ich arbeite im Moment auch an einem Spiel, wo man eine Rakete steuert (Missile 3D heißt mein Spiel. Eine kleine Anspielung an Davids Spiel, nur mit realen Raketen, Designs, Landschaften und natürlich in 3D). Das Terrain sollte eine Spielwelt sein. (Eine möglichst große, da man ja eine möglichst realistische Interkontinental-Rakete steuert.) Die Modelle von ettlichen realitischen Raketen, Einheiten (Ubooten, Flugzeugträgern etc.) habe ich schon(jemand stellt die für mich bereit, siehe www.graeme.net) . Sonst sind bei mir aber nur das Hauptmenü, die Musik und die freibelegbaren Optionen fertig.

Ich hatte genau das gleiche Problem, wenn die Rakete einschlägt, was passiert. Ich finde (soweit ich das verstanden habe) die Idee mit der Heigtmap gut, aber da Terrain ist ja nicht ganz gerade. Und wenn du darüber einfach die andere Heightmap legst, sieht as nicht sehr realistisch aus... Ich würde sagen, das Terrain wird "eingebenet" in Form eines Halbkreises. Dieser ist dann Vorgegeben (im Modell) und wird dann mit einem Zufalsswert zwischen 0.9 und 1.1 multipliziert. Dadurch werden ja auch schöne Einschlageffect "gemacht". Aber zurück. Wenn ich es mir genau überlege, muss das Terrain ja gar nicht dynamisch sein. Eine Wasseroberfläsche/Einschlagsstelle wird als Ausnahme gesehen. Diese wird dann vom Pogramm berechnet, der Rest (Die anderen Sachen wie Berge, Ebenen etc.) sind statisch.

Deinen letzten Satz habe ich nicht so ganz verstanden (was meinst du mit "Quadtree Partitioniert").Aber, könntest du mir nicht eine Kopie deines Terrain-Code senden. Vielleicht finde ich den Fehler (was nicht sehr wahr scheinlich ist) und ich könnte es dann auch bei meinem Spiel nutzen...

Cu,

Chrissi

8

04.09.2003, 19:53

Ich kann ihn dir ja mal schicken. Er ist aber noch recht am Anfang.

Einen Quadtree kennst du doch, oder? Das Level wird in einem Baum einsortiert. Jeder Node hat dabei vier Child Nodes. Die Enden des Baumes enthalten dann die Faces.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

9

10.09.2003, 18:45

So, bin wieder im Lande. Danke, dass du mir deinen Code senden willst. Meine EMail-Adresse ist mailto:webmaster@chrissi-in-the-web.de.

Werbeanzeige