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

git.blender.org/blender-addons.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--rigify/rigs/limbs/limb_rigs.py48
-rw-r--r--rigify/rigs/limbs/rear_paw.py11
2 files changed, 31 insertions, 28 deletions
diff --git a/rigify/rigs/limbs/limb_rigs.py b/rigify/rigs/limbs/limb_rigs.py
index a5df27f4..1443c9bc 100644
--- a/rigify/rigs/limbs/limb_rigs.py
+++ b/rigify/rigs/limbs/limb_rigs.py
@@ -162,8 +162,8 @@ class BaseLimbRig(BaseRig):
# FK chain parents (or None)
# ik_pivot
# Custom IK pivot result (optional).
- # ik_stretch
- # IK stretch switch implementation.
+ # ik_swing
+ # Bone that tracks ik_target to manually handle limb swing.
# ik_target
# Corrected target position.
# ik_base
@@ -422,7 +422,10 @@ class BaseLimbRig(BaseRig):
@stage.parent_bones
def parent_ik_controls(self):
- self.set_bone_parent(self.bones.ctrl.ik_base, self.bones.mch.follow)
+ if self.use_mch_ik_base:
+ self.set_bone_parent(self.bones.ctrl.ik_base, self.bones.mch.follow)
+ else:
+ self.set_bone_parent(self.bones.ctrl.ik_base, self.bones.mch.ik_swing)
@stage.configure_bones
def configure_ik_controls(self):
@@ -515,16 +518,17 @@ class BaseLimbRig(BaseRig):
if self.use_mch_ik_base:
self.bones.mch.ik_base = self.make_ik_mch_base_bone(orgs)
- self.bones.mch.ik_stretch = self.make_ik_mch_stretch_bone(orgs)
+ self.bones.mch.ik_swing = self.make_ik_mch_swing_bone(orgs)
self.bones.mch.ik_target = self.make_ik_mch_target_bone(orgs)
self.bones.mch.ik_end = self.copy_bone(orgs[1], make_derived_name(orgs[1], 'mch', '_ik'))
def make_ik_mch_base_bone(self, orgs):
return self.copy_bone(orgs[0], make_derived_name(orgs[0], 'mch', '_ik'))
- def make_ik_mch_stretch_bone(self, orgs):
- name = self.copy_bone(orgs[0], make_derived_name(orgs[0], 'mch', '_ik_stretch'))
- self.get_bone(name).tail = self.get_bone(orgs[2]).head
+ def make_ik_mch_swing_bone(self, orgs):
+ name = self.copy_bone(orgs[0], make_derived_name(orgs[0], 'mch', '_ik_swing'))
+ bone = self.get_bone(name)
+ bone.tail = bone.head + (self.get_bone(orgs[2]).head - bone.head).normalized() * bone.length * 0.3
return name
def make_ik_mch_target_bone(self, orgs):
@@ -533,8 +537,11 @@ class BaseLimbRig(BaseRig):
@stage.parent_bones
def parent_ik_mch_chain(self):
if self.use_mch_ik_base:
- self.set_bone_parent(self.bones.mch.ik_base, self.bones.ctrl.ik_base, inherit_scale='AVERAGE')
- self.set_bone_parent(self.bones.mch.ik_stretch, self.bones.mch.follow)
+ self.set_bone_parent(self.bones.mch.ik_swing, self.bones.ctrl.ik_base, inherit_scale='AVERAGE')
+ self.set_bone_parent(self.bones.mch.ik_base, self.bones.mch.ik_swing)
+ else:
+ self.set_bone_parent(self.bones.mch.ik_swing, self.bones.mch.follow)
+
self.set_bone_parent(self.bones.mch.ik_target, self.get_ik_input_bone())
self.set_bone_parent(self.bones.mch.ik_end, self.get_ik_chain_base())
@@ -608,26 +615,29 @@ class BaseLimbRig(BaseRig):
mch = self.bones.mch
input_bone = self.get_ik_input_bone()
- self.rig_ik_mch_stretch_bones(mch.ik_target, mch.ik_stretch, input_bone, self.ik_input_head_tail, 2)
+ self.make_constraint(mch.ik_swing, 'DAMPED_TRACK', mch.ik_target)
+
+ self.rig_ik_mch_stretch_limit(mch.ik_target, mch.follow, input_bone, self.ik_input_head_tail, 2)
self.rig_ik_mch_end_bone(mch.ik_end, mch.ik_target, self.bones.ctrl.ik_pole)
- def rig_ik_mch_stretch_bones(self, mch_target, mch_stretch, input_bone, head_tail, org_count, bias=1.035):
+ def rig_ik_mch_stretch_limit(self, mch_target, base_bone, input_bone, head_tail, org_count, bias=1.035):
# Compute increase in length to fully straighten
orgs = self.bones.org.main[0:org_count]
- len_cur = (self.get_bone(orgs[-1]).tail - self.get_bone(orgs[0]).head).length
len_full = sum(self.get_bone(org).length for org in orgs)
- len_scale = len_full / len_cur
- # Limited stretch on the stretch bone
- self.make_constraint(mch_stretch, 'STRETCH_TO', input_bone, head_tail=head_tail, keep_axis='SWING_Y')
+ # Snap the target to the input position
+ self.make_constraint(mch_target, 'COPY_LOCATION', input_bone, head_tail=head_tail)
- con = self.make_constraint(mch_stretch, 'LIMIT_SCALE', min_y=0.0, max_y=len_scale*bias, owner_space='LOCAL')
+ # Limit distance from the base of the limb
+ con = self.make_constraint(
+ mch_target, 'LIMIT_DISTANCE', base_bone,
+ limit_mode='LIMITDIST_INSIDE', distance=len_full*bias,
+ # Use custom space to tolerate rig scaling
+ space='CUSTOM', space_object=self.obj, space_subtarget=self.bones.mch.follow,
+ )
self.make_driver(con, "influence", variables=[(self.prop_bone, 'IK_Stretch')], polynomial=[1.0, -1.0])
- # Snap the target to the end of the stretch bone
- self.make_constraint(mch_target, 'COPY_LOCATION', mch_stretch, head_tail=1.0)
-
def rig_ik_mch_end_bone(self, mch_ik, mch_target, ctrl_pole, chain=2):
con = self.make_constraint(
mch_ik, 'IK', mch_target, chain_count=chain,
diff --git a/rigify/rigs/limbs/rear_paw.py b/rigify/rigs/limbs/rear_paw.py
index 5c1bf5c8..1292dc2e 100644
--- a/rigify/rigs/limbs/rear_paw.py
+++ b/rigify/rigs/limbs/rear_paw.py
@@ -39,7 +39,7 @@ class Rig(pawRig):
# EXTRA BONES
#
# mch:
- # ik2_stretch, ik2_target
+ # ik2_target
# Three bone IK stretch limit
# ik2_chain[2]
# Second IK system (pre-driving thigh and ik3)
@@ -88,14 +88,8 @@ class Rig(pawRig):
def make_ik2_mch_stretch(self):
orgs = self.bones.org.main
- self.bones.mch.ik2_stretch = self.make_ik2_mch_stretch_bone(orgs)
self.bones.mch.ik2_target = self.make_ik2_mch_target_bone(orgs)
- def make_ik2_mch_stretch_bone(self, orgs):
- name = self.copy_bone(orgs[0], make_derived_name(orgs[0], 'mch', '_ik2_stretch'))
- self.get_bone(name).tail = self.get_bone(orgs[3]).head
- return name
-
def make_ik2_mch_target_bone(self, orgs):
return self.copy_bone(orgs[3], make_derived_name(orgs[0], 'mch', '_ik2_target'), scale=1/2)
@@ -120,7 +114,6 @@ class Rig(pawRig):
@stage.parent_bones
def parent_ik2_mch_chain(self):
mch = self.bones.mch
- self.set_bone_parent(mch.ik2_stretch, mch.follow)
self.set_bone_parent(mch.ik2_target, self.get_ik2_input_bone())
self.set_bone_parent(mch.ik2_chain[0], self.bones.ctrl.ik_base, inherit_scale='AVERAGE')
self.parent_bone_chain(mch.ik2_chain, use_connect=True)
@@ -143,7 +136,7 @@ class Rig(pawRig):
input_bone = self.get_ik2_input_bone()
head_tail = 1 if self.use_heel2 else 0
- self.rig_ik_mch_stretch_bones(mch.ik2_target, mch.ik2_stretch, input_bone, head_tail, 3)
+ self.rig_ik_mch_stretch_limit(mch.ik2_target, mch.follow, input_bone, head_tail, 3)
self.rig_ik_mch_end_bone(mch.ik2_chain[-1], mch.ik2_target, self.bones.ctrl.ik_pole)