Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: So Dez 22, 2024 04:17

Foren-Übersicht » Programmierung » Mathematik-Forum
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Dual Quaternions
BeitragVerfasst: Fr Sep 06, 2013 18:04 
Offline
DGL Member
Benutzeravatar

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 :wink: ) 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.

Folgende Quellen haben mir bisher (nicht) geholfen:
Simon's Tech Blog,
Wikipedia,
Uni Kiel (schien erst perfekt, leider werden nicht alle Funktionen in der zugehörigen cpp-Datei definiert),
dieses Tutorial

Danke schonmal für eure Antworten! :)

_________________
So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Dual Quaternions
BeitragVerfasst: Fr Sep 06, 2013 20:28 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
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 :mrgreen: )

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Dual Quaternions
BeitragVerfasst: Fr Sep 06, 2013 20:53 
Offline
DGL Member
Benutzeravatar

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)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Dual Quaternions
BeitragVerfasst: Fr Sep 06, 2013 21:05 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
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.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Dual Quaternions
BeitragVerfasst: Mo Sep 09, 2013 09:05 
Offline
DGL Member
Benutzeravatar

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

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Dual Quaternions
BeitragVerfasst: Mo Sep 09, 2013 15:28 
Offline
DGL Member
Benutzeravatar

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:

v + 2.0f * (real.v * ((real.v * v) + real.w * v)) + 2.0f * (real.w * dual.v - dual.w * real.v + (real.v * dual.v))
glAwesome hat geschrieben:
3. Wie multipliziert man zwei dualQuats miteinander?

real = a.real * b.real
dual = a.real * b.dual + b.real * a.dual

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;

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Dual Quaternions
BeitragVerfasst: Mo Sep 09, 2013 19:59 
Offline
DGL Member
Benutzeravatar

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:

v + 2.0f * (real.v * ((real.v * v) + real.w * v)) + 2.0f * (real.w * dual.v - dual.w * real.v + (real.v * dual.v))
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?

real = a.real * b.real
dual = a.real * b.dual + b.real * a.dual
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)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Dual Quaternions
BeitragVerfasst: Mo Sep 09, 2013 22:36 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
ups... mal kurz die Schnippsel korrigieren (scheiß operator overloading)

4. (punkt)
p + 2.0f * (real.v X ((real.v X p) + real.w * p)) + 2.0f * (real.w * dual.v - dual.w * real.v + (real.v X dual.v))
4. (vektor)
v + 2.0f * (real.v X ((real.v X v) + real.w * v))


5.)
r = -1.0 * (real * (real.v*dual.v + real.w*dual.w))
dual += r;


und zur Sicherheit aber nochmal die multiplikation von zwei Quats:

v = q1.v*q2.w + q1.w*q2.v + q1.v X q2.v
w = q1.w*q2.w - q1.v*q2.v

was da jetzt allerdings was beim Quat ist, keine Ahnung. Ich hab die damals nur für MD5 Format verwendet und sonst nie wieder :)

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Dual Quaternions
BeitragVerfasst: Di Sep 10, 2013 20:04 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jul 29, 2003 00:11
Beiträge: 436
Evtl. sind die Shader von Ogre3D nützlich, zu finden hier in den Unterordnern der jeweils gewünschten Shadersprache:
https://bitbucket.org/sinbad/ogre/src/3 ... s/?at=v1-9


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Dual Quaternions
BeitragVerfasst: Di Sep 10, 2013 20:33 
Offline
DGL Member
Benutzeravatar

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 zwei anderen hh-Dateien. Ich werde mir das genauer ansehen und melde mich, wenn ich wieder Probleme habe.

Edit: Nun gibt es einen Wiki-Artikel dazu: Dual Quaternion

_________________
So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Foren-Übersicht » Programmierung » Mathematik-Forum


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 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.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.021s | 16 Queries | GZIP : On ]