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

BlazeX

Alter Hase

  • »BlazeX« ist der Autor dieses Themas

Beiträge: 478

Wohnort: DD

Beruf: Maschinenbau-Student

  • Private Nachricht senden

1

11.03.2010, 21:13

Quaternionen für linkshändige Koordinatensysteme

Hi Leute!
Ich hab mich vor längerer Zeit mal mit Quaternionen beschäftigt. Irgendwann hab ich mir dann eine Zusammenfassung geschrieben, und diese wegen mehreren Anfragen etwas umformuliert und "tutorialähnlich" geschrieben.

Hier ist der Downloadlink:
http://www.file-upload.net/download-2339945/Quaternionen-f-r-LHK.pdf.html

Falls es euch so gut gefallen sollte, könnt ihr es ja in die Tutorial-Section verschieben.

2

12.03.2010, 00:09

Ist wirklich nur eine sehr grobe Übersicht. Wenn man nicht weiß, was eine Quaternion ist, wird man es danach wohl immer noch nicht wissen. Besonders kritisch ist, dass du von einem Problem bei der Rotation sprichst, aber gar nicht erwähnt, was das Problem nun eigentlich ist.

Andererseits ist es aber schick formatiert und hat wohl alle wichtigen Formeln drin, soweit ich das also noch-nicht-quaternion-benutzt-habender Mensch beurteilen kann.
Ist jetzt halt die Frage, ob man das noch erweitern sollte oder lieber gleich auf bereits existierende Artikel verweisen sollte.

Wo wir gerade beim Thema sind. Hat jemand mal boost::quaternion benutzt? Boost Bibliotheken sind ja in der Regel sehr cool, ich schätze, es könnte sein, dass ich die benutzen werde.

http://www.boost.org/doc/libs/1_42_0/libs/math/doc/quaternion/html/boost_quaternions/quaternions.html
Lieber dumm fragen, als dumm bleiben!

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

3

12.03.2010, 10:14

Hier mal ein paar Kritikpunkte:

o Quaternionen sind nicht "einfach" gesagt 4 Zahlen sondern ein Zahlensystem welches die Komplexen zahlen erweitert.
o Zu was soll der Vektorpart denn eine Normale darstellen?
o Bei deiner Darstellung q = (w, x, y, z) fehlen die zusätzlichen Zahlen i, j und k. Also besser q = w + x*i + y*j + z*k = (w, \vec{v})
o Die Multiplikation lässt sich auch (ziemlich einfach) herleiten. Das wäre auch klar wenn in deiner Darstellung i, j und k nicht fehlen würden und die Multiplikationstabelle bekannt wäre.
o Von Johnathan_Klein angesprochenes Problem
o Unter "Rotation mit Quaternionen" sprichst du schon wieder von der Normalen. Meinst du vielleicht einen normierten Vektor? Das muss übrigens nicht für jeden Fall gegeben sein.
o Hast du als Winkelsymbol das Unendlichzeichen verwendet? Wieso?
o Das verketten von Transformationen bei Matrizen entspricht in der Reihenfolge dem bei Quaternionen. In deinem Beispiel würde bei Matrix Rot3 -> Rot2 -> Rot1 und bei Quaternion Rot1 -> Rot2 -> Rot3 die "ausführ"-Reihenfolge sein.

BlazeX

Alter Hase

  • »BlazeX« ist der Autor dieses Themas

Beiträge: 478

Wohnort: DD

Beruf: Maschinenbau-Student

  • Private Nachricht senden

4

12.03.2010, 18:09

Vielen Dank erstmal fürs Korrekturlesen. :D
Einige Stellen hab ich berichtigt.

o Quaternionen sind nicht "einfach" gesagt 4 Zahlen sondern ein Zahlensystem welches die Komplexen zahlen erweitert.
- Ok, der Vollständigkeit halber stehts jetzt mit drin

o Zu was soll der Vektorpart denn eine Normale darstellen?
- Da hatte ich selbst was falsch verstanden, ich habs berichtigt.

o Bei deiner Darstellung q = (w, x, y, z) fehlen die zusätzlichen Zahlen i, j und k. Also besser q = w + x*i + y*j + z*k = (w, \vec{v})
- Ich halte aber nicht viel von diesen ellenlangen Formulierungen. Eine feste Form ist mir da lieber.

o Die Multiplikation lässt sich auch (ziemlich einfach) herleiten. Das wäre auch klar wenn in deiner Darstellung i, j und k nicht fehlen würden und die Multiplikationstabelle bekannt wäre.
- Ich verweise mal auf die Quellen, da steht die Multiplikationstabelle drin. Die verkürzte Form war nur Copy'n'Paste ;)

o Von Johnathan_Klein angesprochenes Problem
- Oh, tut mir leid. Eigentlich wollte ich noch auf den Gimbal Lock zu sprechen kommen, hab das aber später wieder rausgenommen. Der Absatz ist jetzt weg. Außerdem verweiß ich in der Einleitung jetzt auf die Quellen für die Grundlagen.

o Unter "Rotation mit Quaternionen" sprichst du schon wieder von der Normalen. Meinst du vielleicht einen normierten Vektor? Das muss übrigens nicht für jeden Fall gegeben sein.
- Wie gesagt, das hab ich falsch verstanden. Ich meinte hier dir Rotationsachse. Habs berichtigt.

o Hast du als Winkelsymbol das Unendlichzeichen verwendet? Wieso?
- Das Winkelsymbol stellt eigentlich den griech. Buchstabe Alpha dar. ;)

o Das verketten von Transformationen bei Matrizen entspricht in der Reihenfolge dem bei Quaternionen. In deinem Beispiel würde bei Matrix Rot3 -> Rot2 -> Rot1 und bei Quaternion Rot1 -> Rot2 -> Rot3 die "ausführ"-Reihenfolge sein.
- Mir ging es hier um die Multiplikationsreihenfolge. Das Reihenfolge beim Verketten von Rotationen ist die selbe, ja, aber eben nicht die Multiplikation. Ich verstehe hier dein Problem nicht.


Mir kommt es auch nicht auf die exakte mathematische Definition an. Es muss funktionieren und das schnell. Alles andere wird erst wichtig, wenn es Probleme macht.
BTW nur vorbeugend: Ich hab eine 1 auf meine Facharbeit über komplexe Zahl bekommen, also versuch mich nicht mit Definitionen aufzuklären. ;) Seit dieser Facharbeit halte ich diese mathematische Exaktheit für pure Umwege.

Ich habe den Link aktualisiert.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

5

12.03.2010, 19:09

Zitat von »"BlazeX"«


- Ich halte aber nicht viel von diesen ellenlangen Formulierungen. Eine feste Form ist mir da lieber.


Dann fehlt aber etwas wichtiges...

Zitat von »"BlazeX"«


- Das Winkelsymbol stellt eigentlich den griech. Buchstabe Alpha dar. ;)


Hm... Das soll ein Alpha sein? Ok, mit viel Phantasie. ;)

Zitat von »"BlazeX"«


- Mir ging es hier um die Multiplikationsreihenfolge. Das Reihenfolge beim Verketten von Rotationen ist die selbe, ja, aber eben nicht die Multiplikation. Ich verstehe hier dein Problem nicht.


Du hast mich falsch verstanden. Die Ausführreihelfolge ist immer umgekehrt (und zwar bei Matrizen und Quaternionen) wie die Multiplikationsreihenfolge. Dein Beispiel ist falsch!

Zitat von »"BlazeX"«


Mir kommt es auch nicht auf die exakte mathematische Definition an. Es muss funktionieren und das schnell. Alles andere wird erst wichtig, wenn es Probleme macht.
BTW nur vorbeugend: Ich hab eine 1 auf meine Facharbeit über komplexe Zahl bekommen, also versuch mich nicht mit Definitionen aufzuklären. ;) Seit dieser Facharbeit halte ich diese mathematische Exaktheit für pure Umwege.


Ich halte möglichst genaue Definitionen für sinnvoll, gerade bei solchen Texten. Nicht exakte Definitionen tendieren schnell in Richtung falsche Definitionen (z.B. q = (w, x, y, z) find ich schon hart an der Grenze).

Wenn du die "mathematische Exaktheit für pure Umwege" hältst dann hat die Facharbeit irgendwie ihr Ziel verfehlt... Ich find genau das genial an der Mathematik, das alles super exakt und glasklar ausgedrückt werden kann.

6

12.03.2010, 20:38

Facharbeit ist halt Schule, da achtet keiner darauf, das irgendetwas formal oder exakt ist.
Es ist wohl ein Unterschied, ob man eine Einleitung für Programmierer oder für Mathematiker schreibt. Bei letzteren sollte alles exakt sein, bei ersteren reicht es, die fertigen Formeln hinzuknallen.
Lieber dumm fragen, als dumm bleiben!

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

7

12.03.2010, 21:53

Zitat von »"Jonathan_Klein"«

Facharbeit ist halt Schule, da achtet keiner darauf, das irgendetwas formal oder exakt ist.
Es ist wohl ein Unterschied, ob man eine Einleitung für Programmierer oder für Mathematiker schreibt. Bei letzteren sollte alles exakt sein, bei ersteren reicht es, die fertigen Formeln hinzuknallen.


Dann aber bitte die richtigen (exakten) Formeln...

BlazeX

Alter Hase

  • »BlazeX« ist der Autor dieses Themas

Beiträge: 478

Wohnort: DD

Beruf: Maschinenbau-Student

  • Private Nachricht senden

8

13.03.2010, 11:35

Ja, das ist für Programmierer gedacht. Die Website heißt ja auch Spieleprogrammierer.de
Sicher ist für Mathematiker die Exaktheit bei der Formulierung wichtig. Programmierern ist die Wichtigkeit des Ergebnisses und die Performance wichtig.

Und nochmal zur Reihenfolge. Mein Beispiel ist nicht falsch. Das hier liefert die selben Ergebnisse:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
        m= Matrix::RotateZ(DegToRad(25));
        m= m * Matrix::RotateX(DegToRad(-165));
        m= m * Matrix::RotateY(DegToRad(123));
        m= m * Matrix::RotateY(DegToRad(456));
        m= m * Matrix::RotateAxis(Vector3(6, -5, -4).NormalizeSafe(), DegToRad(321));
        m= m * Matrix::RotateAxis(Vector3(-8, -5, -3).NormalizeSafe(), DegToRad(-123));
        m= m * Matrix::RotateZ(DegToRad(15));
        m= m * Matrix::RotateAxis(Vector3(-3, 2.5, 2).NormalizeSafe(), DegToRad(-321));
        m= m * Matrix::RotateAxis(Vector3(4, 2.5, 1.5).NormalizeSafe(), DegToRad(123));

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
        q= Quaternion::CreateFromNormalAndAngle(Vector3(0, 0, 1), DegToRad(25));
        q= Quaternion::CreateFromNormalAndAngle(Vector3(1, 0, 0), DegToRad(-165)) * q;
        q= Quaternion::CreateFromNormalAndAngle(Vector3(0, 1, 0), DegToRad(123)) * q;
        q= Quaternion::CreateFromNormalAndAngle(Vector3(0, 1, 0), DegToRad(456)) * q;
        q= Quaternion::CreateFromNormalAndAngle(Vector3(6, -5, -4).NormalizeSafe(), DegToRad(321)) * q;
        q= Quaternion::CreateFromNormalAndAngle(Vector3(-8, -5, -3).NormalizeSafe(), DegToRad(-123)) * q;
        q= Quaternion::CreateFromNormalAndAngle(Vector3(0, 0, 1), DegToRad(15)) * q;
        q= Quaternion::CreateFromNormalAndAngle(Vector3(-3, 2.5, 2).NormalizeSafe(), DegToRad(-321)) * q;
        q= Quaternion::CreateFromNormalAndAngle(Vector3(4, 2.5, 1.5).NormalizeSafe(), DegToRad(123)) * q;
        m= Matrix::RotateQuaternion(q);

Warum soll das Beispiel falsch sein? Bei Matrizen ist die Ausführungsreihenfolge gleich der Multiplikationsreihenfolge.
Vorausgesetzt, wir sprechen von den selben Matrizen. Ich würde schreiben: "mWorld= mScale * mRotate * mTranslation;"
Ich glaube, da liegt irgendwo ein Missverständnis.

Und zum Alpha: Das hier ist meiner Meinung nach ein Alpha:

(Link)

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

9

13.03.2010, 13:51

Zitat von »"BlazeX"«

Ja, das ist für Programmierer gedacht. Die Website heißt ja auch Spieleprogrammierer.de
Sicher ist für Mathematiker die Exaktheit bei der Formulierung wichtig. Programmierern ist die Wichtigkeit des Ergebnisses und die Performance wichtig.


Ich bin auch Programmierer und lege trotzdem Wert auf mathematische Korrektheit, ganz einfach deshalb weil es keine Missverständnise erlaubt... Also was soll die Diskussion?

Zitat von »"BlazeX"«


Bei Matrizen ist die Ausführungsreihenfolge gleich der Multiplikationsreihenfolge. [...] Ich würde schreiben: "mWorld= mScale * mRotate * mTranslation;"


Falsch! Die Ausführreihenfolge ist genau umgekehrt zur Multiplikationsreihenfolge!

Zitat von »"BlazeX"«


Und zum Alpha: Das hier ist meiner Meinung nach ein Alpha:

(Link)


Meiner Meinung nach ist das ein schlecht gerendertes Infinity-Zeichen... Aber wenn mans weiß...

10

13.03.2010, 14:14

Zitat von »"David_pb"«

Zitat von »"BlazeX"«

Und zum Alpha: Das hier ist meiner Meinung nach ein Alpha:

(Link)
Meiner Meinung nach ist das ein schlecht gerendertes Infinity-Zeichen... Aber wenn mans weiß...
Ich kenne ∝ als "ist proportional zu"-Zeichen, als Alternative zu ~. Alpha ist jedoch nah dran.

Werbeanzeige