Ich versuche seit einigen Tagen mein Bonesystem auf Quaternionen umzustellen, damit ich Animationen aus Blender importieren kann. Allerdings nicht sehr erfolgreich. Ich konnte den Fehler schon ein bischen eingrenzen, aber mir fehlt das mathematische Verständnis um ihn zu beheben.
Also das Problem scheint die Funktion zu sein, die das Quaternion auf den Vector anwendet. Ich hab' den Code aus dem Wiki übernommen:
Also entweder mach' ich irgendwie einen elementaren Fehler oder es liegt an Blender bzw. wie das funktioniert. Könnte sein das bei Blender irgendwas anders gerechnet wird, kA. Ich bin eben ziemlich ratlos.
Registriert: Di Okt 03, 2006 14:07 Beiträge: 1277 Wohnort: Wien
Zitat:
Allerdings produziert das irgendwie andere Resultate als Blender. Deshalb hab ich stattdessen versucht das Quaternion erst in eine Matrix umzuwandeln, was exakt das selbe bewirkt wie der Code oben
Wenn die Matrix das Gleiche macht, muss es an was anderem liegen.
Könnte es nicht sein, dass Blender das VertexBlending eingeschaltet hat? Dabei interpoliert er zwischen den Quaternionen der einzelnen Gelenke, damit die Gelenke natürlicher aussehen. Aber bitte berücksichtige dabei, dass ich mich mit Blender nicht auskenne.
Ja, das die Matrix das selbe Ergebnis liefert, legt die Vermutung nahe das beides richtig funktioniert (wie es ja auch sollte). Die Wahrscheinlichkeit das beides gleich falsch funktioniert ist wohl relativ gering.
Mit den Vertices hab' ich keine Probleme (noch). Der Fehler betrifft eigentlich schon die Bones. Die haben ja auch einen Anfang und ein Ende. Also das Ende wird mit dem Quaternion um den Anfang rotiert. Oder der Richtungsvektor vom Anfang zum Ende wird rotiert.
Hm, mir ist noch was anderes eingefallen. Könnte sein das Rundungsfehler das ganze verfälschen. Ich benutze nur Single-Typen und manche Werte sind relativ nah an der Null. Muss ich mal testen.
Edit: Naja, ich hab' testweise mal alle Singles durch Doubles ersetzt. Hat leider nichts geändert.
Registriert: Di Okt 03, 2006 14:07 Beiträge: 1277 Wohnort: Wien
Könntest Du den Fehler mal beschreiben, also ich meine, wie unterscheidet sich die Ansicht, wenn Du es selbst zeichnest, zur Ansicht von Blender?
Ich hatte z.B. mal den Fehler, dass ich die Rotationsachsen der Gelenke (ich hab das damals nur mit Matrizen gemacht) nicht normalisiert habe, daraufhin wurden die Bones skaliert, was sich so ausgewirkt hat, dass z.B. ein Unterarm sich zu ungeheuren Ausmassen vergrößert hat.
Ich hab' grad nochmal ein bischen bei Blender rumprobiert. Offensichtlich stimmt meine Rechnung mit den Quaternionen tatsächlich. Wenn ich bei Blender "manuell" den Vektor mit dem Quaternion verrechne, kommt das gleiche wie bei meinem Programm raus. Was ich aber nicht verstehe, ist wie sich Blender ansonsten die Bonepositionen zusammenbastelt.
Registriert: Di Okt 03, 2006 14:07 Beiträge: 1277 Wohnort: Wien
Ich zitiere aus meinem obigen zweiten Link:
Zitat:
As mentioned in my earlier post, the axes of rotation for the bones in the SL skeleton differ from the Blender skeleton. That is, in the Blender skeleton, the Y axis always points along the length of the bone. In the SL skeleton, it varies between bones.
Auf Deutsch:
Zitat:
Wie ich in meinem früheren Post erwähnt habe, unterscheidet sich die Rotationsachse im SL Skelett (?) vom Blender Skeleton. DAS KOMMT DAHER, DASS IN BLENDER DIE Y-ACHSE IMMER IN DIE RICHTUNG DES BONES ZEIGT. Im SL Skelett ist es unterschiedlich je nach Bone.
Das bedeutet, dass das Bone eine eigene Basis hat, sprich, dass man sich hier in einem verdrehten Koordinatensystem befindet, jedenfalls nicht im Weltkoordinatensystem. Wenn ich das jetzt logisch weiterverfolge, heißt das, dass Du zwar richtig gerechnet hast, aber von einem falschen Vektor (Bone) ausgehst.
Um da jetzt genau draufzukommen müsste man eine Rückrechnung durchführen, soll heißen: Du hast das Ergebnis in Blender, Du hast das Quaternion, und rückrechnen müsste jetzt heißen:
Ich hab' mich noch ein bischen mit den Matrizen die Blender noch zur Verfügung stellt, auseinander gesetzt.
zB gibt es eine Matrix die sich "localMatrix" nennt. Wenn ich die Objektkoordinaten des Endes eines Bones mit selbiger multipliziere, bekomme ich die transformierten Objektkoordinaten wie sie von Blender auch sonst ausgegeben werden. Das tolle ist, man kann sich die Rotation aus einer Matrix auch gleich in ein Quaternion umwandeln lassen. Das Ergebnis von genannter Matrix ist aber nicht so ganz das Quaternion was ich bisher verwendet habe. y und z sind vertauscht einer der Werte ist negiert. Ich nehme mal an das kommt daher das bei Blender die Z-Achse nach oben und Y in den Bildschirm rein zeigt.
Jedenfalls scheint mein Problem damit erstmal gelöst.
Edit: Hab' mich wohl zu früh gefreut, die Animation sieht zwar schon richtiger aus, aber immer noch nicht so wie in Blender.
Edit2: OK, jetzt sieht es so aus als ob es wirklich stimmen würde. Hat einige Zeit und Nerven gebraucht.
"quat" ist jetzt mein Quaternion was ich exportierte. Weil "localMatrix" im Armature-Space transformiert (und nicht im Bone-Space wie man vielleicht denken könnte) sind die Quaternionen daraus auch irgendwie global. Das hätte vielleicht auch einige Vorteile, verträgt sich aber nicht mit dem Bonesystem wie ich es benutze. Deshalb wird mit der Funktion "DifferenceQuats" der Teil der Transformation der durch das Parent verursacht wird einfach "raussubtrahiert".
Mitglieder in diesem Forum: 0 Mitglieder und 6 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.