¿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: