Umrechnung Plattprojektion in Kugelrotation

Situation:

Ich habe eine interessante Visualisierungs-Idee entwickelt und habe nun ziemliche Probleme, diese Idee in Formeln zu packen. Umgesetzt wird alles in Flash. Ich bin auch schon recht weit, komme aber an einem Punkt nicht weiter und bitte um etwas Nachhilfe: Es geht um Kugelgeometrie/-rotation und die Umrechung von quadratischer Plattprojektion in 3 Drehachsen einer Kugel.

Problembeschreibung:

Ich möchte einen „Weltreisenden“ auf einer quadratischen Plattkartenprojektion der Erdkarte herumsteuern in x- und y-Koordinate (Breiten und Längengrad, bzw. theta und phi in Kugelkoordinaten). Ausserdem soll der „Reisende“ eine Blickrichtung haben, sich also auf seinem aktuellen Standpunkt um die eigene Achse drehen können. So dass man z.B. in Europa steht und Richtung Russland blickt. Das hat dann auch den Vorteil der intuitiveren Steuerung: Links/Rechts für ‚Auf der Stelle drehen‘ und Vorwärts für ‚In Blickrichtung reisen‘.

Diese 3 Werte: x, y und Blickrichtung möchte ich nun übertragen auf eine in 3 Achsen drehbare Erdkugel, die sich entsprechend dieser 3 Werte ausrichtet. Also vom Prinzip quasi wie google-earth. Der Userstandpunkt ist immer „oben“ auf der Kugel und Änderung der Blickrichtung dreht die Erde „unter mir“. Wenn ich dann „vorwärts“ fliege dreht sich die Erde unter mir, so als würde ich auf einem riesigen Autoreifen laufen (oder eben auf einer riesigen Kugel).

Der Ganze Sinn der Sache: Ich verteile dann später auf der Karte (UND der Erdkugel) eine Handvoll „Gebäude“ auf den entsprechenden Längen/Breitengraden die entsprechend meiner Position auf der Erde am Horizont aufsteigen und anklickbar sind. Man kann also interaktiv eine 3D-Icon Welt bereisen.

Was ich schon hinbekommen habe:

Die Umrechnung Kartesische-/Kugelkoordinaten und zurück. Die Transformation zurück in die 2D-Bildebene auch. Ich kann auch schon den Reisenden korrekt auf der 2D-Karte verschieben (siehe Projektbeispiel-Link weiter unten) und er nimmt auf der Erdkugel gleichzeitig die richtige Position ein. Und ich kann auch die Kugel in 3 Achsen drehen. Letzteres allerdings recht ziellos.

Wo ich nicht weiterkomme:

Ich habe keine Ahnung, welche Achse ich nun wie drehen muss, damit der Standpunkt des Reisenden bei der Kugel „oben“ sitzt und sich die Erde dann um diesen Punkt dreht. Womöglich geht es um so etwas wie eine Tangentialebene? Meine Rotationen scheinen auch die Erde ‚global‘ zu drehen, d.h. die Drehachsen drehen sich nicht mit.

Ich habe den aktuellen (interaktiven) Projektstand zum besseren Verständnis hier abgelegt:

http://www.zunds.de/kugelproblem/wissensweltreise_6…

Danke für Eure Hilfe oder Tipps oder ‚Lernrichtungs-Hinweise‘. Auch Äusserungen wie „Vergiss es - Viel zu kompliziert“ würden mir weiterhelfen - bin um jedes Feedback froh.

Gregor

Hallo Gregor,

ich werde mich knapp fassen. Bei Unklarheiten nachfragen.

Bekannt aus den Pixelkoordinaten auf der rechteckigen Weltkarte (RWK) sind:
  θ°, φ° = Koordinaten des Users auf der RWK
  θ, φ = Koordinaten eines Objekts auf der RWK

Gesucht:
  x’, y’ = kartesische Screen-Koordinaten des Objekts auf der Erd-„Scheibe“

Lösung:
  x’ = R sin(θ’) cos(φ’)    
  y’ = R sin(θ’) sin(φ’)

mit
  R = Radius der Erd-Scheibe (Pixelzahl)

φ’ = [2π –] arccos(x’/√(x’² + y’²))
    (eckige Klammer aktiv, wenn y’
( c + (1-c)u² (1-c)uv + sw (1-c)uw - sv )
( )
( (1-c)uv - sw c + (1-c)v² (1-c)vw + su )
( )
( (1-c)uw + sv (1-c)vw - su c + (1-c)w² )

mit c = cos(α), s = sin(α)

In Deinem Fall ist (u, v, w) = (–sinφ°, cosφ°, 0) (*), und der Drehwinkel ist θ°.

(*) weil das der Einheitsvektor ist, der senkrecht auf der Ebene steht, die den Erdmittelpunkt, den Nordpol und den User enthält. Dies ist die Achse, um die das Koordinatensystem gedreht werden muss (einverstanden?).

Achso: Nein, einfacher gehts nicht :smile:

Gruß
Martin

Hallo Martin,

erstmal viiiiielen Dank, das hat mir schon viel weiter geholfen, hab den ganzen Tag damit verbracht. Dein Angebot, bei Unklarheiten nachzufragen nehme ich gerne an :smile:

Habe jetzt alles soweit implementiert dass man einen beliebigen Einheitsvektor (per Keyboard) setzen kann und das System sich um diesen dreht:

http://www.zunds.de/kugelproblem/wissensweltreise_7…

Fängt allerdings bei höheren Werten für u,v,w an komisch zu reagieren… (ich glaube ich habe „Einheitsvektor“ noch nicht recht gecheckt)

Folgendes habe ich noch nicht verstanden:

Du schreibst:

„In Deinem Fall ist (u, v, w) = (–sinφ°, cosφ°, 0) (*), und der Drehwinkel ist θ°.“

Hm, zur Definition des Vektors (Drehachse) müssen doch φ° UND θ° herangezogen werden sonst weiss die Achse ja gar nicht wohin sie kippen soll; und der Drehwinkel alpha ist dann der Drehwinkel des UserCursors auf der Karte; nicht θ°. Oder?

Aber, wie ermittle ich den Einheitsvektor aus φ° und θ°? Und welcher Art sind diese 3 Parameter „u,v,w“; Abstände vom Nullpunkt oder Winkel? Dürfen die nur zwischen 0 und 1 liegen?

danke und gute Nacht, muss jetzt Monitor im Ersten schauen,

Gregor

Update:

habe das jetzt einigermassen verstanden mit dem Einheitsvektor und implementiert über

c1=cos(a)sin§
c2=sin(a)sin§
c3=cos§

Das System scheint zu funktionieren. Allerdings dreht sich nun auch gleich noch die Achse mit. Und für PHI=0 oder 180° dreht sich NUR die Achse wenn man nur Theta variiert und der Drehwinkel 0 ist („hoch“ oder „runterfährt“):

http://www.zunds.de/kugelproblem/wissensweltreise_8…

schöne Grüße, Gregor

http://www.zunds.de/kugelproblem/wissensweltreise_8…

Ja, das passt noch nicht. Wie mir unterdessen klar geworden ist, stimmt mein Lösungsvorschlag auch nur im Grundsatz, aber nicht im Detail. Grund: Der User hat ja nicht nur seine Position (theta, phi), sondern auch noch eine lokale Orientierung = seine „Blickrichtung“ gemessen an Nord-Süd-West-Ost an seinem Standpunkt. Die muss in die Berechung sowohl der Achse als auch des Drehwinkels eingehen (die Ausgabe-Erd-Scheibe rotiert ja, wenn der User sich stillstehend nur um sich selbst dreht – richtig?). Die Frage ist also: Welches ist die richtige Drehachse und um welchen Winkel muss gedreht werden? Sorry, noch hab ich darauf keine Antwort *kopfzerbrech*.

Gruß zurück und schönes WE
Martin

Grund: Der User hat ja nicht nur seine
Position (theta, phi), sondern auch noch eine lokale
Orientierung
= seine „Blickrichtung“ gemessen an
Nord-Süd-West-Ost an seinem Standpunkt. Die muss in die
Berechung sowohl der Achse als auch des Drehwinkels eingehen
(die Ausgabe-Erd-Scheibe rotiert ja, wenn der User sich
stillstehend nur um sich selbst dreht – richtig?). Die Frage
ist also: Welches ist die richtige Drehachse und um

Ich habs schon fast :smile:

Der Einheitsvektor für die Rotation errechnet sich aus den beiden Standortkoordinaten theta und phi. Der Rotationswinkel ist die Blickrichtung (Drehung um beliebige Achse). Klappt 1a. Allerdings wird natürlich diese ACHSE gekippt, nicht die Erde. Wenn ich will, dass die Erde sich unter dem User dreht, muss ich sie wieder zurückkippen, und zwar um die beiden lotrechten Vektoren zu dieser im ersten Schritt gekippten Drehachse für die Blickrichtung. Die Werte dieser beiden „Rückstell“-Achsen müssten -theta und -phi sein - dann wäre das Ganze System wieder geradegerückt.

Ich habe jetzt schon ein System mit 3 LOKALEN Drehachsen alpha, beta, gamma. Mit Koordinatensystem-achsen, also globalen Achsen wollte es mir nicht gelingen, die Achse in Abhängigkeit zu phi und theta wieder geraderücken.

Mein Problem ist im Moment, die beiden Einheitsvektoren zu finden, die beide lotrecht zum ersten Vektor sind (meine Blickrichtungsdrehachse).

Diese errechnet sich aus

u_alpha = cos(theta) * cos(phi)
v_alpha = cos(theta) * Math.sin(phi)
w_alpha = sin(theta)

Jetzt dachte ich, ich finde die beiden anderen indem ich jeweils 90 grad addiere (oder subtrahiere):

u_beta = cos(theta+PI/2) * cos(phi)
v_beta = cos(theta+PI/2) * Math.sin(phi)
w_beta = sin(theta+PI/2)

und

u_gamma = cos(theta) * cos(phi+PI/2)
v_gamma = cos(theta) * Math.sin(phi+PI/2)
w_gamma = sin(theta)

Das gibt aber das Problem, dass für theta = -90 („Polkappen“) die Vektoren alpha (=Blickwinkel) und gamma (eine lokale Rückstellachse) zusammenfallen und nicht mehr lotrecht sind. (Wobei ‚lotrecht‘ sicher der falsche Begriff ist im 3D-Raum).

Heul! Mein Vektor schwankt - Ich bin schon so nah dran …

schöne Grüsse, Gregor

So, ich hab mittlerweile den richtigen Dreh rausgekriegt :smile:. Der Schlüssel liegt in der Hintereinanderausführung von Drehungen. Nachdem ich das gerafft hatte, war die (nachweislich funktionierende) Lösung erstaunlich einfach.

Ich habe jetzt schon ein System mit 3 LOKALEN Drehachsen

Dann denkst Du wahrscheinlich (noch) zu kompliziert. In diese „Falle“ bin ich auch getappt.

Hast Du mittlerweile eine Lösung gefunden? Wenn ja, bedarf es ja keiner weiteren Erklärungen hier. Wenn nicht, schreib mir bei Interesse eine Mail.

Gruß
Martin