Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/doc
diff options
context:
space:
mode:
authorAlexander Gavrilov <angavrilov@gmail.com>2021-10-01 15:43:25 +0300
committerAlexander Gavrilov <angavrilov@gmail.com>2021-10-01 15:47:30 +0300
commitf9acf21063d32152a98876ecc83f93ca92df18a0 (patch)
tree3e28712e8e53e5601af8366464e522233900922c /doc
parentbdc66c9569eb244296bc1fad362f372ff8a939e2 (diff)
Python API Docs: add an example of `Bone.convert_local_to_pose` usage.
The use case for this method is quite obscure and difficult to understand without an example. Despite how big looks, this is actually the simplest example that makes sense.
Diffstat (limited to 'doc')
-rw-r--r--doc/python_api/examples/bpy.types.Bone.convert_local_to_pose.py40
1 files changed, 40 insertions, 0 deletions
diff --git a/doc/python_api/examples/bpy.types.Bone.convert_local_to_pose.py b/doc/python_api/examples/bpy.types.Bone.convert_local_to_pose.py
new file mode 100644
index 00000000000..f3cc95dec61
--- /dev/null
+++ b/doc/python_api/examples/bpy.types.Bone.convert_local_to_pose.py
@@ -0,0 +1,40 @@
+"""
+This method enables conversions between Local and Pose space for bones in
+the middle of updating the armature without having to update dependencies
+after each change, by manually carrying updated matrices in a recursive walk.
+"""
+
+def set_pose_matrices(obj, matrix_map):
+ "Assign pose space matrices of all bones at once, ignoring constraints."
+
+ def rec(pbone, parent_matrix):
+ matrix = matrix_map[pbone.name]
+
+ ## Instead of:
+ # pbone.matrix = matrix
+ # bpy.context.view_layer.update()
+
+ # Compute and assign local matrix, using the new parent matrix
+ if pbone.parent:
+ pbone.matrix_basis = pbone.bone.convert_local_to_pose(
+ matrix,
+ pbone.bone.matrix_local,
+ parent_matrix=parent_matrix,
+ parent_matrix_local=pbone.parent.bone.matrix_local,
+ invert=True
+ )
+ else:
+ pbone.matrix_basis = pbone.bone.convert_local_to_pose(
+ matrix,
+ pbone.bone.matrix_local,
+ invert=True
+ )
+
+ # Recursively process children, passing the new matrix through
+ for child in pbone.children:
+ rec(child, matrix)
+
+ # Scan all bone trees from their roots
+ for pbone in obj.pose.bones:
+ if not pbone.parent:
+ rec(pbone, None)