Du bist nicht angemeldet.

Werbeanzeige

Lars

Frischling

  • »Lars« ist der Autor dieses Themas

Beiträge: 14

Wohnort: Hamburg

Beruf: Musiker / Fotograf

  • Private Nachricht senden

1

09.06.2012, 16:47

U-Bootsimulator: 3D Positionen für 2D-Kartenanzeige konvertieren ?

Hallo,

ich bin heute auf ein (unerwartetes) Problem gestossen und hoffe ihr könnt mir helfen ;) Ich denke mal ich habe da wohl
ein Verständnißproblem was '3D' angeht...

Für mein Projekt UBoot-Simulator habe ich mit der Gameloop angefangen. Die Gameloop habe ich in meine 2D-Einsatzkarte
integriert. Während die Einsatzkarte auf dem Bildschirm angezeigt wird, werkelt im Hintergrund die Gameloop...
Hier ein Beispielbild der Karte:




(Link)





Nun zu meinem Problem - Ausgangs-Situation ist z.B. folgende:

Wir haben drei Einheiten im Atlantik: Ein UBoot, ein Schiff und ein Flugzeug. Alle Einheiten haben eine Position (x/y) und eine Höhe bzw. Tiefe.
Die Einheiten haben in meiner Testmission vier Wegpunkte, die nacheinander abgefahren werden. In 2D funktioniert alles prächtig. Die Einheiten bewegen sich brav auf der Karte den Wegpunkten entlang.

Leider habe ich Dussel die Tiefe bzw. Höhe der Einheiten völlig ignoriert... :dash:

Nun habe ich mir gedacht, kein Problem, änder ich halt alles auf 3D-Koordinaten/Position. (Sämtliche Positionen liegen als 2D sf::Vector2f und als 3D Ogre::Vector3 vor. Doch hier beginnt mein (Verständnis)Problem. Wie konvertiere ich die 3D Position in die 2D Position für die Karte.

Und: Ist das überhaupt eine 3D-Position im eigentlichen Sinne, nur weil noch eine Tiefe bzw. Höhe als dritter Parameter hinzukomt ? Die
'3D' Position ist übrigens deshalb als Ogre::Vector3 gespeichert, weil ich mein Seerohr in Ogre entwickelt habe... In meinem Seerohr ist
die Sache auch klar. Ich befinde mich an Position X/Y und schaue in Richtung Z... Aber bei der Berechnung in der Gameloop habe ich da so meine Probleme. X/Y ist hier ja nicht gleich X/Y in 2D, da ja Y die Höhe bzw. Tiefe beeinhaltet und in 2D die Posiotion auf der Karte... :hmm:

Ablauf der Gameloop soll in etwa folgendermaßen aussehen:

Gameloop berechnet Bewegung der Einheiten (Positionen) und Daten des eigenen Bootes
Anzeige auf Einsatzkarte
Andere Programme (Radar/Sonar e.t.c) holen sich die Daten bei der Gameloop ab (über TCP...)

Ich hoffe, ich konnte mein Problem verständlich erklären und es findet sich jemand der mir da helfen kann... :|

Gruß,
Lars

P.S. Letzter Stand der Entwicklung von U38i: Seerohr

idontknow

unregistriert

2

09.06.2012, 16:57

Wenns dir darum geht eine 3D Koordinate in eine 2D Koordinate "umzuwandeln" bzw. eher darzustellen wirst du nicht umhin kommen dir irgednen Trick zu überlegen um die "Höhe" der 3D Koordinate zu visualisieren.

Du könntest aber auch einfach jeden verschiedenen Typ (UBoot, Flugzeug, Schiff) durch eine andere Farbe visualisieren!

Lars

Frischling

  • »Lars« ist der Autor dieses Themas

Beiträge: 14

Wohnort: Hamburg

Beruf: Musiker / Fotograf

  • Private Nachricht senden

3

09.06.2012, 17:51

mhhh, da habe ich mich wohl doch noch falsch ausgedrückt...

Auf der Einsatzkarte benötige ich die Höhe nicht! Dort wird lediglich die Position durch ein Symbol der entsprechenden Einheit dargestellt.
Für jede Einheit gibt es verschiedne Symbole. Erst wenn ich den Cursor über eine Einheit positioniere, werden die bisher bekannte Daten der Einheit oben links im Fenster angezeigt (auch die Tiefe).

Mir ging es eher um die Berechnung der Positionen von Einheiten im virtuallem Raum. Bei dieser Berechnung muss die Tiefe bzw. Höhe der Einheit mit berücksichtigt werden. Angenommen ein Schiff feuert einen Torpedo auf ein U-Boot. Dieser Torpedo läuft dann auf eine Position X/Y in einer bestimmten Tiefe zu, also in einem bestimmten Winkel Richtung X/Y/Tiefe. Diese Gameloop soll nun einfach sämtliche Berechnungen durchführen, die später von anderen Programmen (Einsatzkarte zur Lage-Anzeige, Radar, Sonar) genutzt werden.

In etwa so:

U-38i befindet sich an Position X1/Y1 in einer Tiefe von 100m und fährt 5Km/h schnell.

Wenn sich jetzt der nächste Wegpunkt X2/Y2 in einer Entfernung von 1Km und in einer Tiefe von 200m befindet, soll halt die
Gameloop U-38i in diese Richtung/Tiefe entsprechend fortbewegen. Die aktuelle Berechnung der aktuellen Position/Tiefe wird
in einer Art U-38i-struct' gespeichert. Diese struct bekommen dann die anderen Programme geschickt (TCP).

Es geht also eher um eine Trennung der Berechnung der Spieldaten von den Anzeigen an den entsprechenden Stationen (Karte/Radar/Sonar)...

Ich probiere und google jetzt schon den halben Tag, aber irgendwie komme ich da nicht weiter...

Gruß,
Lars

dot

Supermoderator

Beiträge: 9 833

Wohnort: Graz

  • Private Nachricht senden

4

09.06.2012, 17:59

Na führ deine ganzen Berechnungen eben in 3D aus und wirf nur zur Anzeige einfach die dritte Koordinate (Höhe/Tiefe) weg...

xardias

Community-Fossil

Beiträge: 2 771

Wohnort: Santa Clara, CA

Beruf: Software Engineer

  • Private Nachricht senden

5

09.06.2012, 18:08

Ich verstehe das Problem auch nicht so ganz.

Vorne weg: Wenn du zu 2D Koordinaten eine Hoehe, bzw Tiefe hinzufuegst, dann hast du 3D Koordinaten. Ziemlich genau das sind 3D Koordinaten, nix anderes ;)

Wenn du deine Vector2f durch Vector3f ersetzt, dann wirst du weiter x und y fuer die 2D koordinaten verwenden und kannst die Tiefe in der Z Koordinate Speichern.
Fuer die 2D Karte kannst du also weiterhin die X und Y Koordinaten darstellen und fuer Zielberechnungen benutzt du X, Y und Z.

Ob du Y oder Z fuer die Hoehe verwendest ist einfach eine Frage der Perspektive. Drehe die Kamera einfach so, dass Z nach oben/unten zeigt.

Lars

Frischling

  • »Lars« ist der Autor dieses Themas

Beiträge: 14

Wohnort: Hamburg

Beruf: Musiker / Fotograf

  • Private Nachricht senden

6

09.06.2012, 18:36

Thanks!

Bin jetzt auch schon eine Ecke weiter gekommen und habe das ganze (fast) gelöst. So nach ein paar Wochen durchprogrammieren sieht man manchmal den Wald vor lauter Bäumen nicht und man sollte mal wieder ein paar Tage was anderes machen ... 8|

Gruß,
Lars

Lars

Frischling

  • »Lars« ist der Autor dieses Themas

Beiträge: 14

Wohnort: Hamburg

Beruf: Musiker / Fotograf

  • Private Nachricht senden

7

09.06.2012, 19:40

Jetzt h abe ich noch ein Problem mit der Bewegung eines Objects von X/Y/Z-1 nach X/Y/Z-2 ;(

Meine 2D Bewegungen habe ich durch die Erklärung von dot in folgendem thread hin bekommen LINK

Aber wie mache ich das mit der Z-Koordinate ?

Meine Positionsvectoren enthalten folgende Koordinaten:

x = x position
z = y position
y = Tiefe bzw. Höhe des Objektes.

Gruß,
Lars

dot

Supermoderator

Beiträge: 9 833

Wohnort: Graz

  • Private Nachricht senden

8

09.06.2012, 19:42

Na interpoliert die Punkte einfach linear. Wie würdest du denn eine Bewegung nur in X/Y realisieren!?

DeKugelschieber

Community-Fossil

Beiträge: 2 664

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

9

09.06.2012, 21:38

normalisieren(xyz2 - xyz1) = Richtung in die dein Schiff fährt. Um das dann in 3D auch passend auszurichten schreibst du den Vektor einfach in die Modelview als Rotationsmatrix...

Werbeanzeige