Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

1

14.03.2014, 20:59

Quaternionen

Hallo!
Ich habe bei meinem Editor immer wieder das Gimbal-Lock Problem. Deshalb wollte ich auf Quaternionen ausweichen. Da der Nutzer trotzdem mit drei Eulerwinkeln arbeiten soll, frage ich mich nun, wie man das Problem umgeht. Reicht es aus, die drei Eulerwinkel in "eine Quaternione" umzurechnen, und mit dieser dann letztendlich eine Rotationsmatrix zu bauen?
Danke im Voraus!

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

14.03.2014, 21:25

Gimbal Lock ist ein inhärentes Problem von Eulerwinkeln. So lange du Eulerwinkel verwendest, wirst du die Möglichkeit von Gimbal Lock haben. Das ist prinzipiell bedingt; keine Quaternion der Welt vermag dagegen was auszurichten...

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

3

14.03.2014, 21:56

Nach meinem Wissen sind Quaternionen die Lösung für das Gimbal-Lock Problem.

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

14.03.2014, 21:57

Ja, so wird einem das leider oft erzählt. Ist dennoch falsch. Aber probier's doch einfach aus und sieh selbst... ;)

Die Lösung für das Gimbal Lock Problem ist, keine Rotationssequenz wie Eulerwinkel zu verwenden, die Gimbal Lock Stellungen zulässt. Ob du die einzelnen Rotationen durch Matrizen oder Quaternionen oder was auch immer sonst ausrechnest, ändert nichts daran, ob Gimbal Lock auftritt oder nicht. Das Problem liegt in der Eulersequenz, nicht in den Matrizen...

Hier ein Video, das die Problematik sehr gut erklärt: https://www.youtube.com/watch?v=zc8b2Jo7mno

Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »dot« (14.03.2014, 22:12)


Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

5

14.03.2014, 23:11

Ich würde es so ausdrücken: Quaternionen sind keine Lösung für das Gimbal-Lock Problem, wenn du weiterhin eigentlich mit Eulerwinkeln arbeitest. Von Eulerwinkeln nach Quaternionen umzurechnen ist bereits genauso problembehaftet wie von Eulerwinkeln nach Matrizen umrechnen.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

LukasBanana

Alter Hase

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

6

14.03.2014, 23:17

Wenn du die Rotationen in deinem Editor bislang mit Euler Winkeln gespeichert hast, und jetzt auf Quaternionen umsteigen willst, kann das sicher nicht schaden.
In meinem Editor kann man z.B. auf mehrere Arten die Objekte rotieren (Global, Lokal und abhängig von der Ausrichttung der Kamera), gespeichert werden die Rotationen aber immer in Form von Quaternionen.
Dadurch kann ich (eigentlich relativ Problemlos) beliebige Rotationen ausführen.
Wenn man in deinem Editor aber nur die 3 Euler Winkel angeben kann, wird das Gimbal Lock Problem vermutlich nicht verschwinden.
In meinem Editor kann man zwar auch Euler Winkel angeben, aber dafür kann man auch an den Achsen beliebig rumschrauben.
Hier ein Ausschnitt aus meinem Video Tutorial, vielleicht hilft das zum Verständnis.

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

7

15.03.2014, 13:29

Das ist ja mein Problem. Ich habe drei Achsen, mit denen der Benutzer das Objekt (im wolrd space) drehen kann. Ich habe jetzt zwei Ansätze ausprobiert: Drei Eulerwinkel direkt in eine Quaternione umwandeln und eine Quaternione nach der anderen miteinander multiplizieren, welche mithilfe von einer Achse und einem Winkel erstellt wurden. Bsp:

C-/C++-Quelltext

1
2
3
qRot = QuaternionFromAxisAngle(Vector3(0.0f, 0.0f, 1.0f), vRot.z);
qRot = QuaternionFromAxisAngle(Vector3(1.0f, 0.0f, 0.0f), vRot.x) * qRot;
qRot = QuaternionFromAxisAngle(Vector3(0.0f, 1.0f, 0.0f), vRot.y) * qRot;

Leider bleibt bei beiden Versuchen das Gimbal-Lock Problem bestehen. Wie kann ich sonst meine Orientierung speichern, ohne Gimbal-Lock, wenn der Nutzer mit drei Achsen das Objekt im world space rotieren können soll?

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

15.03.2014, 14:19

Solange Du mit Eulerwinkeln und einer Reihenfolgen-basierten Anwendung mehrerer Rotationen arbeitest, wirst Du das Problem des Gimbal Lock immer haben. Das wurde doch nun schon mehrfach gesagt.
Lies Dir den Beitrag von Lukas nochmal durch und schau Dir sein Video an und dann weißt Du, wie man es mit Quaternionen richtig macht.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige