Ich habe bereits eine OpenGL-Komponente programmiert, die mittels gltranslate und gltranslate auf Mouse-Interaktionen reagiert. Dazu werden die Drehwinkel Alpha, Beta, Gamma benutzt. Jetzt würde ich gerne eine Unterstützung für 3D-Mäuse implementieren. Bewegungen der 3D-Maus werden als relative Translationen und Rotationen ausgelesen. Das Problem ist nun, dass man bisher mit der Maus um feste Achsen drehen konnte (z.B. glrotate(alpha,1,0,0)). Für die Nutzung einer 3D-Maus soll nun immer um die aktuellen Objekt-Achsen gedreht werden. Dazu habe ich folgendes gefunden: http://wiki.delphigl.com/index.php/Tuto ... hse_drehen Allerdings will ich meine Steuerung/Anzeige der Euler-Winkel (alpha,beta,gamma) weiterhin behalten. Also würde ich gerne mit den aktuellen Euler-Winkeln und der relativ Bewegung der 3D-Maus neue Euler-Koordinaten ausrechnen.
Habt ihr vielleicht eine Idee, wie man das am besten/einfachsten realisiert?
Ich habe selbst erst mit OpenGL angefangen und ebenfalls ein drehbares Objekt programmiert, dabei hatte ich dasselbe Problem wie Du, ich habe auch mit den Eulerwinkeln angefangen, weil mir das am naheliegensten schien, es hat sich jedoch im Vergleich zur Verwendung von Vektoren als total unpraktisch herausgestellt - wohl ein Grund, warum alle Welt Vektoren und Matrizen verwendet
Ich bin wie gesagt ein Anfänger, aber ich sehe das inzwischen so:
Die Eulerwinkel kann man sich theoretisch beliebig bestimmen, also auf welche Achse bezogen und in welcher Reihenfolge und in welche Richtung, Wikipedia gibt hier auch einige Beispiele und Normen (z.B. yaw, nick, roll wie in der Luftfahrt etc). Die Winkel werden dann verwendet, um vor dem Zeichnen mit OpenGL um drei Achsen zu drehen, wobei während den drei Drehungen immer um die momentan lokale Achse gedreht wird, wie Du ja bereits geschrieben hattest.
Das erste Problem ist dabei, dass man anhand der (lokalen) Winkel nicht sofort sagen kann, wie eine bestimmt Achse nun letztlich im globalen Raum steht, da die Drehungen ja aufeinander folgen. Je nach Definition gilt das nur für ein oder zwei Achsen. Die Lage einer Achse, die von zwei Drehungen betroffen ist muss man sich dann erst umständlich berechnen.
Als zweites hatte ich auch das Problem Drehungen um beliebige weitere Achsen zu implementieren. In meinem Fall war das eine Kugel, die bei Bewegung um eine Achse quer zur Bewegungsrichtung (unabhängig von ihrer Orientierung) gerollt ist. Hier müsste man quasi die Drehungen der drei Winkel berechnen, mir ist nicht so einfach klar, wie das möglich ist (das ist wohl auch momentan dein Problem).
Und schließlich gibts noch das Problem des "Gimbal Locks", also im Grunde, dass die Darstellung mit Eulerwinkeln nicht ein-eindeutig (invertierbar) ist. Wenn Du beispielsweise bei einem Flugzeug die Nase senkrecht in die Luft hälst ist "Yaw" (also die Flugrichtung parallel zur Erdoberfläche) identisch mit "Roll". Möglicherweise möchtest oder musst du aber mal eine gegebene Ausrichtung in Vektoren umrechnen (z.b. für Spiegelungen, Drehungen o.Ä.) und dann in dein Winkelsystem zurück (was nicht eindeutig geht) und in diesem Fall hast du ein Problem!
Nur mit Vektoren ist dagegen alles ganz einfach:
Du hast ein lokales Dreibein/Rechtssystem angegeben als normierte Vektoren mit (globalen) Koordinaten (siehe Tutorial). Die Drehmatrix für Opengl musst du nicht berechnen, du nimmst einfach die drei Vektoren als Spaltenvektoren der Matrix, die ist dann auch automatisch unitär, das wars. Bei einer Drehung um eine beliebige Achse berechnest du die Drehmatrix (siehe Tutorials oder Wikipedia) und wendest sie auf alle drei Vektoren an. Bei dir wären die Drehachsen ja dann deine Mausachsen, also ja gerade eine der drei Koordinatenachsen. Gut ist der Tip aus dem Tutorial die Vektoren am Ende noch mal nachzunormieren.
Wenn Du ein Vektordreibein als Grundlage für dein Programm verwendest, dann könntest du vielleicht dann daraus im Anschluss deine Winkel berechnen und dem Benutzer anzeigen. Ich denke die Funktion arctan2 (delphi7) ist hier angebracht, es hängt natürlich von deinen konkreten Winkeldefinitionen und deiner Drehreihenfolge ab, wie man die Winkel aus den Vektoren zurückberechnet. Das ist nicht schwierig aber etwas fummelig und mühsam und wahrscheinlich mit viel Ausprobieren verbunden
Ich hoffe, der Tip ist hilfreich für Dich. Wenn du es unbedingt auschließlich über Winkel/glrotate versuchen willst, dann schreib mal deine konkrete Definition hier hin, ich halte es aber nicht für empfehlenswert!
Grüße Delfit
Zuletzt geändert von Delfit am Mi Jun 29, 2011 21:17, insgesamt 2-mal geändert.
Danke für die ausführliche Antwort! Ich habe aufgegeben mit Winkeln zu rechnen und bin froh durch deinen Beitrag in der Entscheidung unterstützt zu werden Ich habe jetzt eine 3D Maus in die Software implementiert und die Drehung um die lokalen Achsen funktioniert wunderbar. Der Nutzer kann auch über einen Dialog drei Eulerwinkel vorgeben und die Achsen richten sich dementsprechend aus (Reihenfolge: Alpha, Beta, Gamma). Angezeigt kriegt er die aktuellen Euler-Winkel nicht und muss sich damit abfinden
Mitglieder in diesem Forum: Google [Bot] und 8 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.