From 4cd7c8fc05d080588abf40ab3cdee68238e5fa27 Mon Sep 17 00:00:00 2001 From: Alexander Gavrilov Date: Mon, 10 Jan 2022 21:09:03 +0300 Subject: Rigify: refactor leg to make modifying the foot roll mechanism easier. --- rigify/rig_ui_template.py | 5 +++++ rigify/rigs/limbs/leg.py | 9 ++++++--- rigify/rigs/limbs/limb_rigs.py | 21 +++++++++++++-------- 3 files changed, 24 insertions(+), 11 deletions(-) diff --git a/rigify/rig_ui_template.py b/rigify/rig_ui_template.py index 06ff7faf..528a732c 100644 --- a/rigify/rig_ui_template.py +++ b/rigify/rig_ui_template.py @@ -130,6 +130,11 @@ def convert_pose_matrix_via_rest_delta(mat, from_bone, to_bone): return mat @ from_bone.bone.matrix_local.inverted() @ to_bone.bone.matrix_local +def convert_pose_matrix_via_pose_delta(mat, from_bone, to_bone): + """Convert pose of one bone to another bone, preserving the current pose difference between them.""" + return mat @ from_bone.matrix.inverted() @ to_bone.matrix + + def get_local_pose_matrix(pose_bone): """ Returns the local transform matrix of the given pose bone. """ diff --git a/rigify/rigs/limbs/leg.py b/rigify/rigs/limbs/leg.py index 5967dcef..635250d6 100644 --- a/rigify/rigs/limbs/leg.py +++ b/rigify/rigs/limbs/leg.py @@ -232,7 +232,7 @@ class Rig(BaseLimbRig): @stage.parent_bones def parent_ik_toe_control(self): if self.use_ik_toe: - self.set_bone_parent(self.bones.ctrl.ik_toe, self.bones.mch.heel[2]) + self.set_bone_parent(self.bones.ctrl.ik_toe, self.get_mch_heel_toe_output()) @stage.configure_bones def configure_ik_toe_control(self): @@ -247,6 +247,9 @@ class Rig(BaseLimbRig): #################################################### # Heel roll MCH + def get_mch_heel_toe_output(self): + return self.bones.mch.heel[-3] + @stage.generate_bones def make_roll_mch_chain(self): orgs = self.bones.org.main @@ -322,7 +325,7 @@ class Rig(BaseLimbRig): def parent_fk_parent_bone(self, i, parent_mch, prev_ctrl, org, prev_org): if i == 3: if not self.use_ik_toe: - align_bone_orientation(self.obj, parent_mch, self.bones.mch.heel[2]) + align_bone_orientation(self.obj, parent_mch, self.get_mch_heel_toe_output()) self.set_bone_parent(parent_mch, prev_org, use_connect=True) else: @@ -334,7 +337,7 @@ class Rig(BaseLimbRig): def rig_fk_parent_bone(self, i, parent_mch, org): if i == 3: if not self.use_ik_toe: - con = self.make_constraint(parent_mch, 'COPY_TRANSFORMS', self.bones.mch.heel[2]) + con = self.make_constraint(parent_mch, 'COPY_TRANSFORMS', self.get_mch_heel_toe_output()) self.make_driver(con, 'influence', variables=[(self.prop_bone, 'IK_FK')], polynomial=[1.0, -1.0]) diff --git a/rigify/rigs/limbs/limb_rigs.py b/rigify/rigs/limbs/limb_rigs.py index 2e6fe538..ddcccd4d 100644 --- a/rigify/rigs/limbs/limb_rigs.py +++ b/rigify/rigs/limbs/limb_rigs.py @@ -1026,32 +1026,37 @@ class RigifyLimbIk2FkBase: mat = convert_pose_matrix_via_rest_delta(mat, ik, ctrl) set_transform_from_matrix(obj, ctrl.name, mat, keyflags=keyflags) + def assign_extra_controls(self, context, obj, all_matrices, ik_bones, ctrl_bones): + for extra in self.extra_ctrl_list: + set_transform_from_matrix( + obj, extra, Matrix.Identity(4), space='LOCAL', keyflags=self.keyflags + ) + def apply_frame_state(self, context, obj, all_matrices): ik_bones = [ obj.pose.bones[k] for k in self.ik_bone_list ] ctrl_bones = [ obj.pose.bones[k] for k in self.ctrl_bone_list ] tail_bones = [ obj.pose.bones[k] for k in self.tail_bone_list ] - assert len(all_matrices) == len(ik_bones) + len(tail_bones) + assert len(all_matrices) >= len(ik_bones) + len(tail_bones) matrices = all_matrices[0:len(ik_bones)] tail_matrices = all_matrices[len(ik_bones):] use_pole = self.get_use_pole(obj) + # Remove foot heel transform, if present + self.assign_extra_controls(context, obj, all_matrices, ik_bones, ctrl_bones) + + context.view_layer.update() + # Set the end control position - endmat = convert_pose_matrix_via_rest_delta(matrices[-1], ik_bones[-1], ctrl_bones[-1]) + endmat = convert_pose_matrix_via_pose_delta(matrices[-1], ik_bones[-1], ctrl_bones[-1]) set_transform_from_matrix( obj, self.ctrl_bone_list[-1], endmat, keyflags=self.keyflags, undo_copy_scale=True, ) - # Remove foot heel transform, if present - for extra in self.extra_ctrl_list: - set_transform_from_matrix( - obj, extra, Matrix.Identity(4), space='LOCAL', keyflags=self.keyflags - ) - # Set the base bone position ctrl_bones[0].matrix_basis = Matrix.Identity(4) -- cgit v1.2.3