Nicht hierarchische Transformationen auf hierarchisches Gerüst anwenden?

Ich verwende Blender3D, aber die Antwort ist möglicherweise nicht API-exklusiv.

Ich habe einige Matrizen, die ich PoseBones zuweisen muss. Die resultierende Pose sieht gut aus, wenn es keine Knochenhierarchie gibt (Parenting) und ist durcheinander, wenn es eine gibt.

Ich habe hier ein Archiv mit einer Mustermischung der manipulierten Modelle, dem Textanimationsimporter und einer Testanimationsdatei hochgeladen:http://www.2shared.com/file/5qUjmnIs/sample_files.html
Importieren Sie die Animation, indem Sie einen Anker auswählen und den Importer für die "sba" -Datei ausführen. Tun Sie dies für beide Armaturen.

So ordne ich die Posen im realen (komplexen) Importer zu:

matrix_bases = ... # matrix from file
animation_matrix = matrix_basis * pose.bones['mybone'].matrix.copy()
pose.bones[bonename].matrix = animation_matrix

Wenn ich in den Bearbeitungsmodus gehe, alle Bones auswähle und Alt + P drücke, um die Elternschaft rückgängig zu machen, sieht die Pose wieder gut aus.

Die API-Dokumentation besagt, dass sich die PoseBone.matrix im "Objektbereich" befindet, aber mir scheint aus diesen Tests klar zu sein, dass sie sich auf übergeordnete Bones beziehen.

Endgültige 4x4-Matrix, nachdem Einschränkungen und Treiber angewendet wurden (Objekt Platz)

Ich habe versucht, so etwas zu tun:

matrix_basis = ... # matrix from file
animation_matrix = matrix_basis * (pose.bones['mybone'].matrix.copy()  * pose.bones[bonename].bone.parent.matrix_local.copy().inverted())
pose.bones[bonename].matrix = animation_matrix

Aber es sieht schlimmer aus. Experimentiert mit der Reihenfolge der Operationen, kein Glück mit allen.

In der alten 2.4 API funktionierte dies wie ein Zauber:

matrix_basis = ... # matrix from file
animation_matrix = armature.bones['mybone'].matrix['ARMATURESPACE'].copy() * matrix_basis
pose.bones[bonename].poseMatrix = animation_matrix

pose.update()

Link zur Blender-API-Referenz:

http://www.blender.org/documentation/blender_python_api_2_63_17/bpy.types.BlendData.html#bpy.types.BlendData

http://www.blender.org/documentation/blender_python_api_2_63_17/bpy.types.PoseBone.html#bpy.types.PoseBone

Antworten auf die Frage(1)

Ihre Antwort auf die Frage