Seite 1 von 1
Euler Winkel vermeiden, was meint ihr damit?
Verfasst: 02.12.2012, 19:37
von Lichtweite
Hallo,
da ich noch recht frisch in dem Thema 3D bin, lese ich mir hier den ein oder anderen Thread durch und verstehe natürlich nur die Hälfte. Bei einem Thread über den
Einsatz von Matrizen oder Quaternionen bin ich auf die Aussage gestoßes, dass man nicht mit Eulerwinkeln arbeiten soll.
Was meint ihr damit? Den Winkel einer Rotation nicht in Rad(also 2xPI) oder Grad angeben? Wenn nicht so, wie gibt man dann den Winkel an? Ich dachte bis dato immer wenn ich ein Objekt z.b ständig rotieren will addiere ich halt immer ein Rad oder Grad dazu, achte auf den Überlauf wenn die 360grad o. 2PI voll sind und übergebe dann diese Winkel meiner Rotationsmatrix. Dann werden alle Matrizen multipliziert und die Ergebnismatrix wird auf die Vertexe angewendet.
Ich habe gerade das Gefühl gar nix verstanden zu haben^^
Wäre nett wenn mir das einer erklären könnte.
Re: Euler Winkel vermeiden, was meint ihr damit?
Verfasst: 02.12.2012, 19:49
von Krishty
Euler-Winkel heißt: Drei Rotationen um je einen bestimmten Winkel auf je einer Raumachse hintereinander; üblicherweise Z, Y, X.
Mit denen ist wahnsinnig schwer zu rechnen – wenn du das Objekt zum Beispiel nach rechts oben rotieren willst, ist das erst um Y und dann um X, oder erst um X und dann um Y (da kommt ja Unterschiedliches raus)? Wie rechnest du aus, wie groß der Winkel auf der jeweiligen Achse ist? Usw usf.
In direktem Kontrast steht z.B., deine Rotationen als Drehmatrix oder Quaternion zu speichern. Beide kannst du im Gegensatz zu Euler-Winkeln recht einfach aus einem Vektor und einem Winkel konstruieren. Bei beiden ist die weitere Verarbeitung kohärent – egal, wie deine Rotation vorher aussieht; um die neue Rotation darauf anzuwenden führst du immer dieselben Rechnungen durch. Bei Euler ist das anders – wenn das Objekt z.B. gerade nach oben zeigt, ist jede Rotation um Y gleichzeitig eine Rotation um Z (Gimbal Lock); wie rotierst du dann noch?
Euler-Winkel sind darum irre schwer zu verarbeiten. Außerdem fallen endlos viele überflüssige sin()-, cos()- und atan2()-Aufrufe an, die bei Rotationsmatrizen und Quaternions bereits „fertig“ in der Datenstruktur liegen.
Re: Euler Winkel vermeiden, was meint ihr damit?
Verfasst: 02.12.2012, 20:14
von Lichtweite
Ich bin mir nicht sicher ob ich es verstanden habe. Wenn ich also mein Objekt in eine bestimmte Richtung drehen will, rechne ich mir die drei "Zielwinkel" aus und kann ja dann mit der Rotationsmatrix, die ja drei Winkel auf einmal aufnimmt, dann in interpolierten Schritten zum Ziel kommen?
Sorry, vielleicht bringen ich das auch alles im Moment durcheinander, habe irgendwie ein Knoten im Kopp^^
Re: Euler Winkel vermeiden, was meint ihr damit?
Verfasst: 02.12.2012, 20:20
von eXile
Man kann, wie schon bemerkt wurde, Rotationen auf verschiedene Arten darzustellen. Um mich selbst zu zitieren:
eXile hat geschrieben:Im Endeffekt sind Quaternionen nur eine Ansicht auf eine Rotation; andere Ansichten sind komplexwertige 2×2-Matrizen, reellwertige 3×3-Matrizen, reellwertige dreidimensionale Zeilen- oder Spaltenvektoren (Eulerwinkel und äquivalente Winkelparametrisierungen). Alles sind unterschiedliche Ansichten auf dieselbe zugrunde liegende Sache. Genauso wie Zeilen- und Spaltenvektoren unterschiedliche Ansichten auf dieselbe zugrunde liegende Sache sind.
Die dort angesprochenen 3×3-Matrizen sind die bekannten Rotationsmatrizen.
Da Krishty so gut vorgelegt hat, nur noch kleine Ergänzungen:
Krishty hat geschrieben:Euler-Winkel heißt: Drei Rotationen um je einen bestimmten Winkel auf je einer Raumachse hintereinander; üblicherweise Z, Y, X.
Genau. Alle 12 Möglichkeiten sind XYZ, XZY, YXZ, YZX, ZXY, ZYX; XYX, XZX, YXY, YZY, ZXZ, ZYZ. Immer wenn jemand dir Euler-Winkel gibt, muss er auch diese Notation mit angeben.
Häufig
braucht man gar keine Euler-Winkel. Als Guideline: Man braucht
nie Eulerwinkel, oder man macht wohl was falsch. Will man ein Objekt in eine bestimmte Richtung zeigen lassen? Rotationsmatrix aus dem Vektor bestimmen. Will man zwischen zwei Orientierungen interpolieren? SLERP von Quaternionen. Will man zwischen ein Modell mit verschiedenen Posen animieren? Konvexkombination von Rotationsmatrizen oder NLERP von Quaternionen. Raumschiff soll mittels Düsen im Raum gedreht werden? Physik-Toolkit gibt Drehmoment an, kann in Quaternionen umgerechnet werden.
Lichtweite hat geschrieben:Ich bin mir nicht sicher ob ich es verstanden habe. Wenn ich also mein Objekt in eine bestimmte Richtung drehen will, rechne ich mir die drei "Zielwinkel" aus und kann ja dann mit der Rotationsmatrix, die ja drei Winkel auf einmal aufnimmt, dann in interpolierten Schritten zum Ziel kommen?
Nein. Du musst die aktuelle Orientierung und die Zielorientierung von Vektoren in Quaternionen konvertieren, zur Interpolation einen SLERP berechnen, interpolierte Orientierung als Rotationsmatrix ausrechnen und anwenden. Wenn du das nicht tust, kommt
so etwas bei raus.
Re: Euler Winkel vermeiden, was meint ihr damit?
Verfasst: 02.12.2012, 23:39
von dot
Re: Euler Winkel vermeiden, was meint ihr damit?
Verfasst: 03.12.2012, 00:26
von eXile
So etwas wie ZXZ geht wohl nicht in deren Kopf rein.
http://www.youtube.com/watch?v=zc8b2Jo7mno hat geschrieben:With any object, the key is to find a rotation order that has the least chance of hitting gimbal. So the trick here is to find the direction the object is least likely to face.
Re: Euler Winkel vermeiden, was meint ihr damit?
Verfasst: 03.12.2012, 12:38
von Lichtweite
Danke euch für die Aufklärung. Eine Frage die ich jetzt habe betrifft die Rotationsmatrix, wo man gleich alle drei Winkel auf einmal angibt. Diese zeigt dann auch das gleiche Verhalten wie wenn man die drei Rotationen hintereinander ausführen würde? Weil die kombinierte Multirotationsmatrix auch nur durch Multiplikation von drei nacheinander folgenden Rotationen entstanden ist? Gibt es also genau so viele kombinierte Rotationsmatrizen, wie es Möglichkeiten gibt die Achsen einzeln nacheinander zu rotieren, also XYZ, YXZ, YZX etc.?
In eurer Datenstruktur für 3D-Objekte, habt ihr da auch dann immer auch drei Richtungsvektoren drin damit ihr wisst wo bei eurem Objekt oben(y+), rechts(x+) und vorne(z-) ist?
Wie bestimmt ich eigentlich aus einem Vektor eine Rotationsmatrix?
Sorry wenn ich soviel frage, ist mein erster Versuch einer kleinen 3D-Engine und immer wenn ich denke ich habe die Grundlagen verstanden ,merke ich dass ich doch noch Fragen haben.
Re: Euler Winkel vermeiden, was meint ihr damit?
Verfasst: 03.12.2012, 12:46
von dot
Lichtweite hat geschrieben:Weil die kombinierte Multirotationsmatrix auch nur durch Multiplikation von drei nacheinander folgenden Rotationen entstanden ist? Gibt es also genau so viele kombinierte Rotationsmatrizen, wie es Möglichkeiten gibt die Achsen einzeln nacheinander zu rotieren, also XYZ, YXZ, YZX etc.?
Frag dich einfach mal, was genau du unter einer "kombinierten Multirotationsmatrix" verstehst und gib dir die Antwort dann selbst... ;)
Lichtweite hat geschrieben:Wie bestimmt ich eigentlich aus einem Vektor eine Rotationsmatrix?
Gar nicht, ein Vektor allein legt keine Rotation fest. Ein Vektor und ein Winkel dagegen schon:
http://en.wikipedia.org/wiki/Rotation_m ... _and_angle
Re: Euler Winkel vermeiden, was meint ihr damit?
Verfasst: 03.12.2012, 13:01
von Lichtweite
Da meine "Multiroationsmatrix" auch nur ein Produkt der Matrizen für eine Drehung um X, Y und Z ist sollte ich hier auch dasselbe Problem haben, wie wenn ich die Drehungen einzeln anwenden würde. Da ja einen Multiplikation von Matrizen nicht kommutativ ist.
Ok, die Matrix für Rotation um einen beliebige Achse im Raum in Form eines Einheitsvektors kannte ich sogar. Danke, jetzt muss ich nur die Vektoren normalisieren, den Winkel zwischen ihnen berechnen und kann dann mit der eben genannten Matrix die Transformation durchführen.
Hab ich es jetzt verstanden, oder immer noch nicht?^^
Re: Euler Winkel vermeiden, was meint ihr damit?
Verfasst: 03.12.2012, 13:03
von dot
Lichtweite hat geschrieben:Da meine "Multiroationsmatrix" auch nur ein Produkt der Matrizen für eine Drehung um X, Y und Z ist sollte ich hier auch dasselbe Problem haben, wie wenn ich die Drehungen einzeln anwenden würde. Da ja einen Multiplikation von Matrizen nicht kommutativ ist.
Bingo
Lichtweite hat geschrieben:Danke, jetzt muss ich nur die Vektoren normalisieren, den Winkel zwischen ihnen berechnen und kann dann mit der eben genannten Matrix die Transformation durchführen.
Was für Vektoren normalisieren, was für Winkel berechnen!?
Re: Euler Winkel vermeiden, was meint ihr damit?
Verfasst: 03.12.2012, 13:11
von Lichtweite
Na, für die Drehmatrix brauche ich doch einen Eineitsvektor, oder? Tja und wenn ich zwei Objekte habe und beide gleich Ausrichten will muss ich doch von beiden Richtungsvektoren erst einmal die Winkel berechnen um zu wissen wie weit ich drehen muss.
Und ich dachte ich hätte was kapiert^^
Re: Euler Winkel vermeiden, was meint ihr damit?
Verfasst: 03.12.2012, 13:14
von dot
Welche Objekte willst du wie genau ausrichten?
Re: Euler Winkel vermeiden, was meint ihr damit?
Verfasst: 03.12.2012, 13:22
von Lichtweite
Keine Ahnung war nur ein konstruiertes Anwendungsbeispiel, wo ich ein Objekt an einem anderen ausrichten will. Was weiß ich vielleicht ein Auto welches ein anderes verfolgt oder sonst was.
Ich versuch mir halt die Anwendungen für Rotationen vorzustellen, da ich noch nix zum Probieren habe muss ich mir erst mal alles ganz trocken vorstellen.
Re: Euler Winkel vermeiden, was meint ihr damit?
Verfasst: 03.12.2012, 13:24
von dot
Dafür brauchst du keine Rotationswinkel oder sonstwas. Wenn du die Basisvektoren des Koordinatensystems berechnen kannst, dann kannst du direkt eine Matrix draus bauen, einfach in die Zeilen bzw. Spalten (je nach Konvention) eintragen und fertig...
Re: Euler Winkel vermeiden, was meint ihr damit?
Verfasst: 03.12.2012, 13:36
von Lichtweite
Ok, wie ist es wenn ich ein Vehikel über ein unebenes Terrain bewegen will. Nehme ich da auch nur die Normale eine Terrainfläche und multipliziere sie mit den Basisvektoren meines Objektes und dann "steht" mein Objekt senkrecht auf der Fläche?(Nachdem ich diese Matrix natürlich auf alle Vertexe angewendet habe)
Re: Euler Winkel vermeiden, was meint ihr damit?
Verfasst: 03.12.2012, 16:31
von eXile
Du nimmst den Vorwärts-Vektor des Vehikels und den Normalenvektor der darunterliegenden Oberfläche, erstellst daraus ein orthogonales Basissystem, und packst diese Basisvektoren als Spaltenvektoren in eine Matrix. Das ist die gesuchte Rotationsmatrix.
Re: Euler Winkel vermeiden, was meint ihr damit?
Verfasst: 03.12.2012, 16:59
von Lichtweite
dot hat geschrieben:Dafür brauchst du keine Rotationswinkel oder sonstwas. Wenn du die Basisvektoren des Koordinatensystems berechnen kannst, dann kannst du direkt eine Matrix draus bauen, einfach in die Zeilen bzw. Spalten (je nach Konvention) eintragen und fertig...
Ok und wozu brauche ich dann Algorithmen wie die hier?
http://www.cs.brown.edu/~jfh/papers/Mol ... /paper.pdf Wo ich aus zwei Einheitsvektoren die Rotationsmatrix berechnen kann? Welche ich ja dann auf die Punkte meine Objektes anwende um es in dieselbe Richtung wie die des andere Objektes "schauen" zu lassen.
Re: Euler Winkel vermeiden, was meint ihr damit?
Verfasst: 03.12.2012, 18:38
von Lichtweite
Ich glaube, jetzt habe ich es. Aus einem Richtungsvektor kann ich ja die beiden anderen orthogonalen Vektoren durch das Kreuzprodukt berechnen und dann mache ich aus diesen drei Vektoren einfach einen Matrix, wo die drei senkrecht untereinander eingetragen werden. Diese Matrix wende ich dann auf mein Objekt an und habe es in Richtung des Richtungsvektoren gedreht, richtig?
Re: Euler Winkel vermeiden, was meint ihr damit?
Verfasst: 03.12.2012, 20:50
von dot
Bingo :)
Re: Euler Winkel vermeiden, was meint ihr damit?
Verfasst: 03.12.2012, 22:39
von eXile
Lichtweite hat geschrieben:Aus einem Richtungsvektor kann ich ja die beiden anderen orthogonalen Vektoren durch das Kreuzprodukt berechnen
Aus dem Richtungsvektor
und dem Normalenvektor des Terrains; aber ich vermute mal, das meintest du damit. ;)