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

Anonymous

unregistriert

1

15.07.2004, 00:22

Idee für eine Bewegung über Terrain

Halli Hallo!!

Ich bin dabei ein Echtzeitstrategiespiel mit der Tribase Engine zu schreiben. Ich hab noch nie ein Spiel programmiert, aber dafür klappt es schon ganz gut. Also, ....ich hab soweit Modelle geladen, die an eine vorher angegebene position fahren. Diese Position muss ich allerdings noch im Code mit einem Vektor definieren. Ich kann meinem Modell (von tbObject abgeleitet) also noch nicht während des Ausführens eine neue Position übermitteln. Das will ich mit der Maus machen, wobei dann die Position übernommen wird, wo ich hingeklickt habe.
Jetzt meine erste 1. Frage:
Wie komme ich an die Position im 3D-Raum, auf die ich geklickt habe??
Angaben habe ich ja nur soweit von der Kamera, und die Position des Zeigers auf dem Bildschirm (nicht aber im 3D-Raum)...

Außerdem möchte ich meine Modelle auch über Berge fahren lassen.
2. Frage:
Wie bringe ich meine Modelle dazu, über einen Berg (falls ich ein komplexeres Terrain habe), also immer direkt über dem Boden, fahren zu lassen, und nicht durch den Berg hindurch??

Danke schonmal im Vorraus!

In Deinem Beitrag befinden sich noch Fehler.
Bitte bearbeite die rot markierten Stellen und lösche diesen Text.

big_muff

Alter Hase

Beiträge: 460

Wohnort: Schweiz

Beruf: Informatikstudent (4. Semester)

  • Private Nachricht senden

2

15.07.2004, 17:23

Das Stichwort heisst Picking. Du kreierst einen Strahl vom Bildschirmpunkt, auf dem der Klick stattgefunden hat, hinaus in deine 3D-Welt (Nur wenn man in die Mitte klickt ghet der Strahl gerade vom Bilschirm weg. Ansonsten geht er halt schräg vom Bildschirmmittelpunkt weg) Wie man diesen Strahl genau berechnet kann ich dir leider nicht sagen. Aber da könnte Google mit dem Suchwort Picking oder ein anderes Forenmitglied helfen.

Diesen Strahl schneidest du nun mit deinem Terrain und schon hast du den 3D-Punkt auf den du an deinem 2D-Bildschirm geklickt hast.

Sofern dein Terrain entlang der xz-Ebene aufgespannt ist, was ja der Normalfall ist, kannst du die y-Koordinate vom 3D-Punkt weglassen. Den Rest speicherst du in deiner Objektklasse als xz-Zielpunkt (2D-Vektor). Jetzt ziehst du eine Linie von der xz-Position zum xz-Zielpunkt und bewegst dein Objekt in diese Richtung. In jedem Frame berechnest du die Richtung neu und lässt das Objekt sich so lange bewegen bis es beim Zielpunkt ist (oder zumindest nah dran). Ebenfals in jedem Frame kreierst du einen Strahl parallel zur y-Achse (also senkrecht zur xz-Ebene) der durch den Positionpunkt deines Objekts geht. Diesen Strahl scheidest du mit deinem Terrain und schon hast du die Richtige y-Koordinate (=Höhe) deines Objekts :)

Kommen noch Gebäude dazwischen wirds komplizierter. Da brauchst du dann eine geschickte Wegfindungs-KI, und das ist nicht mehr so simpel.

Bei unklarheiten bitte Fragen.
Nur Idioten halten Ordnung, ein Genie beherrscht das Chaos.[size=7]

[/size]HardFate - Ein Start, Ein Ziel, Viele Wege[size=7]

[/size]Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.

Osram

Alter Hase

Beiträge: 889

Wohnort: Weissenthurm

Beruf: SW Entwickler

  • Private Nachricht senden

3

15.07.2004, 17:57

In Kurzform:

2 Mauskoordinate nach 3D Welkoordinate wandeln:
Es gibt zwei grobe Möglichkeiten:
1. Z. Koordinate aus Z-Buffer holen. Damit hast Du 3D Koordinaten im Bildschirm K. System. Diese in das gewünschte System transformieren.
2. Einen Strahl vom Auge durch den Mauspubkt auf dem Bildschirm in die Scenerie schiessen und mit dem Terrain schneiden.

Laufen AUF dem Terrain:
Du brauchst eine Funktion, die Dir aus x und y z liefert. Erste Designentscheidung ist wie Du Fälle behandeln willst, bei der es mehrere Lösungen gibt, z.B. Brücken. Ein seltenes problem, man kann sagen man ignoriert es in einer ersten Implemntation. Wenn Du statische Objekte als terrain behandlst, springt dann Dein Objekt hoch, im schlimmsten Fall mit Absgturz Deiner pohysik Engine (Ist uns auf einer Messe passiert).

Das weitere hängt davon ab, wie Deine Terrainengine funktioniert. Wenn es ein gleichmässiges rechteckiges Gitter benutzt, musst Du die Indizees in Deine Arrays ausrechnen. Dann hast Du die 4 Eckpunkte umd musst zwischen denen interpolieren ;).

Wenn Du ein relativ beliebiges Terrain hast (z.B. aus einem Modeller oder aus einem LoD algorithmuss) dann kannst Du ein Art Raytracing machen.
"Games are algorithmic entertainment."

Wano

Frischling

Beiträge: 5

Wohnort: Koblenz

  • Private Nachricht senden

4

15.07.2004, 20:51

Erst einmal vielen vielen Dank für Eure Antworten.
Das mit dem Strahl durch den Bildschirm schiessen hab ich mir auch schon überlegt, da ich aber noch ziemlich neu bin in der Materie, weiß ich nicht so genau, wie ich an die Daten von meinem Terrain komme...
Für meine Modelle benutze ich Davids EMM Format, womit man 3D Studio Dateien einfach anzeigen lassen kann. Da ich ein Echtzeitstrategiespiel schreiben will, und man immer nur von oben einen kleinen Kameraausschnitt von dem Terrain sieht, brauche ich, glaube ich, nicht alles in "Quads??" einzuteilen um die Performance zu steigern.
Ich habe mal probeweise ein Terrain mit der Trialversion von 3DS erstellt und es dann als EMM exportiert. Wird auch alles prima angezeigt!!
Komme ich nun irgendwie an die Daten der Vertizes dieses Terrainmodells?? Gibt es dafür Funktionen? Oder gibt es ein anderes einfach zu handhabendes Format wo ich die x,y und z Daten auslesen kann und trotzdem die Mögkichkeit habe noch toll zu texturieren? Das ist nämlich mein grösstes Problem. Ich kann zwar wunderbar tolle Modelle anzeigen lassen, sie bewegen, und ihr Ziel suchen lassen, aber ich hab keine Ahnung, wie ich dann an die Koordinaten IN dem Modell rankomme. :crying:
Ach...noch was: Wenn ich meine Modelle in 3DS erstelle, und sie dann verkleinere, werden sie in 3DS noch richtig dargestellt, aber in meinem Spiel sind sie viel zu hell, und alles ist fast komplett weiß. Liegt das vielleicht an den Normalenvektoren, die nicht richtig transformiert werden?? Kann ich da in 3DS was machen, das die wieder richtig sind?? Wenn ich sie wieder größer exportiere ist alles wieder normal...

Danke im Voraus!!!!

big_muff

Alter Hase

Beiträge: 460

Wohnort: Schweiz

Beruf: Informatikstudent (4. Semester)

  • Private Nachricht senden

5

15.07.2004, 21:02

Ist dein Terrain denn ein extern erstelltes Modell oder ist es per Heightmap berechnet?

Ich geh mal von ersterem aus:
Ich benutze die TriBase nicht, aber hat man da nicht irgendwelche vorgefertigten Kollisionfunktionen für die tbObject-Klasse? Im Buch wird auf jeden Fall die Kollisionabfrage behandelt, also geh ich auch davon aus, das das in die Engine intergiert wurde (Wär ja sonst auch irgendwie komisch :rolleyes:). Dann brauchst du wahrschiendlich der Funktion nur den Strahl und das Modell anzugeben und du kreigst den Schnittpunkt als Rückgabewert.

Eventuell ist das aber alles falsch. Also bitte ich um Bestätigung von jemandem der die TriBase benutzt, das die solche Funktionen zur Verfügung stellt.

EDIT: Ich hab mal kurz nachgeschaut: Es gibt die Funktion tbLineHitsTriangle aber keine tbLineHitsModel. Also musst du diese Funktion wahrscheilich selbst schreiben (Alle Triangles des Modells durchgehen und dafür tbLineHitsTriangle aufrufen), sollte nicht jemand mit einer besseren Lösung kommen, denn trotz dem was DragonMaster gesagt hat, musst du um die Höhe zu bestimmen immer noch einen Strahl mit deinem Terrain schreiben.
Nur Idioten halten Ordnung, ein Genie beherrscht das Chaos.[size=7]

[/size]HardFate - Ein Start, Ein Ziel, Viele Wege[size=7]

[/size]Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.

6

15.07.2004, 21:08

Wenn du dein Terrain nur von oben sehen kannst, ist es nicht notwendig einen Strahl abzuschießen. Dann kannst du die richtigen Koordinaten anhand der XY Verschiebung des Terrains ermitteln.

Du hast eine XY Verschiebung und eine Ausdehnung. Das beschreibt dann den Teil der am Screen angezeigt wird. Die XY Verschiebung diehnt dann einfach als Offset die zu den XY-Koordinaten der Mouse hinzugerechnet werden müssen. Und dan haste deine Koordinaten. Die dritte (rauf/runter) ist ja von dem Terrain abhängig.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Wano

Frischling

Beiträge: 5

Wohnort: Koblenz

  • Private Nachricht senden

7

15.07.2004, 21:26

also, ein bisschen sollte man die kamera schon bewegen(neigen) können...somit brauch ich dann doch ne richtige 3D Berechnung von den Mauskoordinaten.
Es wäre allerdings sehr hilfreich, wenn ich die Koordinaten der terrain vertizes irgendwie abfragen könnte. Wie gesagt, ich benutze als EMM exportierte 3D Studio Modelle.
Somit könnte ich dann die Höhe meiner Modelle an die Höhe des gerade befahrenen Vertizes anpassen. Aber ich weiss nicht, wie ich an die Daten des Terrainmodells rankomme...

adapto

Treue Seele

Beiträge: 147

Wohnort: Berlin

Beruf: Student

  • Private Nachricht senden

8

16.07.2004, 00:09

wozu brauchst du den die daten von dem modell?
osrams 1. lösungsansatz ist echt einfach zu implementieren. habs zwar selbst nicht getestet aber so würde ich es auch machen. und wenn der strahl auf die skybox zeigt, damm muss der spieler halt nochmal die mauseingabe präzisieren.

Wano

Frischling

Beiträge: 5

Wohnort: Koblenz

  • Private Nachricht senden

9

16.07.2004, 00:22

Ich bräuchte die daten für meine einheitenmodelle, damit sie auch über einen berg drüber fahren, und nicht hindurch. Wenn ich die Höhe an der x-z koordinate von dem terrainmodell hätte, wäre es ja einfach, die anderen modelle an diese Höhe anzupassen....
aber wie gesagt, ich hab keine ahnung, wie ich an diese daten komme ???

10

16.07.2004, 01:56

Du sagtest das du David's EMM-Format benutzt. Geometrische Objekt, was ja Fahrzeuge, Terrain, etc. sind, haben eine Methode namens getVB. Diese liefert den VertexBuffer des jeweiligen Objektes. Damit ist es ein leichtes an die reinen VertexDaten zu kommen.

Diese sind ja auch nur beim Terrain erforderlich. Dann speicherst du einfach die höhenwerte des Terrain (geht nicht wenn man auch Brücken hast) und prüfst diese einfach gegen die Aktuelle Position der anderen Modelle.

Die Normalenvektoren sind auch nötig damit du die Rotation der Objekte anpassen kannst. Damit sich die Fahrzeuge auch passend zum Terrain bewegen.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Werbeanzeige