Muy buenas, a ver si alguien me puede ayudar. Estoy intentando sacar la rotación de un hueso en una cadena IK en Blender 2.5.4.
De un hueso en cadena FK no tengo problema.
Bpy, data, objects[armature].pose, Bones[bone.001].rotation_cuaternión.
Así me da la rotación y la puedo copiar a otro hueso en FK, pero el problema me viene en que esto no funciona en una cadena IK.
¿Cómo podría sacar la matriz de rotación o lo que sea del hueso en la cadena IK? Gracias de antemano.
Para obtener la rotación de un hueso controlado por IK en Blender, necesitas acceder a su matriz de pose después de que las dependencias (como el solver IK) hayan sido evaluadas. En versiones actuales de Blender (como la serie 4.x), el proceso es conceptualmente similar pero más robusto.
Primero, debes asegurarte de que el contexto de la pose está actualizado. Para ello, debes evaluar la dependencia del objeto armadura en la escena. Esto se hace obteniendo la versión evaluada del objeto a través del evaluador de dependencias (Depsgraph). La rotación en IK no se almacena directamente en la propiedad rotation_quaternion del hueso en pose hasta después de esta evaluación.
Aquí está el método principal. Necesitas obtener el objeto de armadura evaluado. Usa bpy.context.depsgraph para esto. Por ejemplo: depsgraph = bpy.context.evaluated_depsgraph_get() y luego armadura_evaluada = objeto_armadura.evaluated_get(depsgraph). Esto te da una copia de la armadura con todos los modificadores y constrains (como IK) aplicados.
Luego, accede a los huesos de pose desde esta armadura evaluada. La ruta sería algo como: armadura_evaluada.pose.bones[tu_hueso].matrix_basis. De esta matriz, puedes extraer la rotación como cuaternión, Euler o lo que necesites. Por ejemplo, para obtener un cuaternión: rot_quat = armadura_evaluada.pose.bones[tu_hueso].matrix_basis.to_quaternion().
Es crucial usar el hueso desde la armadura evaluada, no desde el objeto original. El objeto original (bpy.data.objects) no refleja el estado tras la solución IK a menos que se actualice el contexto. Este método funciona para huesos en cadenas IK, FK o bajo cualquier constraint.
Para un script concreto, dentro de un operador o en la consola Python, la estructura básica sería crear o obtener el depsgraph, luego la armadura evaluada, y luego consultar la matriz del hueso específico. Recuerda que el nombre del hueso debe ser una cadena de texto correcta.
Si necesitas la rotación en el espacio mundial, usa matrix en lugar de matrix_basis. La propiedad matrix_basis da la transformación relativa al hueso padre en la pose, mientras que matrix da la transformación en espacio mundial. Elige según dónde quieras aplicar después esa rotación.