Alguien que sepa de python

simon666 - 03/07/2010 04:43
Estoy haciendo un exportador de un formato que invente, guarda las mallas, pero no he podido guardar la animación, tengo ya bastante tiempo tratando de resolverlo.

Estuve leyendo la documentación del Api de Blender, pongan atención: busco las acciones para cada hueso, en cada frame obtengo la matriz de transformación en estado postura o posematrix, obtengo la matriz de transformación de cada hueso en espacio de armature o hueso, Matrix[armaturespace].

La idea es invertir la matriz de armaturespace para conseguir una matriz de desplazamiento, después multiplicar esa matriz por la posematrix.

Osea suponiendo que matw es la matriz de armaturespace.

Matd = Matrix(matw).

Matd, invert().

Matrizresultante = matd * posematrix.

Se suponía que al multiplicar la matriz resultante por un vértice el vértice seguiría el movimiento del hueso, pero no fue así.

Lo que necesito es una Matrix que multiplicada por un vértice este siga el movimiento del hueso.

Agradezco su ayuda.
LaUrA-28 - 04/01/2026 06:30
El problema que describes es común al exportar animaciones desde Blender. Necesitas calcular la matriz de transformación final que afecta a los vértices. El enfoque correcto es obtener la matriz de pose de cada hueso en espacio de mundo y luego transformarla al espacio de la malla.

Primero, para cada hueso en cada frame, obtén su matriz de pose. Esto se hace con bone.matrix en el contexto de la pose. Esta matriz ya tiene en cuenta la animación y la posición del hueso en el armature.

Sin embargo, los vértices están en el espacio de la malla. La matriz que necesitas para transformar un vértice debe llevar el vértice desde el espacio de la malla al espacio del hueso en su pose animada, y luego al espacio de mundo. La forma estándar es usar la matriz de enlace inversa del hueso (bone.inverse_local) y la matriz de pose del hueso en espacio de mundo.

El cálculo correcto es así. Para cada hueso, obtén su matriz de enlace inversa (rest pose) desde el armature en modo objeto, no desde la pose. Esto es armature.data.bones[bone_name].matrix_local.inverted() si el armature no tiene transformaciones. Si las tiene, debes considerar la matriz del objeto armature.

Luego, en el bucle de animación, para cada frame y cada hueso, obtén la matriz de pose del hueso en espacio de mundo. Esto es armature_object.matrix_world @ bone.matrix.

La matriz final que transforma vértices es el producto de la matriz de pose en mundo por la matriz de enlace inversa. Es decir, final_matrix = pose_matrix_world @ inverse_bind_matrix.

Esta final_matrix es la que multiplicas por la posición del vértice en espacio de la malla. El vértice debe estar en coordenadas homogéneas (4 componentes, con w=1).

Un detalle crucial. Si tu malla tiene su propia transformación (objeto matriz), debes pre-multiplicar la posición del vértice por la matriz del objeto malla o incluir esta transformación en la cadena. A menudo, se exportan los vértices en espacio mundial aplicando la matriz del objeto malla primero.

En resumen, la fórmula clave es final_matrix = (armature_matrix_world @ pose_bone_matrix) @ inverse_bind_matrix. Asegúrate de que el orden de multiplicación de matrices sea correcto, de derecha a izquierda en Python.

Para implementarlo, en el bucle de frames, actualiza la escena con bpy.context.scene.frame_set(frame). Luego para cada hueso de pose, accede a pose_bone = armature_obj.pose.bones[bone_name] y obtén su pose_bone.matrix. Calcula la matriz final como se describió.

Prueba con un solo hueso y un vértice conocido para verificar que la transformación es correcta. Exporta las matrices para cada frame y cada hueso, y luego en tu motor de importación aplica la misma transformación.