Aus Ihrer Beschreibung Ihres Problems geht hervor, dass der Kern der Angelegenheit möglicherweise darin besteht, dass in Ihrer Darstellung derzeit Daten fehlen. Ein Knochen ist nicht einfach der Vektor von einem Gelenk zum nächsten - es ist eine vollständige Transformationsmatrix, die die Ausrichtung des lokalen Rahmens darstellt, entweder in Bezug auf den Weltraum oder in Bezug auf den lokalen Rahmen des nächsten Knochens "die Kette hinauf". . Stellen Sie sich zum Beispiel eine Figur mit einer Narbe am Unterarm vor. Wenn Sie den Vektor vom Ellbogen des Charakters bis zum Handgelenk haben, sehen Sie, wo sich seine Hand befindet, aber er enthält nicht genügend Informationen, um Sie wissen zu lassen, wo sich die Narbe befinden würde - zum Beispiel, ob sie nach oben oder nach unten zeigt. Diese Orientierungsinformationen sollten Teil Ihres Quellgerüsts sein.
Sobald Sie Dinge in Form von vollständigen lokalen Orientierungsrahmen und nicht nur als Richtungsvektoren dargestellt haben, sollte der Rest der Informationen leicht herausfallen. Genau wie Sie in Ihrem Beitrag vorgeschlagen haben, würden Sie Matrix-Inversen verwenden, um die Schichten Ihrer Transformationen abzuziehen und an die saftige Matrix M in der Mitte zu gelangen. Zum Beispiel, wenn Sie haben childAbs = childRel * M * selfRel * parentAbs, dann multiplizieren mit childRel -1 auf die von beiden Seiten links und dann parentAbs -1 * selfRel -1 auf der rechten Seite von beiden Seiten zu bekommen M = childRel - 1 * childAbs * parentAbs -1 * selfRel -1. Beachten Sie, dass das Invertieren eines Matrizenprodukts die Reihenfolge ändert, in der ihre Inversen multipliziert werden, sodass die Reihenfolge hier eine Rolle spielt - (A * B)-1 ist nicht (im Allgemeinen) gleich A -1 * B -1 , sondern B -1 * A -1 .
Sobald Sie Ihre Matrix M haben, sollte es im Web viele Informationen darüber geben, wie Sie sie in eine Quaternion konvertieren können. Wenn Sie Hilfe bei diesem bestimmten Schritt suchen, lassen Sie es mich wissen und ich kann dies mit ein paar Links konkretisieren, aber es scheint, dass Sie noch einige andere Probleme angehen müssen, bevor Sie es überhaupt brauchen Denke darüber nach.
EDIT: Nach ein paar Tagen, um darüber nachzudenken, habe ich diese grobe Beschreibung des Prozesses für den Übergang vom Weltraum zu lokalen Informationen geschrieben. hoffentlich wird dies etwas mehr Licht ins Dunkel bringen.
Ich werde in Form eines entkoppelten Schemas arbeiten, bei dem jeder Knochen aus einer Rotationsmatrix und einer Verschiebung besteht. Die Rotationsmatrix wird an der Wurzel des Knochens angewendet, und die Verschiebung wird in knochenlokalen Koordinaten angegeben. Dies macht zwei wichtige Dinge:
- Es ermöglicht die Befestigung mehrerer Knochen an derselben Pfanne, wodurch ein richtiger Skelettbaum ein wenig einfacher wird. Beispielsweise können Schlüsselbeine leicht an einem zentralen Punkt zwischen den Schulterblättern oder Fingerknochen an einem zentralen Punkt am Handgelenk befestigt werden.
- Dies bedeutet, dass die meisten Animationen eines Knochens durchgeführt werden können, indem nur die mit diesem Knochen verbundene Rotation geändert wird. Zum Beispiel kann ein Bizeps bewegt werden, indem seine Ausrichtung geändert wird, wodurch die Position des Ellbogens verschoben wird. Tatsächlich haben Knochen häufig eine Verschiebung von (0, 0, L), wobei L die Länge des Knochens ist - das entfernte Ende des Knochens befindet sich direkt entlang der lokalen Z-Achse vom Befestigungspunkt des Knochens.
Dies ist nicht unbedingt der Ansatz, den ich für die Implementierung empfehlen würde, aber er ist der einfachste , um darüber zu sprechen, wie es geht. Während die genauen Ergebnisse nicht direkt auf Ihre Situation anwendbar sind, ist IMHO das Beste: Sie erhalten bessere Chancen zu verstehen, wie die Ableitung funktioniert und wie Sie die genauen Formeln ableiten, die für Ihre eigene Version des Problems gelten.
Einige kurze Definitionen der Größen, mit denen wir arbeiten: Ein hochgestelltes 'w' bezeichnet einen Weltraumwert, während 'l' einen lokalen Wert bezeichnet. Wir werden P für die Position und R für die Rotation verwenden. Zum Beispiel wäre P w -Knochen die Weltraumzielposition eines Knochens (im Gegensatz zu seiner Basisposition, die natürlich die Zielposition seines Elternteils ist), während R l -Knochen die lokale Orientierung des Knochens wäre - das ist, wie es in Bezug auf den Rahmen seiner Eltern gedreht wird.
In Anbetracht dessen können wir nun die Zielposition und -orientierung eines bestimmten Gelenks ableiten - wie einige Kommentare vermuten lassen, ist die Beziehung rekursiv. Insbesondere haben wir
R w Kind = R w Elternteil * R l Kind
und
P w Kind = P w Elternteil + R w Kind * P l Kind
(Diese sagen jeweils: "Die Weltorientierung des Kindes ist seine lokale Orientierung, die sich aus der Weltorientierung seines Elternteils zusammensetzt" und "Die Weltposition des Kindes ist die Weltposition seines Elternteils, die durch seine lokale Verschiebung ausgeglichen wird (übersetzt in die entsprechende) Weltraumkoordinaten) '.)
Vor diesem Hintergrund können wir diese Gleichungen nun lösen, um die Parameter des Knochens - dh R l und P l - in Bezug auf die uns gegebenen Weltraumdaten zu finden. Dies gibt auch einen weiteren Grund, warum wir nicht nur die Position, sondern auch die Weltraumorientierung aller Gelenke benötigen; Es ist ein wesentlicher Bestandteil der Lösung.
Das Finden der lokalen Ausrichtung ist unkompliziert. Wir können einfach beide Seiten unserer Orientierungsgleichung mit der Umkehrung der Weltraumorientierung der Eltern multiplizieren
R l Kind = R w Elternteil -1 * R w Kind
Die lokale Verschiebung ist auch relativ einfach zu berechnen, da wir die Verschiebung im Weltraum und die Transformationsmatrix kennen, um vom lokalen Raum zum Weltraum zu gelangen (was bedeutet, dass wir die Matrix kennen, um in die andere Richtung zu gehen):
P l Kind = R w Kind -1 * (P w Kind - P w Elternteil )
Beachten Sie auch eines: Keine dieser Gleichungen hängt von der lokalen Position oder Ausrichtung des Elternknochens ab, nur von den Weltraumwerten für Eltern und Kind - während sie sich rekursiv fühlen (und von der Berechnung, um die Weltraumwerte für die Knochen zu finden) muss von der Wurzel des Skeletts bis zu seinen Blättern gehen, da es von den Ergebnissen abhängt. Sie können tatsächlich in beliebiger Reihenfolge durchgeführt werden.
Hoffentlich gibt Ihnen dies ein besseres Gefühl dafür, was vor sich geht - es ist leicht, sich in all den Transformationen festzumachen, die herumfliegen. Lassen Sie mich wissen, ob das hilft!