[assimp] Offset Matrix für Bones berechnen

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
kie
Beiträge: 6
Registriert: 02.05.2010, 13:36
Alter Benutzername: kie

[assimp] Offset Matrix für Bones berechnen

Beitrag von kie »

Hallo,
ich versuche gerade Assimp in unsere Engine zu integrieren. Und ich bin jetzt schon begeistert von Assimp. (good job)

Jedoch ist mir nicht ganz klar, welche Matritzen ich für die Berechnung der endgültigen offsetMatrix eines Bones in betracht ziehen muss.

Wenn ich mir das aiScene Objekt ausgeben lasse und mir den Szenengraphen ansehe, sehe ich da zwei "Bereiche".
Ein Bereich enthält Knoten mit einheitsmatritzen als Transformation. An diesen Knoten hängen die Meshes und in den Meshes hängen Bones.
Diese Bones haben einen Vermerk auf jeweils einen Knoten, der erst im "zweiten Bereich" des Szenengraphen auftaucht, sowie eine eigene "Offset Matrix".

Der "zweite Bereich" des Szenengraphen entspricht dem Skelett des Models. Das sind auch die Knoten auf die von den o.g. Bones verwiesen wird. Diese Knoten haben alle eine Transformationsmatrix die meistens nicht die Einheitsmatrix ist.

Wenn ich den zweiten Teil des Szenengraphen traversiere und Bone-Objekte enstprechend diesen Baums aneinanderhänge, habe ich schonmal einen Baum aus Bones, der meinem Skelett entspricht. Jetzt frage ich mich, wie ich die Offset Matritzen der jeweiligen Bones mit den Transformationsmatritzen, der Knoten auf den die Bones verweisen, verketten soll?

Vielen Dank für Ideen und Lösungsansetze.

Gruß
Kie
Benutzeravatar
Schrompf
Moderator
Beiträge: 4858
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: [assimp] Offset Matrix für Bones berechnen

Beitrag von Schrompf »

Die ganze Matrizen-Spielerei um Bones herum ist etwas knifflig. Die Offset-Matrix ist eine Transformation, die vom Mesh-Koordinatensystem in das lokale Koordinatensystem des Bones transformiert. Du kannst damit also Vertex-Daten des Meshes transformieren und bekommst so heraus, wie diese Vertizes relativ zu dem Bone liegen. Der Bone ist aber Teil eines Skeletts, sprich einer Baumstruktur aus Bones und Unter-Bones. Diese Struktur ist durch die Nodes des Scenegraphen gegeben - Du findest anhand des Bone-Namens einen Node mit dem selben Namen und weißt so, wie der Bone in dieser Baumstruktur gelagert ist.

Du machst für ein Skinning also Folgendes:

a) Du ermittelst zu jedem Bone den gleichnamigen Node in der Node-Hierarchie.
b) Du berechnest die Transformation vom Node zur Scene, indem Du die TrafoMatrix des Nodes mit der seines Parents usw. verkettest, bis Du beim Rootnode bist.
b2) Du hast jetzt die Matrix die vom lokalen Bone-Node-Koordinatensystem ins globale Koordinatensystem transformiert. Oha! Das ist ja genau die Gegenrichtung zur oben genannten Offsetmatrix! Prrrrrima! Dann kann man ja
c) Die Bone-Trafomatrix berechnen, indem man BoneOffsetMatrix und NodeZuSzene-Matrix verkettet.
c2) Du hast jetzt pro Bone eine Matrix, die Du z.B. als Array an einen Skinning-VertexShader übergeben kannst.

Du hast jetzt für alle Bones jeweils eine Matrix berechnet, die angibt, wie sich die Vertizes verändern würden, wenn der Bone so orientiert ist, wie er es in der aktuellen Szenehierarchie gerade ist. Bei einem Charakter zum Beispiel ist die Ausgangshaltung des Skeletts (die sogenannte Bind Pose) üblicherweise ein aufrechter Stand, Arm schräg nach unten abgespreizt, Beine leicht geöffnet. Wenn Dein Grafiker den Charakter dann aber animiert oder sonstwie verdreht hat, exportert der Exporter üblicherweise die aktuell eingestellte Körperhaltung. Das mag dann z.B. ein entspannt stehender Charakter mit Armen vor dem Körper oder wasweißich sein. Du hast also jetzt für alle Bones eine Matrix, die die vom Bone beeinflussten Vertizes so bewegt, dass der Mesh in entspannt lümmelnder Haltung rumstehen würde, anstatt so steif gerade herumzustehen, wie er modelliert wurde.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
kie
Beiträge: 6
Registriert: 02.05.2010, 13:36
Alter Benutzername: kie

Re: [assimp] Offset Matrix für Bones berechnen

Beitrag von kie »

Vielen Dank, das hat mir schonmal sehr geholfen. Dann hab ich das eigentlich schon richtig gemacht, jedoch darf man beim rekursiven Zeichnen den Matrixstack von GL nicht nutzen, ansonsten verkettet man die Matritzen erneut. :D

Mein Charackter steht aber nun wieder in seiner Ausgangsstellung da. (Bind Position) Ist dann was falsch bei meiner Implementierung, oder ist das für das Milkshape3D-Format üblich?

Gruß
Kie
Benutzeravatar
Schrompf
Moderator
Beiträge: 4858
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: [assimp] Offset Matrix für Bones berechnen

Beitrag von Schrompf »

Keine Ahnung. Da hängt üblicherweise eher vom Exporter ab. Verdreh doch mal einen der Nodes langsam und schau, ob sich der Mesh mitdreht. Schau mit dem Debugger, ob Deine Bone-Matrizen wirklich Einheitsmatrizen sind... das sind sie in der Bind Pose nämlich. Wenn ja, dann ist entweder die Matrixberechnung vorher kaputt oder es stimmt schlicht so, wie Du es siehst. Wenn nein und Dein Mesh steht trotzdem in Bind Pose rum, dann ist was mit Deinem Skinning Vertex Shader nicht in Ordnung.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Antworten