diff options
author | Alexander Gavrilov <angavrilov@gmail.com> | 2021-10-22 22:52:27 +0300 |
---|---|---|
committer | Alexander Gavrilov <angavrilov@gmail.com> | 2021-10-27 19:02:48 +0300 |
commit | 90a42907818ecf4010731043d3008c8355774cb8 (patch) | |
tree | 5eba9d190156a23d7e0dbf76d774881473cf8d7a | |
parent | 293cc140f5348ac6382575302d88b2deec37b4a7 (diff) |
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.
-rw-r--r-- | rigify/rigs/limbs/limb_rigs.py | 39 |
1 files changed, 31 insertions, 8 deletions
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: |