Registriert: Mi Aug 14, 2013 21:17 Beiträge: 588
Programmiersprache: C++
Hallo, ich wollte mal fragen, ob von euch schon jemand Erfahrungen mit Dual Quaternions hat? Derzeit versuche ich mich darin, sie in eine Klasse zu implementieren, aber leider wollen die Dinger nicht so, wie ich will. Die Tutorials, die man (=ich ) zu dem Thema findet, widersprechen sich leider an manchen Stellen bzw. sorgen für Verwirrung, indem sie verschiedene Darstellungsweisen für duale Quaternionen verwenden. Während im einen von 4 dualen Zahlen die Rede ist, verwendet ein anderes zwei gewöhnliche Quaternionen (was offenbar weiter verbreitet ist). Außerdem ist w bei manchen nicht etwa die vierte Koordinate, sondern die erste (wie im Alphabet).
Eigentlich möchte ich nur ganz einfache Dinge wissen: 1. Wie setzt man Rotation (meines Wissens: im Realteil wie bei einfachen Quaternionen; Dualteil = vec4(0, 0, 0, 0)) 2. Wie setzt man Translationen 3. Wie multipliziert man zwei dualQuats miteinander? 4. Wie transformiert man einen vec3 mittels eines dualQuats? Und muss das dualQuat dazu normalisiert sein? Falls ja: 5. Wie normalisiert man ein dualQuat?
Falls jemand Code hat, der sich in der Praxis bewährt hat, wäre ich sehr dankbar. Wenn es jemand erklären kann natürlich auch. Wobei ich ehrlich gesagt mehr an der Funktionalität als an mathematischen Details interessiert bin.
_________________ So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)
Von Dual Quaternions hatte ich bisher noch nicht gehört. Allerdings hatte ich damals mal eine Klasse geschrieben die ein Quaternion mit einem Translations-Vektor kombiniert. Vielleicht hilft es ja irgendwie
viewtopic.php?f=13&t=9296 Du musst die alte Version (2010-06-26) nehmen, in der neuen ist es noch nicht wieder drin. (Und in anbetracht der Tatsache das ich seit zwei Jahren nichts mehr dran gemacht hab wir es wohl auch nicht mehr reinkommen )
Registriert: Mi Aug 14, 2013 21:17 Beiträge: 588
Programmiersprache: C++
Ja, deine Library habe ich mir auch schon angesehen. Du meinst sicherlich die Frame-Klasse. Die ist in der Version vom 22.03.2011 auch drin.
Allerdings löst diese Klasse das Interpolationsproblem auch nicht, oder? Wie du dir sicherlich schon denken kannst, geht es mir um Skelett-basierte Charakteranimation. Wenn ein Vertex von mehr als nur einem Joint beeinflusst wird, hat man ja nicht nur zwei verschiedene Rotationen, zwischen denen man interpolieren will. Die Joints drehen auch noch um verschiedene Punkte. Wie realisiert man das mit Quaternion + Translationsvektor? Soweit ich weiß, führt das Interpolieren der Rotationscenter zu völlig falschen Ergebnissen. Stattdessen kann man als Rotationspunkt den des Joints mit dem stärksten Gewicht nehmen, aber ist das nicht auch eher unrealistisch? Oder gibt habe ich eine Möglichkeit übersehen?
_________________ So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)
Also ich habe bisher immer eine Translationsvektoren und Quaternione getrennt von einander interpoliert und es kam was brauchbares raus. Wichtig ist das du die Quaternione über den kürzeren Winkel interpolierst, einige Slerp-Implementierungen machen das leider nicht. Aber an Skelettanimation habe ich mich noch nicht versucht, habe da bisher immer eine fertige Implementierung genutzt.
Registriert: Di Mai 18, 2004 16:45 Beiträge: 2622 Wohnort: Berlin
Programmiersprache: Go, C/C++
Ich weiß, dass Oc2k1 vor einigen Jahren ein Shader für dual quaternion skeleton animation geschrieben hat, in seinem Shader Tool findest du den sicher noch.
_________________ "Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren" Benjamin Franklin
Registriert: Mo Nov 08, 2010 18:41 Beiträge: 769
Programmiersprache: Gestern
glAwesome hat geschrieben:
1. Wie setzt man Rotation (meines Wissens: im Realteil wie bei einfachen Quaternionen; Dualteil = vec4(0, 0, 0, 0)) 2. Wie setzt man Translationen 4. Wie transformiert man einen vec3 mittels eines dualQuats? Und muss das dualQuat dazu normalisiert sein? Falls ja:
Registriert: Mi Aug 14, 2013 21:17 Beiträge: 588
Programmiersprache: C++
Danke für die Antworten. @TAK: Ich denke, du meintest Lumina. Da konnte ich bisher nichts in den Examples finden - nur Quaternion + Translationsvektor. Ich gebe zu, ich habe auch noch nicht alle Files durch.
yunharla hat geschrieben:
glAwesome hat geschrieben:
4. Wie transformiert man einen vec3 mittels eines dualQuats? Und muss das dualQuat dazu normalisiert sein? Falls ja:
Interessant. Die Implementierungen, die ich bisher gesehen habe, hatten alle mehrere ineinander verschachtelte Kreuzprodukte. Oder es wurde ein Vektor zu einem DualQuat konvertiert, welches dann mit dem anderen DualQuat multipliziert wurde, sodass man aus dem Ergebnis irgendwie den resultierenden Vektor extrahieren kann. Edit: Ich nehme an, mit real.v meinst du den Vektor (b,c,d), wenn real die Form a+bi+cj+dk hat und real.w = a?
yunharla hat geschrieben:
glAwesome hat geschrieben:
3. Wie multipliziert man zwei dualQuats miteinander?
Das ist leider nicht eindeutig, denn es kommt darauf an, an welchen Stellen von real und dual was gespeichert ist. Also an welchen Stellen speicherst du a, b, c und d, wenn ein Quaternion die Form a+bi+cj+dk hat? Manche Implementierungen stellen das a an den Anfang, andere ans Ende usw., was alles zu Fehlern führen kann, wenn man es an nur einer Stelle anders handhabt. Das Setzen der Translation um den Vektor (x,y,z) wird häufig so gemacht (im dualen Teil): a=0; b=x/2; c=y/2; d=z/2; Manche Implementationen vertauschen aber auch die Reihenfolge von xyz zu zyx. Analog bei der Rotation im real-Teil. Wie machst du es?
yunharla hat geschrieben:
glAwesome hat geschrieben:
5. Wie normalisiert man ein dualQuat?
invLenReal = 1.0f / len(Real); real = real * invLenReal; dual = dual * invLenReal; r = -1.0 * real * real * (dual) dual += r;
Ich denke hier hast du in der vorletzten Zeile einen Klammerfehler gemacht, jedenfalls haben die Klammern so keine Bedeutung. Ist r ein Vektor oder ein Skalar? Und wieder stellt sich hier die gleiche Frage, wie bei 3.
Ich freue mich auf weitere Aufklärung
_________________ So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)
Registriert: Mi Aug 14, 2013 21:17 Beiträge: 588
Programmiersprache: C++
Danke, ich habe noch etwas anderes bemerkt: Die fehlenden Definitionen der DualQuaternion-Klasse von der Universität Kiel, stehen nicht in der cpp-Datei, sondern in zweianderen hh-Dateien. Ich werde mir das genauer ansehen und melde mich, wenn ich wieder Probleme habe.
_________________ So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)
Mitglieder in diesem Forum: 0 Mitglieder und 5 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.