Punkt (x, y, z) um 2 Achsen drehen (kamerarelativ)
-
Ein Punkt (x1, y1, z1) eines Körpers soll um 2 Achsen drehbar sein. Das kann man z.B. so realisieren
// Rotation um z-Achse x2 = x1 * cos(a) - y1 * sin(a); y2 = x1 * sin(a) + y1 * cos(a); z2 = z1; // optional // Rotation um x-Achse y3 = y2 * cos(b) - z2 * sin(b); z3 = y2 * sin(b) + z2 * cos(b);
Das funktioniert so gut - aus Sicht des Körpers (dreht man die x-Achse, dreht man die z-Achse relativ mit).
Nun möchte ich den Körper aber nicht um seine eigene Körperachse drehen, sondern um eine 'statische Achse' von einem festen Beobachterpunkt betrachtet. Also eher so wie wenn die Kamera um den Körper herum schwenkt (in dem geg. Fall ist es aber nicht möglich die Kamera um den Körper zu drehen).Wie muss man die Berechnung anpassen, damit sich die Rotation wie beschrieben verhält?
(Vermute, man muss für stat. Achsen die y3/z3 Berechnung wieder direkt auf y1 und z1 beziehen...hm...bloß wie kombiniert man jetzt x2/y2 und y3/z3 korrekt zum Ergebnis? Krieg grad nen Knoten im Kopf...)
-
Hier noch eine Beschreibung, damit man sich besser vorstellen kann, was gemeint ist und es auch z.B. mit einem Bleistift ausprobieren kann.
- Man betrachtet einen Körper von einem festen Kamerapunkt k aus
- Man dreht den Körper mal 90° nach links und 90° nach rechts und wieder zurück auf 0°, z.B. um die z-Achse (alles fein, so wie es soll)
- Jetzt dreht den Körper um 180° z.B. um die x-Achse
- Wiederholt man jetzt Schritt 2) so wirkt eine Drehung nach rechts in Körperperspektive von k aus jetzt seitenverkehrt wie eine Drehung nach links
- Es soll aber auch nach einer Drehung um die x-Achse die Drehung um die z-Achse von k aus sich immer gleich verhalten.
Hoffentlich verwirrt die Beschreibung nicht noch mehr...
Mit anderen Worten: Wie kann man einen Körper so (um zwei Achsen) rotieren, dass es (für jede Kombi der beiden Achsendrehwinkel) so erscheint als rotiere die Kamera um ihn (und nicht der Körper selbst).
-
FYI: Habe den Begriff für diese Art Steuerung nun endlich gefunden.
Er ist im Prinzip ähnlich wie eine sog. "Virtual Trackball" Steuerung.Beispiel siehe hier ab 23:33 https://www.youtube.com/watch?v=4_KkHLimetQ
Oder hier zum Ausprobieren: http://w3.eleqtriq.com/2011/11/traqball-2-0/Man findet diverse Quellen wie man sowas mit OpenGL implementieren kann, z.B.:
http://web.cse.ohio-state.edu/~hwshen/781/Site/Slides_files/trackball.pdfDie rufen zum Schluss aber alle glRotatef(angle, axis[0], axis[1], axis[2]); auf.
Diese Funktion für die Rotation um eine bel. Achse habe ich bei meinem Code (der keine fertige 3D-Lib/Engine nutzt) leider nicht. Das heißt weiter durch PDFs und Folien zu 'rotation about arbitrary axis' wühlen, bis es verstanden und auf den Code anwendbar ist...
-
Du mußt dann zuerst den Körper auf den Rotationspunkt verschieben, insgesamt also:
Translation, Rotation, -Translation
-
hatte so ein ähnliches Problem mal.
Kann mich jetzt nicht mehr genau erinnern, aber ich bin damals von Matrizen auf Quaternionen umgestiegen. Damit hat es dann geklappt.Wenn du es mal mit denen probieren möchtest könnte ich den Code raussuchen.
Generell würde ich aber auf bestehende Mathe Libs zurückgreifen, es macht keinen Sinn sowas mit Quaternionen neu zu implementieren.
Nimm z.B. glm, das ist eine Mathe Lib die sich sehr gut für OpenGL eignet, aber auch ohne OpenGL verwendet werden kann.