¿Aplicar transformaciones no jerárquicas al esqueleto jerárquico?

Yo uso Blender3D, pero la respuesta podría no ser exclusiva de la API.

Tengo algunas matrices que debo asignar a PoseBones. La postura resultante se ve bien cuando no hay jerarquía ósea (crianza) y desordenada cuando existe.

He subido un archivo con una mezcla de muestra de los modelos amañados, el importador de animación de texto y un archivo de animación de prueba aquí:http://www.2shared.com/file/5qUjmnIs/sample_files.html
Importe la animación seleccionando un Armature y ejecutando el importador en el archivo "sba". Haga esto para ambas armaduras.

Así es como asigno las poses en el importador real (complejo):

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

Si voy al modo de edición, selecciono todos los huesos y presiono Alt + P para deshacer la crianza, la postura se ve bien otra vez.

La documentación de la API dice que el PoseBone.matrix está en "espacio de objeto", pero a mi me parece claro, a partir de estas pruebas, que son relativos a los huesos primarios.

Matriz final 4x4 después de aplicar restricciones y drivers (objeto espacio)

Intenté hacer algo como esto:

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

Pero se ve peor. Experimentado con orden de operaciones, sin suerte con todos.

Para el registro, en la antigua API 2.4 esto funcionó como un encanto:

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

pose.update()

Enlace a la API de Blender ref:

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

Respuestas a la pregunta(1)

Su respuesta a la pregunta