diff options
author | Alexander Gavrilov <angavrilov@gmail.com> | 2020-12-01 18:51:03 +0300 |
---|---|---|
committer | Alexander Gavrilov <angavrilov@gmail.com> | 2020-12-01 21:28:44 +0300 |
commit | 287f8443007100b2b27097c5fa5bf37e810801d7 (patch) | |
tree | 0f740f3bc8d9aa96dcda977ef7b627980249c926 /rigify | |
parent | 73976fd55a45d48b8e86c163375f26d5c5a7be68 (diff) |
Rigify: add an option to generate controls for each of the palm bones.
Diffstat (limited to 'rigify')
-rw-r--r-- | rigify/rigs/limbs/super_palm.py | 99 |
1 files changed, 85 insertions, 14 deletions
diff --git a/rigify/rigs/limbs/super_palm.py b/rigify/rigs/limbs/super_palm.py index 5756348c..ed044fe1 100644 --- a/rigify/rigs/limbs/super_palm.py +++ b/rigify/rigs/limbs/super_palm.py @@ -27,6 +27,7 @@ from itertools import count, repeat from rigify.utils.rig import is_rig_base_bone from rigify.utils.naming import strip_org, make_derived_name, choose_derived_bone from rigify.utils.widgets import create_widget +from rigify.utils.widgets_basic import create_bone_widget from rigify.utils.misc import map_list from rigify.base_rig import BaseRig, stage @@ -71,6 +72,7 @@ class Rig(BaseRig): self.palm_rotation_axis = self.params.palm_rotation_axis self.make_secondary = self.params.palm_both_sides + self.make_fk = self.params.make_extra_control self.order = 'YXZ' if 'X' in self.palm_rotation_axis else 'YZX' @@ -96,6 +98,11 @@ class Rig(BaseRig): # Main control. # secondary: # Control for the other side. + # fk[]: + # Optional individual FK controls + # mch: + # fk_parents[]: + # Parents for the individual FK controls # deform[]: # DEF bones # @@ -179,22 +186,62 @@ class Rig(BaseRig): mod.levels = 2 #################################################### - # ORG bones + # FK controls + + @stage.generate_bones + def make_fk_controls(self): + if self.make_fk: + self.bones.ctrl.fk = map_list(self.make_fk_control_bone, count(0), self.bones.org) + + def make_fk_control_bone(self, i, org): + return self.copy_bone(org, make_derived_name(org, 'ctrl', '_fk')) @stage.parent_bones - def parent_org_chain(self): - for org in self.bones.org: - self.set_bone_parent(org, self.rig_parent_bone, inherit_scale='NONE') + def parent_fk_controls(self): + if self.make_fk: + for fk, mch in zip(self.bones.ctrl.fk, self.bones.mch.fk_parents): + self.set_bone_parent(fk, mch, inherit_scale='ALIGNED') - @stage.rig_bones - def rig_org_chain(self): - orgs = self.bones.org - ctrl = self.bones.ctrl + @stage.configure_bones + def configure_fk_controls(self): + if self.make_fk: + for fk, org in zip(self.bones.ctrl.fk, self.bones.org): + self.copy_bone_properties(org, fk) + + @stage.generate_widgets + def make_fk_control_widgets(self): + if self.make_fk: + for fk in self.bones.ctrl.fk: + create_bone_widget(self.obj, fk) + + #################################################### + # FK parent bones + + @stage.generate_bones + def make_mch_fk_parents(self): + if self.make_fk: + self.bones.mch.fk_parents = map_list(self.make_fk_parent_bone, count(0), self.bones.org) - for args in zip(count(0), orgs, repeat(len(orgs))): - self.rig_org_bone(*args) + def make_fk_parent_bone(self, i, org): + return self.copy_bone(org, make_derived_name(org, 'mch', '_fk_parent')) - def rig_org_bone(self, i, org, num_orgs): + @stage.parent_bones + def parent_mch_fk_parents(self): + if self.make_fk: + for i, mch in enumerate(self.bones.mch.fk_parents): + self.parent_mch_fk_parent_bone(i, mch) + + def parent_mch_fk_parent_bone(self, i, mch): + self.set_bone_parent(mch, self.rig_parent_bone, inherit_scale='NONE') + + @stage.rig_bones + def rig_mch_fk_parents(self): + if self.make_fk: + for i, mch in enumerate(self.bones.mch.fk_parents): + self.rig_mch_fk_parent_bone(i, mch) + + def rig_mch_fk_parent_bone(self, i, org): + num_orgs = len(self.bones.org) ctrl = self.bones.ctrl fac = i / (num_orgs - 1) @@ -221,12 +268,12 @@ class Rig(BaseRig): self.make_constraint(org, 'COPY_SCALE', self.rig_parent_bone) - self.rig_org_back_rotation(org, ctrl.master, fac) + self.rig_mch_back_rotation(org, ctrl.master, fac) if self.make_secondary: - self.rig_org_back_rotation(org, ctrl.secondary, 1 - fac) + self.rig_mch_back_rotation(org, ctrl.secondary, 1 - fac) - def rig_org_back_rotation(self, org, ctrl, fac): + def rig_mch_back_rotation(self, org, ctrl, fac): if 0 < fac < 1: inf = (fac + 1) * (fac + cos(fac * pi / 2) - 1) @@ -244,6 +291,24 @@ class Rig(BaseRig): ) #################################################### + # ORG bones + + @stage.parent_bones + def parent_org_chain(self): + if self.make_fk: + for org, fk in zip(self.bones.org, self.bones.ctrl.fk): + self.set_bone_parent(org, fk) + else: + for i, org in enumerate(self.bones.org): + self.parent_mch_fk_parent_bone(i, org) + + @stage.rig_bones + def rig_org_chain(self): + if not self.make_fk: + for i, org in enumerate(self.bones.org): + self.rig_mch_fk_parent_bone(i, org) + + #################################################### # DEF bones @stage.generate_bones @@ -274,6 +339,11 @@ class Rig(BaseRig): default=False, description="Create controls for both sides of the palm" ) + params.make_extra_control = bpy.props.BoolProperty( + name = "Extra Control", + default = False, + description = "Create an optional control" + ) @classmethod def parameters_ui(cls, layout, params): @@ -281,6 +351,7 @@ class Rig(BaseRig): r.label(text="Primary rotation axis:") r.prop(params, "palm_rotation_axis", text="") layout.prop(params, "palm_both_sides") + layout.prop(params, "make_extra_control", text="Extra FK Controls") def create_sample(obj): |