[Bf-extensions-cvs] [90a42907] master: Rigify: fix two cases limb motion in rest pose.

Alexander Gavrilov noreply at git.blender.org
Wed Oct 27 18:08:44 CEST 2021


Commit: 90a42907818ecf4010731043d3008c8355774cb8
Author: Alexander Gavrilov
Date:   Fri Oct 22 22:52:27 2021 +0300
Branches: master
https://developer.blender.org/rBA90a42907818ecf4010731043d3008c8355774cb8

Rigify: fix two cases limb motion in rest pose.

The master control rotated to match the limb rest roll, because
for an unknown reason the roll was reset in edit pose.

Inner tweaks could rotate if roll of master tweaks wasn't matched.
To fix this, compute and apply the interpolated roll.

===================================================================

M	rigify/rigs/limbs/limb_rigs.py

===================================================================

diff --git a/rigify/rigs/limbs/limb_rigs.py b/rigify/rigs/limbs/limb_rigs.py
index 1443c9bc..8a965795 100644
--- a/rigify/rigs/limbs/limb_rigs.py
+++ b/rigify/rigs/limbs/limb_rigs.py
@@ -182,7 +182,6 @@ class BaseLimbRig(BaseRig):
     def make_master_control(self):
         org = self.bones.org.main[0]
         self.bones.mch.master = name = self.copy_bone(org, make_derived_name(org, 'mch', '_parent_socket'), scale=1/12)
-        self.get_bone(name).roll = 0
         self.bones.ctrl.master = name = self.copy_bone(org, make_derived_name(org, 'ctrl', '_parent'), scale=1/4)
         self.get_bone(name).roll = 0
         self.prop_bone = self.bones.ctrl.master
@@ -759,22 +758,46 @@ class BaseLimbRig(BaseRig):
         else:
             self.set_bone_parent(mch, entry.org)
 
+    @stage.apply_bones
+    def apply_tweak_mch_chain(self):
+        for args in zip(count(0), self.bones.mch.tweak, self.segment_table_tweak):
+            self.apply_tweak_mch_bone(*args)
+
+    def apply_tweak_mch_bone(self, i, tweak, entry):
+        if entry.seg_idx:
+            prev_tweak, next_tweak, fac = self.get_tweak_blend(i, entry)
+
+            # Apply the final roll resulting from mixing tweaks to rest pose
+            prev_rot = self.get_bone(prev_tweak).matrix.to_quaternion()
+            next_rot = self.get_bone(next_tweak).matrix.to_quaternion()
+            rot = (prev_rot * (1-fac) + next_rot * fac).normalized()
+
+            bone = self.get_bone(tweak)
+            bone_rot = bone.matrix.to_quaternion()
+
+            bone.roll += (bone_rot.inverted() @ rot).to_swing_twist('Y')[1]
+
     @stage.rig_bones
     def rig_tweak_mch_chain(self):
         for args in zip(count(0), self.bones.mch.tweak, self.segment_table_tweak):
             self.rig_tweak_mch_bone(*args)
 
+    def get_tweak_blend(self, i, entry):
+        assert entry.seg_idx
+
+        tweaks = self.bones.ctrl.tweak
+        prev_tweak = tweaks[i - entry.seg_idx]
+        next_tweak = tweaks[i + self.segments - entry.seg_idx]
+        fac = entry.seg_idx / self.segments
+
+        return prev_tweak, next_tweak, fac
+
     def rig_tweak_mch_bone(self, i, tweak, entry):
         if entry.seg_idx:
-            tweaks = self.bones.ctrl.tweak
-            prev_tweak = tweaks[i - entry.seg_idx]
-            next_tweak = tweaks[i + self.segments - entry.seg_idx]
+            prev_tweak, next_tweak, fac = self.get_tweak_blend(i, entry)
 
             self.make_constraint(tweak, 'COPY_TRANSFORMS', prev_tweak)
-            self.make_constraint(
-                tweak, 'COPY_TRANSFORMS', next_tweak,
-                influence = entry.seg_idx / self.segments
-            )
+            self.make_constraint(tweak, 'COPY_TRANSFORMS', next_tweak, influence=fac)
             self.make_constraint(tweak, 'DAMPED_TRACK', next_tweak)
 
         elif entry.seg_idx is not None:



More information about the Bf-extensions-cvs mailing list