Zwei Winkel zu phi/theta einer Koord. des Kugelkoord. addieren

Neue Frage »

trent Auf diesen Beitrag antworten »
Zwei Winkel zu phi/theta einer Koord. des Kugelkoord. addieren
Wie kann man zwei bel. Winkel (alpha, beta) zu phi und theta einer Koordinate des Kugelkoordinatensystems addieren?

Hier wird ein Punkt P(x,y,z) in Kugelkoordinaten umgewandelt.
Dann möchte man P um zwei Achsen (Winkel alpha, beta) drehen und anschließend ins kart. Koordinatensystem zurück rechnen.

r = = Math.sqrt(x*x + y*y + z*z);
phi = Math.atan2(y, x) + alpha; // Rotation für alpha funktioniert
theta = Math.asin(z/r) + beta; // produziert Unfug, wenn beta != 0

x2 = r * Math.cos(theta) * Math.cos(phi);
y2 = r * Math.cos(theta) * Math.sin(phi);
z2 = r * Math.sin(theta);

Für eine Achse mit alpha funktioniert das wunderbar, die zweite produziert so Unfug. Vmtl. kann man beta nicht einfach so drauf addieren, sondern muss beachten, dass theta hier nur bis +-Pi/2 sinnvoll geht...

Wie muss man beta dazu addieren, damit auch hier eine saubere Rotation entsteht?

(Hintergrund warum ich nicht einfach im kart. Koortsystem mittels 1) rotiere ist, dass nicht gewünscht ist, dass der Körper mit P um die Achsen aus seiner Perspektive rotiert (dreht man eine Achse, dreht sich die andere aus Kameraperspektive mit). Erwünscht ist vielmehr, dass sich der Körper um zwei (aus Kamerasicht) statische Achsen rotiert

1)
x2 = x * cosA - y * sinA;
y2 = x * sinA + y * cosA;

y3 = y2 * cosB - z * sinB;
z3 = y2 * sinB + z * cosB;
)

Vielen Dank schon einmal!
HAL 9000 Auf diesen Beitrag antworten »

Zitat:
Original von trent
Wie muss man beta dazu addieren, damit auch hier eine saubere Rotation entsteht?

Vielleicht solltest du dir erstmal klar sein, um welche Achse du da überhaupt rotieren willst:

(a) Bei ist es klar, da rotierst du um die Polachse.

(b) Bei rotierst du in deiner formelmäßigen Umsetzung um eine äquatoriale Achse, die auf dem Radiusvektor des fraglichen Punktes senkrecht steht.

Wenn ich dich richtig verstehe, bist du mit (a) einverstanden, mit (b) aber nicht, weil diese Drehachse "dynamisch" von dem gewählten Punkt P abhängt - ist das so? Wenn du da auch gern eine feste (d.h. von P unabhängige) Drehachse haben willst, dann muss ich dich enttäuschen: Auf diese Weise kannst du nicht jeden Punkt P der Kugeloberfläche in jeden beliebigen anderen überführen - zumindest nicht mit nur diesen zwei Drehungen, da brauchst du noch eine dritte. unglücklich
trent Auf diesen Beitrag antworten »

Herzlichen Dank für Deine schnelle Antwort!

Ja genau, wollte mit beta um die Achse drehen um die theta schon natürlicherweise dreht. Also (b), eine Drehung um die äquatoriale Achse. Allerdings halt nicht auf +- 90° beschränkt, sondern um einen bel. Winkel (360° capable)

Dachte erst, dass man das mit einer Fallunterscheidung lösen kann, so a la:
wenn theta' > 90° (theta' = Math.asin(z/r) + beta), dann komme ich halt von der anderen Seite, also drehe phi um 180° und setze theta = 180° - theta' usw. Obwohl das in meiner Vorstellung aufgeht, sieht das Rotationsbild im Programm falsch/verzerrt aus. Hat also nicht funktioniert...

Oje...hatte befürchtet, dass es nicht so einfach geht. Wahrscheinlich muss ich mich jetzt doch mit Quaternionen auseinandersetzen?
trent Auf diesen Beitrag antworten »

Damit man einmal direkt sieht was gemeint ist:
magnitudo.org/misc/js13kgames/2015/test/

Hier kann man den Körper rotieren indem man die Maus nach links/rechts und oben/unten bewegt.
Allerdings ist nicht erwünscht, dass sich der Körper um die Achse aus seiner Perspektive dreht, sondern für den Beobachter statisch. Also wenn man nach rechts dreht, soll sich der Körper immer nach rechts aus Kameraperspektive drehen, auch wenn er vorher nach oben gedreht wurde. Das wäre für den Benutzer intuitiver.

(Ca. Zeile 522 in magnitudo.org/misc/js13kgames/2015/test/game.js )
trent Auf diesen Beitrag antworten »

BTW: Damit man sich nicht wundert: die Kamera bzw. Projektionsmatrix wollte ich hierfür, wenn irgendwie möglich, nicht anfassen.
Neue Frage »
Antworten »



Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »