diff options
author | Demeter Dzadik <Mets> | 2020-11-07 17:32:29 +0300 |
---|---|---|
committer | Alexander Gavrilov <angavrilov@gmail.com> | 2020-11-24 17:23:54 +0300 |
commit | 46590bb7800eea5aa1826f6e9305d7e0320829be (patch) | |
tree | 23e19892343abcc9ab1ffcf5f1b5a4e072c997bd | |
parent | 3bbcfa7c2d5ca564804c30f0b19c219e00dc4892 (diff) |
Rigify: Fix T78463: better support unguligrade animals (horse) setup.
Add support for 5 bone chains to the limbs.paw rig.
Implement a new limbs.rear_paw rig, which provides a three bone IK
mechanism designed to keep the first and third bones nearly parallel
by default (based on a YouTube video by @Pieriko as suggested by
@icappiello).
Implement a limbs.front_paw rig with automation that aims to
keep the angle between second and third bones mostly stable
by default (has influence option), as suitable for front paws.
The horse and wolf metarigs are updated to use these new rig
types, with the horse rig further overhauled by @icappiello.
Maniphest Tasks: T78463
Differential Revision: https://developer.blender.org/D8496
-rw-r--r-- | rigify/base_generate.py | 4 | ||||
-rw-r--r-- | rigify/base_rig.py | 7 | ||||
-rw-r--r-- | rigify/generate.py | 7 | ||||
-rw-r--r-- | rigify/metarigs/Animals/horse.py | 820 | ||||
-rw-r--r-- | rigify/metarigs/Animals/wolf.py | 770 | ||||
-rw-r--r-- | rigify/rig_ui_template.py | 39 | ||||
-rw-r--r-- | rigify/rigs/limbs/arm.py | 5 | ||||
-rw-r--r-- | rigify/rigs/limbs/front_paw.py | 288 | ||||
-rw-r--r-- | rigify/rigs/limbs/leg.py | 5 | ||||
-rw-r--r-- | rigify/rigs/limbs/limb_rigs.py | 155 | ||||
-rw-r--r-- | rigify/rigs/limbs/paw.py | 136 | ||||
-rw-r--r-- | rigify/rigs/limbs/rear_paw.py | 472 | ||||
-rw-r--r-- | rigify/utils/bones.py | 6 |
13 files changed, 1584 insertions, 1130 deletions
diff --git a/rigify/base_generate.py b/rigify/base_generate.py index 22a35eae..ce04b8fc 100644 --- a/rigify/base_generate.py +++ b/rigify/base_generate.py @@ -359,6 +359,10 @@ class BaseGenerator: self.__run_object_stage('configure_bones') + def invoke_preapply_bones(self): + self.__run_object_stage('preapply_bones') + + def invoke_apply_bones(self): self.__run_edit_stage('apply_bones') diff --git a/rigify/base_rig.py b/rigify/base_rig.py index 056c2785..d878143b 100644 --- a/rigify/base_rig.py +++ b/rigify/base_rig.py @@ -119,6 +119,13 @@ class GenerateCallbackHost(BaseStagedClass, define_stages=True): """ pass + def preapply_bones(self): + """ + Read bone matrices for applying to edit mode. + Called in Object mode. May not do Edit mode operations. + """ + pass + def apply_bones(self): """ Can be used to apply some constraints to rest pose, and for final parenting. diff --git a/rigify/generate.py b/rigify/generate.py index a4e97f96..9c861d97 100644 --- a/rigify/generate.py +++ b/rigify/generate.py @@ -429,6 +429,13 @@ class Generator(base_generate.BaseGenerator): t.tick("Configure bones: ") #------------------------------------------ + bpy.ops.object.mode_set(mode='OBJECT') + + self.invoke_preapply_bones() + + t.tick("Preapply bones: ") + + #------------------------------------------ bpy.ops.object.mode_set(mode='EDIT') self.invoke_apply_bones() diff --git a/rigify/metarigs/Animals/horse.py b/rigify/metarigs/Animals/horse.py index eafb9b02..1cdd4feb 100644 --- a/rigify/metarigs/Animals/horse.py +++ b/rigify/metarigs/Animals/horse.py @@ -165,432 +165,432 @@ def create(obj): bones = {} - bone = arm.edit_bones.new('spine.005') - bone.head = -0.0000, 0.9228, 1.4526 - bone.tail = -0.0000, 0.6989, 1.4910 - bone.roll = -0.0000 + bone = arm.edit_bones.new('spine.001') + bone.head = 0.0000, 0.8059, 1.3950 + bone.tail = 0.0000, 0.3939, 1.3950 + bone.roll = 0.0000 bone.use_connect = False - bones['spine.005'] = bone.name - bone = arm.edit_bones.new('spine.004') - bone.head = -0.0000, 0.9228, 1.4526 - bone.tail = -0.0000, 1.0291, 1.4191 - bone.roll = -0.0000 + bones['spine.001'] = bone.name + bone = arm.edit_bones.new('tail.001') + bone.head = -0.0000, 0.8970, 1.4526 + bone.tail = 0.0000, 1.0033, 1.4420 + bone.roll = 0.0000 bone.use_connect = False - bone.parent = arm.edit_bones[bones['spine.005']] - bones['spine.004'] = bone.name - bone = arm.edit_bones.new('spine.006') - bone.head = -0.0000, 0.6989, 1.4910 - bone.tail = 0.0000, 0.3824, 1.3801 - bone.roll = -0.0000 + bone.parent = arm.edit_bones[bones['spine.001']] + bones['tail.001'] = bone.name + bone = arm.edit_bones.new('spine.002') + bone.head = 0.0000, 0.3939, 1.3950 + bone.tail = -0.0000, 0.2088, 1.3270 + bone.roll = 0.0000 bone.use_connect = True - bone.parent = arm.edit_bones[bones['spine.005']] - bones['spine.006'] = bone.name - bone = arm.edit_bones.new('spine.003') - bone.head = -0.0000, 1.0291, 1.4191 + bone.parent = arm.edit_bones[bones['spine.001']] + bones['spine.002'] = bone.name + bone = arm.edit_bones.new('tail.002') + bone.head = 0.0000, 1.0033, 1.4420 bone.tail = -0.0000, 1.1423, 1.3128 bone.roll = -0.0000 bone.use_connect = True - bone.parent = arm.edit_bones[bones['spine.004']] - bones['spine.003'] = bone.name - bone = arm.edit_bones.new('spine.007') - bone.head = 0.0000, 0.3824, 1.3801 - bone.tail = 0.0000, 0.1316, 1.3086 + bone.parent = arm.edit_bones[bones['tail.001']] + bones['tail.002'] = bone.name + bone = arm.edit_bones.new('spine.003') + bone.head = -0.0000, 0.2088, 1.3270 + bone.tail = -0.0000, 0.0294, 1.2857 bone.roll = 0.0000 bone.use_connect = True - bone.parent = arm.edit_bones[bones['spine.006']] - bones['spine.007'] = bone.name + bone.parent = arm.edit_bones[bones['spine.002']] + bones['spine.003'] = bone.name bone = arm.edit_bones.new('pelvis.L') - bone.head = 0.0503, 0.6868, 1.3205 + bone.head = -0.0000, 0.8059, 1.3950 bone.tail = 0.1803, 0.4418, 1.5783 - bone.roll = 0.7837 + bone.roll = 0.6304 bone.use_connect = False - bone.parent = arm.edit_bones[bones['spine.006']] + bone.parent = arm.edit_bones[bones['spine.002']] bones['pelvis.L'] = bone.name - bone = arm.edit_bones.new('thigh.L') - bone.head = 0.1922, 0.7048, 1.4330 - bone.tail = 0.1933, 0.5712, 1.0272 - bone.roll = 3.1380 - bone.use_connect = False - bone.parent = arm.edit_bones[bones['spine.006']] - bones['thigh.L'] = bone.name bone = arm.edit_bones.new('pelvis.R') - bone.head = -0.0503, 0.6868, 1.3205 + bone.head = 0.0000, 0.8059, 1.3950 bone.tail = -0.1803, 0.4418, 1.5783 - bone.roll = -0.7837 + bone.roll = -0.6304 bone.use_connect = False - bone.parent = arm.edit_bones[bones['spine.006']] + bone.parent = arm.edit_bones[bones['spine.002']] bones['pelvis.R'] = bone.name - bone = arm.edit_bones.new('thigh.R') - bone.head = -0.1922, 0.7048, 1.4330 - bone.tail = -0.1933, 0.5712, 1.0272 - bone.roll = -3.1380 - bone.use_connect = False - bone.parent = arm.edit_bones[bones['spine.006']] - bones['thigh.R'] = bone.name - bone = arm.edit_bones.new('pelvis') - bone.head = 0.0000, 0.6845, 1.3200 - bone.tail = -0.0000, 0.4276, 1.0452 + bone = arm.edit_bones.new('hip') + bone.head = -0.0000, 0.8059, 1.3950 + bone.tail = -0.0000, 0.4636, 1.0212 bone.roll = 0.0000 bone.use_connect = False - bone.parent = arm.edit_bones[bones['spine.006']] - bones['pelvis'] = bone.name - bone = arm.edit_bones.new('spine.002') + bone.parent = arm.edit_bones[bones['spine.002']] + bones['hip'] = bone.name + bone = arm.edit_bones.new('tail.003') bone.head = -0.0000, 1.1423, 1.3128 bone.tail = -0.0000, 1.3779, 1.1589 bone.roll = -0.0000 bone.use_connect = True - bone.parent = arm.edit_bones[bones['spine.003']] - bones['spine.002'] = bone.name - bone = arm.edit_bones.new('spine.008') - bone.head = 0.0000, 0.1316, 1.3086 - bone.tail = 0.0000, -0.1712, 1.2964 + bone.parent = arm.edit_bones[bones['tail.002']] + bones['tail.003'] = bone.name + bone = arm.edit_bones.new('spine.004') + bone.head = -0.0000, 0.0294, 1.2857 + bone.tail = -0.0000, -0.1769, 1.2735 bone.roll = 0.0000 bone.use_connect = True - bone.parent = arm.edit_bones[bones['spine.007']] - bones['spine.008'] = bone.name - bone = arm.edit_bones.new('shin.L') - bone.head = 0.1933, 0.5712, 1.0272 - bone.tail = 0.1933, 0.7355, 0.6045 - bone.roll = -3.1416 - bone.use_connect = True - bone.parent = arm.edit_bones[bones['thigh.L']] - bones['shin.L'] = bone.name - bone = arm.edit_bones.new('shin.R') - bone.head = -0.1933, 0.5712, 1.0272 - bone.tail = -0.1933, 0.7355, 0.6045 - bone.roll = 3.1416 - bone.use_connect = True - bone.parent = arm.edit_bones[bones['thigh.R']] - bones['shin.R'] = bone.name - bone = arm.edit_bones.new('spine.001') + bone.parent = arm.edit_bones[bones['spine.003']] + bones['spine.004'] = bone.name + bone = arm.edit_bones.new('abdomen') + bone.head = -0.0000, 0.1503, 1.2207 + bone.tail = -0.0000, 0.2042, 0.9012 + bone.roll = 0.0000 + bone.use_connect = False + bone.parent = arm.edit_bones[bones['spine.003']] + bones['abdomen'] = bone.name + bone = arm.edit_bones.new('thigh.L') + bone.head = 0.1922, 0.6243, 1.4090 + bone.tail = 0.1933, 0.5569, 1.0335 + bone.roll = 3.1378 + bone.use_connect = False + bone.parent = arm.edit_bones[bones['pelvis.L']] + bones['thigh.L'] = bone.name + bone = arm.edit_bones.new('thigh.R') + bone.head = -0.1922, 0.6243, 1.4090 + bone.tail = -0.1933, 0.5569, 1.0335 + bone.roll = -3.1378 + bone.use_connect = False + bone.parent = arm.edit_bones[bones['pelvis.R']] + bones['thigh.R'] = bone.name + bone = arm.edit_bones.new('tail.004') bone.head = -0.0000, 1.3779, 1.1589 bone.tail = -0.0000, 1.5754, 1.1088 bone.roll = -0.0000 bone.use_connect = True - bone.parent = arm.edit_bones[bones['spine.002']] - bones['spine.001'] = bone.name - bone = arm.edit_bones.new('spine.009') - bone.head = 0.0000, -0.1712, 1.2964 - bone.tail = 0.0000, -0.4908, 1.3031 + bone.parent = arm.edit_bones[bones['tail.003']] + bones['tail.004'] = bone.name + bone = arm.edit_bones.new('spine.005') + bone.head = -0.0000, -0.1769, 1.2735 + bone.tail = -0.0000, -0.3674, 1.2808 bone.roll = 0.0000 bone.use_connect = True - bone.parent = arm.edit_bones[bones['spine.008']] - bones['spine.009'] = bone.name - bone = arm.edit_bones.new('belly') - bone.head = -0.0000, 0.1503, 1.2207 - bone.tail = -0.0000, 0.1802, 0.9332 - bone.roll = 0.0000 - bone.use_connect = False - bone.parent = arm.edit_bones[bones['spine.008']] - bones['belly'] = bone.name - bone = arm.edit_bones.new('foot.L') - bone.head = 0.1933, 0.7355, 0.6045 - bone.tail = 0.1933, 0.6771, 0.1732 + bone.parent = arm.edit_bones[bones['spine.004']] + bones['spine.005'] = bone.name + bone = arm.edit_bones.new('lower_leg.L') + bone.head = 0.1933, 0.5569, 1.0335 + bone.tail = 0.1933, 0.7635, 0.6074 bone.roll = -3.1416 bone.use_connect = True - bone.parent = arm.edit_bones[bones['shin.L']] - bones['foot.L'] = bone.name - bone = arm.edit_bones.new('foot.R') - bone.head = -0.1933, 0.7355, 0.6045 - bone.tail = -0.1933, 0.6771, 0.1732 + bone.parent = arm.edit_bones[bones['thigh.L']] + bones['lower_leg.L'] = bone.name + bone = arm.edit_bones.new('lower_leg.R') + bone.head = -0.1933, 0.5569, 1.0335 + bone.tail = -0.1933, 0.7635, 0.6074 bone.roll = 3.1416 bone.use_connect = True - bone.parent = arm.edit_bones[bones['shin.R']] - bones['foot.R'] = bone.name - bone = arm.edit_bones.new('spine') + bone.parent = arm.edit_bones[bones['thigh.R']] + bones['lower_leg.R'] = bone.name + bone = arm.edit_bones.new('tail.005') bone.head = -0.0000, 1.5754, 1.1088 bone.tail = -0.0000, 1.7610, 1.1153 bone.roll = -0.0000 bone.use_connect = True - bone.parent = arm.edit_bones[bones['spine.001']] - bones['spine'] = bone.name - bone = arm.edit_bones.new('spine.010') - bone.head = 0.0000, -0.4908, 1.3031 - bone.tail = 0.0000, -0.7593, 1.3786 + bone.parent = arm.edit_bones[bones['tail.004']] + bones['tail.005'] = bone.name + bone = arm.edit_bones.new('spine.006') + bone.head = -0.0000, -0.3674, 1.2808 + bone.tail = 0.0000, -0.7593, 1.3826 bone.roll = 0.0000 bone.use_connect = True - bone.parent = arm.edit_bones[bones['spine.009']] - bones['spine.010'] = bone.name + bone.parent = arm.edit_bones[bones['spine.005']] + bones['spine.006'] = bone.name bone = arm.edit_bones.new('shoulder.L') bone.head = 0.0936, -0.5035, 1.5783 - bone.tail = 0.1868, -0.6452, 1.0858 - bone.roll = -0.2398 + bone.tail = 0.1868, -0.6945, 1.1976 + bone.roll = -0.3119 bone.use_connect = False - bone.parent = arm.edit_bones[bones['spine.009']] + bone.parent = arm.edit_bones[bones['spine.005']] bones['shoulder.L'] = bone.name bone = arm.edit_bones.new('breast.L') bone.head = 0.0905, -0.5541, 1.0931 - bone.tail = 0.0905, -0.8316, 0.9879 + bone.tail = 0.0905, -0.8436, 0.9400 bone.roll = 0.0000 bone.use_connect = False - bone.parent = arm.edit_bones[bones['spine.009']] + bone.parent = arm.edit_bones[bones['spine.005']] bones['breast.L'] = bone.name bone = arm.edit_bones.new('shoulder.R') bone.head = -0.0936, -0.5035, 1.5783 - bone.tail = -0.1868, -0.6452, 1.0858 - bone.roll = 0.2398 + bone.tail = -0.1868, -0.6945, 1.1976 + bone.roll = 0.3119 bone.use_connect = False - bone.parent = arm.edit_bones[bones['spine.009']] + bone.parent = arm.edit_bones[bones['spine.005']] bones['shoulder.R'] = bone.name bone = arm.edit_bones.new('breast.R') bone.head = -0.0905, -0.5541, 1.0931 - bone.tail = -0.0905, -0.8316, 0.9879 + bone.tail = -0.0905, -0.8436, 0.9400 bone.roll = -0.0000 bone.use_connect = False - bone.parent = arm.edit_bones[bones['spine.009']] + bone.parent = arm.edit_bones[bones['spine.005']] bones['breast.R'] = bone.name bone = arm.edit_bones.new('chest') bone.head = -0.0000, -0.2180, 1.2173 - bone.tail = -0.0000, -0.2239, 0.8383 + bone.tail = -0.0000, -0.2239, 0.8063 bone.roll = 0.0000 bone.use_connect = False - bone.parent = arm.edit_bones[bones['spine.009']] + bone.parent = arm.edit_bones[bones['spine.005']] bones['chest'] = bone.name - bone = arm.edit_bones.new('r_toe.L') - bone.head = 0.1933, 0.6771, 0.1732 - bone.tail = 0.1933, 0.5818, 0.0198 - bone.roll = 3.1416 - bone.use_connect = True - bone.parent = arm.edit_bones[bones['foot.L']] - bones['r_toe.L'] = bone.name - bone = arm.edit_bones.new('r_toe.R') - bone.head = -0.1933, 0.6771, 0.1732 - bone.tail = -0.1933, 0.5818, 0.0198 + bone = arm.edit_bones.new('hind_foot.L') + bone.head = 0.1933, 0.7635, 0.6074 + bone.tail = 0.1933, 0.6900, 0.2011 bone.roll = -3.1416 bone.use_connect = True - bone.parent = arm.edit_bones[bones['foot.R']] - bones['r_toe.R'] = bone.name - bone = arm.edit_bones.new('spine.011') - bone.head = 0.0000, -0.7593, 1.3786 + bone.parent = arm.edit_bones[bones['lower_leg.L']] + bones['hind_foot.L'] = bone.name + bone = arm.edit_bones.new('hind_foot.R') + bone.head = -0.1933, 0.7635, 0.6074 + bone.tail = -0.1933, 0.6900, 0.2011 + bone.roll = 3.1416 + bone.use_connect = True + bone.parent = arm.edit_bones[bones['lower_leg.R']] + bones['hind_foot.R'] = bone.name + bone = arm.edit_bones.new('neck.001') + bone.head = 0.0000, -0.7593, 1.3826 bone.tail = 0.0000, -0.9004, 1.5475 bone.roll = 0.0000 bone.use_connect = False - bone.parent = arm.edit_bones[bones['spine.010']] - bones['spine.011'] = bone.name - bone = arm.edit_bones.new('hair_base.05') + bone.parent = arm.edit_bones[bones['spine.006']] + bones['neck.001'] = bone.name + bone = arm.edit_bones.new('mane_base.05') bone.head = -0.0000, -0.6120, 1.6888 bone.tail = -0.0000, -0.5782, 1.7371 bone.roll = 0.0000 bone.use_connect = False - bone.parent = arm.edit_bones[bones['spine.010']] - bones['hair_base.05'] = bone.name + bone.parent = arm.edit_bones[bones['spine.006']] + bones['mane_base.05'] = bone.name bone = arm.edit_bones.new('upper_arm.L') - bone.head = 0.1639, -0.5751, 0.9953 - bone.tail = 0.1639, -0.5538, 0.5130 + bone.head = 0.1639, -0.6896, 1.1597 + bone.tail = 0.1639, -0.5323, 0.8412 bone.roll = -3.1416 bone.use_connect = False bone.parent = arm.edit_bones[bones['shoulder.L']] bones['upper_arm.L'] = bone.name bone = arm.edit_bones.new('upper_arm.R') - bone.head = -0.1639, -0.5751, 0.9953 - bone.tail = -0.1639, -0.5538, 0.5130 + bone.head = -0.1639, -0.6896, 1.1597 + bone.tail = -0.1639, -0.5323, 0.8412 bone.roll = 3.1416 bone.use_connect = False bone.parent = arm.edit_bones[bones['shoulder.R']] bones['upper_arm.R'] = bone.name - bone = arm.edit_bones.new('spine.012') + bone = arm.edit_bones.new('r_toe.L') + bone.head = 0.1933, 0.6900, 0.2011 + bone.tail = 0.1933, 0.6341, 0.1052 + bone.roll = 3.1416 + bone.use_connect = True + bone.parent = arm.edit_bones[bones['hind_foot.L']] + bones['r_toe.L'] = bone.name + bone = arm.edit_bones.new('r_toe.R') + bone.head = -0.1933, 0.6900, 0.2011 + bone.tail = -0.1933, 0.6341, 0.1052 + bone.roll = -3.1416 + bone.use_connect = True + bone.parent = arm.edit_bones[bones['hind_foot.R']] + bones['r_toe.R'] = bone.name + bone = arm.edit_bones.new('neck.002') bone.head = 0.0000, -0.9004, 1.5475 bone.tail = 0.0000, -1.0348, 1.7032 bone.roll = 0.0000 bone.use_connect = True - bone.parent = arm.edit_bones[bones['spine.011']] - bones['spine.012'] = bone.name - bone = arm.edit_bones.new('hair_base.04') + bone.parent = arm.edit_bones[bones['neck.001']] + bones['neck.002'] = bone.name + bone = arm.edit_bones.new('mane_base.04') bone.head = 0.0000, -0.7885, 1.7610 bone.tail = -0.0000, -0.7366, 1.8394 bone.roll = 0.0000 bone.use_connect = False - bone.parent = arm.edit_bones[bones['spine.011']] - bones['hair_base.04'] = bone.name - bone = arm.edit_bones.new('hair_top.05') + bone.parent = arm.edit_bones[bones['neck.001']] + bones['mane_base.04'] = bone.name + bone = arm.edit_bones.new('mane_top.05') bone.head = -0.0000, -0.5782, 1.7371 bone.tail = -0.0000, -0.5444, 1.7855 bone.roll = 0.0000 bone.use_connect = True - bone.parent = arm.edit_bones[bones['hair_base.05']] - bones['hair_top.05'] = bone.name + bone.parent = arm.edit_bones[bones['mane_base.05']] + bones['mane_top.05'] = bone.name bone = arm.edit_bones.new('forearm.L') - bone.head = 0.1639, -0.5538, 0.5130 - bone.tail = 0.1639, -0.5133, 0.1885 + bone.head = 0.1639, -0.5323, 0.8412 + bone.tail = 0.1639, -0.5386, 0.4807 bone.roll = -3.1416 bone.use_connect = True bone.parent = arm.edit_bones[bones['upper_arm.L']] bones['forearm.L'] = bone.name bone = arm.edit_bones.new('forearm.R') - bone.head = -0.1639, -0.5538, 0.5130 - bone.tail = -0.1639, -0.5133, 0.1885 + bone.head = -0.1639, -0.5323, 0.8412 + bone.tail = -0.1639, -0.5386, 0.4807 bone.roll = 3.1416 bone.use_connect = True bone.parent = arm.edit_bones[bones['upper_arm.R']] bones['forearm.R'] = bone.name - bone = arm.edit_bones.new('spine.014') + bone = arm.edit_bones.new('r_hoof.L') + bone.head = 0.1933, 0.6341, 0.1052 + bone.tail = 0.1933, 0.5916, 0.0007 + bone.roll = -3.1416 + bone.use_connect = True + bone.parent = arm.edit_bones[bones['r_toe.L']] + bones['r_hoof.L'] = bone.name + bone = arm.edit_bones.new('r_hoof.R') + bone.head = -0.1933, 0.6341, 0.1052 + bone.tail = -0.1933, 0.5916, 0.0007 + bone.roll = 3.1416 + bone.use_connect = True + bone.parent = arm.edit_bones[bones['r_toe.R']] + bones['r_hoof.R'] = bone.name + bone = arm.edit_bones.new('neck.003') bone.head = 0.0000, -1.0348, 1.7032 bone.tail = 0.0000, -1.1618, 1.7694 bone.roll = -0.0000 bone.use_connect = True - bone.parent = arm.edit_bones[bones['spine.012']] - bones['spine.014'] = bone.name - bone = arm.edit_bones.new('hair_base.03') + bone.parent = arm.edit_bones[bones['neck.002']] + bones['neck.003'] = bone.name + bone = arm.edit_bones.new('mane_base.03') bone.head = 0.0000, -0.9627, 1.8513 bone.tail = 0.0000, -0.9211, 1.9357 bone.roll = 0.0000 bone.use_connect = False - bone.parent = arm.edit_bones[bones['spine.012']] - bones['hair_base.03'] = bone.name - bone = arm.edit_bones.new('hair_top.04') + bone.parent = arm.edit_bones[bones['neck.002']] + bones['mane_base.03'] = bone.name + bone = arm.edit_bones.new('mane_top.04') bone.head = -0.0000, -0.7366, 1.8394 bone.tail = -0.0000, -0.6847, 1.9178 bone.roll = 0.0000 bone.use_connect = True - bone.parent = arm.edit_bones[bones['hair_base.04']] - bones['hair_top.04'] = bone.name - bone = arm.edit_bones.new('hand.L') - bone.head = 0.1639, -0.5133, 0.1885 - bone.tail = 0.1639, -0.5844, 0.0665 + bone.parent = arm.edit_bones[bones['mane_base.04']] + bones['mane_top.04'] = bone.name + bone = arm.edit_bones.new('forefoot.L') + bone.head = 0.1639, -0.5386, 0.4807 + bone.tail = 0.1639, -0.5158, 0.2212 bone.roll = -3.1416 bone.use_connect = True bone.parent = arm.edit_bones[bones['forearm.L']] - bones['hand.L'] = bone.name - bone = arm.edit_bones.new('hand.R') - bone.head = -0.1639, -0.5133, 0.1885 - bone.tail = -0.1639, -0.5844, 0.0665 + bones['forefoot.L'] = bone.name + bone = arm.edit_bones.new('forefoot.R') + bone.head = -0.1639, -0.5386, 0.4807 + bone.tail = -0.1639, -0.5158, 0.2212 bone.roll = 3.1416 bone.use_connect = True bone.parent = arm.edit_bones[bones['forearm.R']] - bones['hand.R'] = bone.name - bone = arm.edit_bones.new('spine.015') + bones['forefoot.R'] = bone.name + bone = arm.edit_bones.new('neck.004') bone.head = 0.0000, -1.1618, 1.7694 bone.tail = -0.0000, -1.2836, 1.7841 bone.roll = -0.0000 bone.use_connect = True - bone.parent = arm.edit_bones[bones['spine.014']] - bones['spine.015'] = bone.name - bone = arm.edit_bones.new('hair_base.02') + bone.parent = arm.edit_bones[bones['neck.003']] + bones['neck.004'] = bone.name + bone = arm.edit_bones.new('mane_base.02') bone.head = 0.0000, -1.1437, 1.9124 bone.tail = 0.0000, -1.1217, 2.0038 bone.roll = 0.0000 bone.use_connect = False - bone.parent = arm.edit_bones[bones['spine.014']] - bones['hair_base.02'] = bone.name - bone = arm.edit_bones.new('hair_top.03') + bone.parent = arm.edit_bones[bones['neck.003']] + bones['mane_base.02'] = bone.name + bone = arm.edit_bones.new('mane_top.03') bone.head = 0.0000, -0.9211, 1.9357 bone.tail = -0.0000, -0.8795, 2.0200 bone.roll = 0.0000 bone.use_connect = True - bone.parent = arm.edit_bones[bones['hair_base.03']] - bones['hair_top.03'] = bone.name + bone.parent = arm.edit_bones[bones['mane_base.03']] + bones['mane_top.03'] = bone.name bone = arm.edit_bones.new('f_toe.L') - bone.head = 0.1639, -0.5844, 0.0665 - bone.tail = 0.1639, -0.6564, 0.0185 + bone.head = 0.1639, -0.5158, 0.2212 + bone.tail = 0.1639, -0.5722, 0.0941 bone.roll = 3.1416 bone.use_connect = True - bone.parent = arm.edit_bones[bones['hand.L']] + bone.parent = arm.edit_bones[bones['forefoot.L']] bones['f_toe.L'] = bone.name bone = arm.edit_bones.new('f_toe.R') - bone.head = -0.1639, -0.5844, 0.0665 - bone.tail = -0.1639, -0.6564, 0.0185 + bone.head = -0.1639, -0.5158, 0.2212 + bone.tail = -0.1639, -0.5722, 0.0941 bone.roll = -3.1416 bone.use_connect = True - bone.parent = arm.edit_bones[bones['hand.R']] + bone.parent = arm.edit_bones[bones['forefoot.R']] bones['f_toe.R'] = bone.name - bone = arm.edit_bones.new('spine.016') + bone = arm.edit_bones.new('head') bone.head = -0.0000, -1.2836, 1.7841 - bone.tail = 0.0000, -1.5974, 1.9308 + bone.tail = -0.0000, -1.6414, 1.7070 bone.roll = 0.0000 bone.use_connect = True - bone.parent = arm.edit_bones[bones['spine.015']] - bones['spine.016'] = bone.name - bone = arm.edit_bones.new('hair_base.01') + bone.parent = arm.edit_bones[bones['neck.004']] + bones['head'] = bone.name + bone = arm.edit_bones.new('mane_base.01') bone.head = 0.0000, -1.3074, 1.9345 bone.tail = 0.0000, -1.3182, 2.0279 bone.roll = 0.0000 bone.use_connect = False - bone.parent = arm.edit_bones[bones['spine.015']] - bones['hair_base.01'] = bone.name - bone = arm.edit_bones.new('hair_base.06') + bone.parent = arm.edit_bones[bones['neck.004']] + bones['mane_base.01'] = bone.name + bone = arm.edit_bones.new('mane_base.06') bone.head = 0.0000, -1.4117, 1.9184 bone.tail = 0.0000, -1.4566, 1.9477 bone.roll = 0.0000 bone.use_connect = False - bone.parent = arm.edit_bones[bones['spine.015']] - bones['hair_base.06'] = bone.name - bone = arm.edit_bones.new('hair_top.02') + bone.parent = arm.edit_bones[bones['neck.004']] + bones['mane_base.06'] = bone.name + bone = arm.edit_bones.new('mane_top.02') bone.head = 0.0000, -1.1217, 2.0038 bone.tail = 0.0000, -1.0996, 2.0953 bone.roll = 0.0000 bone.use_connect = True - bone.parent = arm.edit_bones[bones['hair_base.02']] - bones['hair_top.02'] = bone.name + bone.parent = arm.edit_bones[bones['mane_base.02']] + bones['mane_top.02'] = bone.name + bone = arm.edit_bones.new('f_hoof.L') + bone.head = 0.1639, -0.5722, 0.0941 + bone.tail = 0.1639, -0.6384, 0.0007 + bone.roll = -3.1416 + bone.use_connect = True + bone.parent = arm.edit_bones[bones['f_toe.L']] + bones['f_hoof.L'] = bone.name + bone = arm.edit_bones.new('f_hoof.R') + bone.head = -0.1639, -0.5722, 0.0941 + bone.tail = -0.1639, -0.6384, 0.0007 + bone.roll = 3.1416 + bone.use_connect = True + bone.parent = arm.edit_bones[bones['f_toe.R']] + bones['f_hoof.R'] = bone.name bone = arm.edit_bones.new('skull') bone.head = -0.0000, -1.3014, 1.8284 bone.tail = 0.0000, -1.6749, 1.3100 bone.roll = 0.0000 bone.use_connect = False - bone.parent = arm.edit_bones[bones['spine.016']] + bone.parent = arm.edit_bones[bones['head']] bones['skull'] = bone.name bone = arm.edit_bones.new('ear.L') bone.head = 0.0664, -1.3623, 1.8612 bone.tail = 0.1056, -1.4118, 1.9537 bone.roll = 0.6751 bone.use_connect = False - bone.parent = arm.edit_bones[bones['spine.016']] + bone.parent = arm.edit_bones[bones['head']] bones['ear.L'] = bone.name - bone = arm.edit_bones.new('eye.L') - bone.head = 0.0988, -1.4596, 1.7351 - bone.tail = 0.1990, -1.4668, 1.7420 - bone.roll = 0.0000 - bone.use_connect = False - bone.parent = arm.edit_bones[bones['spine.016']] - bones['eye.L'] = bone.name - bone = arm.edit_bones.new('nose.L') - bone.head = 0.0450, -1.6240, 1.4228 - bone.tail = 0.1039, -1.6613, 1.4269 - bone.roll = 0.0000 - bone.use_connect = False - bone.parent = arm.edit_bones[bones['spine.016']] - bones['nose.L'] = bone.name - bone = arm.edit_bones.new('eye.R') - bone.head = -0.0988, -1.4596, 1.7351 - bone.tail = -0.1990, -1.4668, 1.7420 - bone.roll = -0.0000 - bone.use_connect = False - bone.parent = arm.edit_bones[bones['spine.016']] - bones['eye.R'] = bone.name - bone = arm.edit_bones.new('nose.R') - bone.head = -0.0450, -1.6240, 1.4228 - bone.tail = -0.1039, -1.6613, 1.4269 - bone.roll = -0.0000 - bone.use_connect = False - bone.parent = arm.edit_bones[bones['spine.016']] - bones['nose.R'] = bone.name bone = arm.edit_bones.new('ear.R') bone.head = -0.0664, -1.3623, 1.8612 bone.tail = -0.1056, -1.4118, 1.9537 bone.roll = -0.6751 bone.use_connect = False - bone.parent = arm.edit_bones[bones['spine.016']] + bone.parent = arm.edit_bones[bones['head']] bones['ear.R'] = bone.name bone = arm.edit_bones.new('jaw') bone.head = 0.0000, -1.3507, 1.5819 bone.tail = 0.0000, -1.4799, 1.4569 bone.roll = 0.0000 bone.use_connect = False - bone.parent = arm.edit_bones[bones['spine.016']] + bone.parent = arm.edit_bones[bones['head']] bones['jaw'] = bone.name - bone = arm.edit_bones.new('hair_top.01') + bone = arm.edit_bones.new('mane_top.01') bone.head = 0.0000, -1.3182, 2.0279 bone.tail = 0.0000, -1.3290, 2.1213 bone.roll = 0.0000 bone.use_connect = True - bone.parent = arm.edit_bones[bones['hair_base.01']] - bones['hair_top.01'] = bone.name - bone = arm.edit_bones.new('hair_top.06') + bone.parent = arm.edit_bones[bones['mane_base.01']] + bones['mane_top.01'] = bone.name + bone = arm.edit_bones.new('mane_top.06') bone.head = 0.0000, -1.4566, 1.9477 bone.tail = -0.0000, -1.5014, 1.9770 bone.roll = 0.0000 bone.use_connect = True - bone.parent = arm.edit_bones[bones['hair_base.06']] - bones['hair_top.06'] = bone.name + bone.parent = arm.edit_bones[bones['mane_base.06']] + bones['mane_top.06'] = bone.name bone = arm.edit_bones.new('skull.L') bone.head = 0.0000, -1.3014, 1.8284 bone.tail = 0.1564, -1.4143, 1.5755 @@ -612,6 +612,34 @@ def create(obj): bone.use_connect = True bone.parent = arm.edit_bones[bones['ear.L']] bones['ear.L.001'] = bone.name + bone = arm.edit_bones.new('eye.L') + bone.head = 0.0988, -1.4596, 1.7351 + bone.tail = 0.1990, -1.4668, 1.7420 + bone.roll = 0.0000 + bone.use_connect = False + bone.parent = arm.edit_bones[bones['ear.L']] + bones['eye.L'] = bone.name + bone = arm.edit_bones.new('nose.L') + bone.head = 0.0450, -1.6240, 1.4228 + bone.tail = 0.1039, -1.6613, 1.4269 + bone.roll = 0.0000 + bone.use_connect = False + bone.parent = arm.edit_bones[bones['ear.L']] + bones['nose.L'] = bone.name + bone = arm.edit_bones.new('eye.R') + bone.head = -0.0988, -1.4596, 1.7351 + bone.tail = -0.1990, -1.4668, 1.7420 + bone.roll = -0.0000 + bone.use_connect = False + bone.parent = arm.edit_bones[bones['ear.L']] + bones['eye.R'] = bone.name + bone = arm.edit_bones.new('nose.R') + bone.head = -0.0450, -1.6240, 1.4228 + bone.tail = -0.1039, -1.6613, 1.4269 + bone.roll = -0.0000 + bone.use_connect = False + bone.parent = arm.edit_bones[bones['ear.L']] + bones['nose.R'] = bone.name bone = arm.edit_bones.new('ear.R.001') bone.head = -0.1056, -1.4118, 1.9537 bone.tail = -0.1448, -1.4613, 2.0462 @@ -628,16 +656,16 @@ def create(obj): bones['jaw.001'] = bone.name bpy.ops.object.mode_set(mode='OBJECT') - pbone = obj.pose.bones[bones['spine.005']] + pbone = obj.pose.bones[bones['spine.001']] pbone.rigify_type = 'spines.basic_spine' pbone.lock_location = (False, False, False) pbone.lock_rotation = (False, False, False) pbone.lock_rotation_w = False pbone.lock_scale = (False, False, False) pbone.rotation_mode = 'QUATERNION' - pbone.bone.layers = [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False] + pbone.bone.layers = [False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] try: - pbone.rigify_parameters.pivot_pos = 3 + pbone.rigify_parameters.pivot_pos = 2 except AttributeError: pass try: @@ -648,7 +676,7 @@ def create(obj): pbone.rigify_parameters.fk_layers = [False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] except AttributeError: pass - pbone = obj.pose.bones[bones['spine.004']] + pbone = obj.pose.bones[bones['tail.001']] pbone.rigify_type = 'spines.basic_tail' pbone.lock_location = (False, False, False) pbone.lock_rotation = (False, False, False) @@ -661,14 +689,14 @@ def create(obj): except AttributeError: pass try: - pbone.rigify_parameters.connect_chain = True + pbone.rigify_parameters.connect_chain = False except AttributeError: pass try: pbone.rigify_parameters.tweak_layers = [False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] except AttributeError: pass - pbone = obj.pose.bones[bones['spine.006']] + pbone = obj.pose.bones[bones['spine.002']] pbone.rigify_type = '' pbone.lock_location = (False, False, False) pbone.lock_rotation = (False, False, False) @@ -676,7 +704,7 @@ def create(obj): pbone.lock_scale = (False, False, False) pbone.rotation_mode = 'QUATERNION' pbone.bone.layers = [False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] - pbone = obj.pose.bones[bones['spine.003']] + pbone = obj.pose.bones[bones['tail.002']] pbone.rigify_type = '' pbone.lock_location = (False, False, False) pbone.lock_rotation = (False, False, False) @@ -684,7 +712,7 @@ def create(obj): pbone.lock_scale = (False, False, False) pbone.rotation_mode = 'QUATERNION' pbone.bone.layers = [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False] - pbone = obj.pose.bones[bones['spine.007']] + pbone = obj.pose.bones[bones['spine.003']] pbone.rigify_type = '' pbone.lock_location = (False, False, False) pbone.lock_rotation = (False, False, False) @@ -708,30 +736,6 @@ def create(obj): pbone.rigify_parameters.make_control = False except AttributeError: pass - pbone = obj.pose.bones[bones['thigh.L']] - pbone.rigify_type = 'limbs.super_limb' - pbone.lock_location = (False, False, False) - pbone.lock_rotation = (False, False, False) - pbone.lock_rotation_w = False - pbone.lock_scale = (False, False, False) - pbone.rotation_mode = 'QUATERNION' - pbone.bone.layers = [False, False, False, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] - try: - pbone.rigify_parameters.limb_type = "paw" - except AttributeError: - pass - try: - pbone.rigify_parameters.fk_layers = [False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] - except AttributeError: - pass - try: - pbone.rigify_parameters.tweak_layers = [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] - except AttributeError: - pass - try: - pbone.rigify_parameters.segments = 2 - except AttributeError: - pass pbone = obj.pose.bones[bones['pelvis.R']] pbone.rigify_type = 'basic.super_copy' pbone.lock_location = (False, False, False) @@ -748,71 +752,103 @@ def create(obj): pbone.rigify_parameters.make_control = False except AttributeError: pass - pbone = obj.pose.bones[bones['thigh.R']] - pbone.rigify_type = 'limbs.super_limb' + pbone = obj.pose.bones[bones['hip']] + pbone.rigify_type = '' pbone.lock_location = (False, False, False) pbone.lock_rotation = (False, False, False) pbone.lock_rotation_w = False pbone.lock_scale = (False, False, False) pbone.rotation_mode = 'QUATERNION' - pbone.bone.layers = [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] - try: - pbone.rigify_parameters.limb_type = "paw" - except AttributeError: - pass - try: - pbone.rigify_parameters.fk_layers = [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False] - except AttributeError: - pass - try: - pbone.rigify_parameters.tweak_layers = [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, True, False, False, False, False, False, False, False, False, False, False, False, False] - except AttributeError: - pass - try: - pbone.rigify_parameters.segments = 2 - except AttributeError: - pass - pbone = obj.pose.bones[bones['pelvis']] - pbone.rigify_type = 'basic.super_copy' + pbone.bone.layers = [False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] + pbone = obj.pose.bones[bones['tail.003']] + pbone.rigify_type = '' pbone.lock_location = (False, False, False) pbone.lock_rotation = (False, False, False) pbone.lock_rotation_w = False pbone.lock_scale = (False, False, False) pbone.rotation_mode = 'QUATERNION' - pbone.bone.layers = [False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] - pbone = obj.pose.bones[bones['spine.002']] + pbone.bone.layers = [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False] + pbone = obj.pose.bones[bones['spine.004']] pbone.rigify_type = '' pbone.lock_location = (False, False, False) pbone.lock_rotation = (False, False, False) pbone.lock_rotation_w = False pbone.lock_scale = (False, False, False) pbone.rotation_mode = 'QUATERNION' - pbone.bone.layers = [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False] - pbone = obj.pose.bones[bones['spine.008']] + pbone.bone.layers = [False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] + pbone = obj.pose.bones[bones['abdomen']] pbone.rigify_type = '' pbone.lock_location = (False, False, False) pbone.lock_rotation = (False, False, False) pbone.lock_rotation_w = False pbone.lock_scale = (False, False, False) pbone.rotation_mode = 'QUATERNION' - pbone.bone.layers = [False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] - pbone = obj.pose.bones[bones['shin.L']] - pbone.rigify_type = '' + pbone.bone.layers = [False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] + pbone = obj.pose.bones[bones['thigh.L']] + pbone.rigify_type = 'limbs.rear_paw' pbone.lock_location = (False, False, False) pbone.lock_rotation = (False, False, False) pbone.lock_rotation_w = False pbone.lock_scale = (False, False, False) pbone.rotation_mode = 'QUATERNION' pbone.bone.layers = [False, False, False, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] - pbone = obj.pose.bones[bones['shin.R']] - pbone.rigify_type = '' + try: + pbone.rigify_parameters.fk_layers = [False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] + except AttributeError: + pass + try: + pbone.rigify_parameters.tweak_layers = [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] + except AttributeError: + pass + try: + pbone.rigify_parameters.segments = 2 + except AttributeError: + pass + try: + pbone.rigify_parameters.bbones = 10 + except AttributeError: + pass + try: + pbone.rigify_parameters.fk_layers_extra = True + except AttributeError: + pass + try: + pbone.rigify_parameters.tweak_layers_extra = True + except AttributeError: + pass + pbone = obj.pose.bones[bones['thigh.R']] + pbone.rigify_type = 'limbs.rear_paw' pbone.lock_location = (False, False, False) pbone.lock_rotation = (False, False, False) pbone.lock_rotation_w = False pbone.lock_scale = (False, False, False) pbone.rotation_mode = 'QUATERNION' pbone.bone.layers = [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] - pbone = obj.pose.bones[bones['spine.001']] + try: + pbone.rigify_parameters.fk_layers = [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False] + except AttributeError: + pass + try: + pbone.rigify_parameters.tweak_layers = [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False] + except AttributeError: + pass + try: + pbone.rigify_parameters.segments = 2 + except AttributeError: + pass + try: + pbone.rigify_parameters.bbones = 10 + except AttributeError: + pass + try: + pbone.rigify_parameters.fk_layers_extra = True + except AttributeError: + pass + try: + pbone.rigify_parameters.tweak_layers_extra = True + except AttributeError: + pass + pbone = obj.pose.bones[bones['tail.004']] pbone.rigify_type = '' pbone.lock_location = (False, False, False) pbone.lock_rotation = (False, False, False) @@ -820,7 +856,7 @@ def create(obj): pbone.lock_scale = (False, False, False) pbone.rotation_mode = 'QUATERNION' pbone.bone.layers = [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False] - pbone = obj.pose.bones[bones['spine.009']] + pbone = obj.pose.bones[bones['spine.005']] pbone.rigify_type = '' pbone.lock_location = (False, False, False) pbone.lock_rotation = (False, False, False) @@ -828,15 +864,7 @@ def create(obj): pbone.lock_scale = (False, False, False) pbone.rotation_mode = 'QUATERNION' pbone.bone.layers = [False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] - pbone = obj.pose.bones[bones['belly']] - pbone.rigify_type = 'basic.super_copy' - pbone.lock_location = (False, False, False) - pbone.lock_rotation = (False, False, False) - pbone.lock_rotation_w = False - pbone.lock_scale = (False, False, False) - pbone.rotation_mode = 'QUATERNION' - pbone.bone.layers = [False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] - pbone = obj.pose.bones[bones['foot.L']] + pbone = obj.pose.bones[bones['lower_leg.L']] pbone.rigify_type = '' pbone.lock_location = (False, False, False) pbone.lock_rotation = (False, False, False) @@ -844,7 +872,7 @@ def create(obj): pbone.lock_scale = (False, False, False) pbone.rotation_mode = 'QUATERNION' pbone.bone.layers = [False, False, False, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] - pbone = obj.pose.bones[bones['foot.R']] + pbone = obj.pose.bones[bones['lower_leg.R']] pbone.rigify_type = '' pbone.lock_location = (False, False, False) pbone.lock_rotation = (False, False, False) @@ -852,7 +880,7 @@ def create(obj): pbone.lock_scale = (False, False, False) pbone.rotation_mode = 'QUATERNION' pbone.bone.layers = [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] - pbone = obj.pose.bones[bones['spine']] + pbone = obj.pose.bones[bones['tail.005']] pbone.rigify_type = '' pbone.lock_location = (False, False, False) pbone.lock_rotation = (False, False, False) @@ -860,7 +888,7 @@ def create(obj): pbone.lock_scale = (False, False, False) pbone.rotation_mode = 'QUATERNION' pbone.bone.layers = [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False] - pbone = obj.pose.bones[bones['spine.010']] + pbone = obj.pose.bones[bones['spine.006']] pbone.rigify_type = '' pbone.lock_location = (False, False, False) pbone.lock_rotation = (False, False, False) @@ -916,7 +944,7 @@ def create(obj): pbone.lock_scale = (False, False, False) pbone.rotation_mode = 'QUATERNION' pbone.bone.layers = [False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] - pbone = obj.pose.bones[bones['r_toe.L']] + pbone = obj.pose.bones[bones['hind_foot.L']] pbone.rigify_type = '' pbone.lock_location = (False, False, False) pbone.lock_rotation = (False, False, False) @@ -924,7 +952,7 @@ def create(obj): pbone.lock_scale = (False, False, False) pbone.rotation_mode = 'QUATERNION' pbone.bone.layers = [False, False, False, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] - pbone = obj.pose.bones[bones['r_toe.R']] + pbone = obj.pose.bones[bones['hind_foot.R']] pbone.rigify_type = '' pbone.lock_location = (False, False, False) pbone.lock_rotation = (False, False, False) @@ -932,7 +960,7 @@ def create(obj): pbone.lock_scale = (False, False, False) pbone.rotation_mode = 'QUATERNION' pbone.bone.layers = [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] - pbone = obj.pose.bones[bones['spine.011']] + pbone = obj.pose.bones[bones['neck.001']] pbone.rigify_type = 'spines.super_head' pbone.lock_location = (False, False, False) pbone.lock_rotation = (False, False, False) @@ -948,7 +976,7 @@ def create(obj): pbone.rigify_parameters.tweak_layers = [False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] except AttributeError: pass - pbone = obj.pose.bones[bones['hair_base.05']] + pbone = obj.pose.bones[bones['mane_base.05']] pbone.rigify_type = 'limbs.super_finger' pbone.lock_location = (False, False, False) pbone.lock_rotation = (False, False, False) @@ -965,7 +993,7 @@ def create(obj): except AttributeError: pass pbone = obj.pose.bones[bones['upper_arm.L']] - pbone.rigify_type = 'limbs.super_limb' + pbone.rigify_type = 'limbs.front_paw' pbone.lock_location = (False, False, False) pbone.lock_rotation = (False, False, False) pbone.lock_rotation_w = False @@ -984,8 +1012,12 @@ def create(obj): pbone.rigify_parameters.tweak_layers = [False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] except AttributeError: pass + try: + pbone.rigify_parameters.front_paw_heel_influence = 0.6000000238418579 + except AttributeError: + pass pbone = obj.pose.bones[bones['upper_arm.R']] - pbone.rigify_type = 'limbs.super_limb' + pbone.rigify_type = 'limbs.front_paw' pbone.lock_location = (False, False, False) pbone.lock_rotation = (False, False, False) pbone.lock_rotation_w = False @@ -1004,7 +1036,27 @@ def create(obj): pbone.rigify_parameters.tweak_layers = [False, False, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] except AttributeError: pass - pbone = obj.pose.bones[bones['spine.012']] + try: + pbone.rigify_parameters.front_paw_heel_influence = 0.6000000238418579 + except AttributeError: + pass + pbone = obj.pose.bones[bones['r_toe.L']] + pbone.rigify_type = '' + pbone.lock_location = (False, False, False) + pbone.lock_rotation = (False, False, False) + pbone.lock_rotation_w = False + pbone.lock_scale = (False, False, False) + pbone.rotation_mode = 'QUATERNION' + pbone.bone.layers = [False, False, False, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] + pbone = obj.pose.bones[bones['r_toe.R']] + pbone.rigify_type = '' + pbone.lock_location = (False, False, False) + pbone.lock_rotation = (False, False, False) + pbone.lock_rotation_w = False + pbone.lock_scale = (False, False, False) + pbone.rotation_mode = 'QUATERNION' + pbone.bone.layers = [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] + pbone = obj.pose.bones[bones['neck.002']] pbone.rigify_type = '' pbone.lock_location = (False, False, False) pbone.lock_rotation = (False, False, False) @@ -1012,7 +1064,7 @@ def create(obj): pbone.lock_scale = (False, False, False) pbone.rotation_mode = 'QUATERNION' pbone.bone.layers = [False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] - pbone = obj.pose.bones[bones['hair_base.04']] + pbone = obj.pose.bones[bones['mane_base.04']] pbone.rigify_type = 'limbs.super_finger' pbone.lock_location = (False, False, False) pbone.lock_rotation = (False, False, False) @@ -1028,7 +1080,7 @@ def create(obj): pbone.rigify_parameters.primary_rotation_axis = "Z" except AttributeError: pass - pbone = obj.pose.bones[bones['hair_top.05']] + pbone = obj.pose.bones[bones['mane_top.05']] pbone.rigify_type = '' pbone.lock_location = (False, False, False) pbone.lock_rotation = (False, False, False) @@ -1052,7 +1104,23 @@ def create(obj): pbone.lock_scale = (False, False, False) pbone.rotation_mode = 'QUATERNION' pbone.bone.layers = [False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] - pbone = obj.pose.bones[bones['spine.014']] + pbone = obj.pose.bones[bones['r_hoof.L']] + pbone.rigify_type = '' + pbone.lock_location = (False, False, False) + pbone.lock_rotation = (False, False, False) + pbone.lock_rotation_w = False + pbone.lock_scale = (False, False, False) + pbone.rotation_mode = 'QUATERNION' + pbone.bone.layers = [False, False, False, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] + pbone = obj.pose.bones[bones['r_hoof.R']] + pbone.rigify_type = '' + pbone.lock_location = (False, False, False) + pbone.lock_rotation = (False, False, False) + pbone.lock_rotation_w = False + pbone.lock_scale = (False, False, False) + pbone.rotation_mode = 'QUATERNION' + pbone.bone.layers = [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] + pbone = obj.pose.bones[bones['neck.003']] pbone.rigify_type = '' pbone.lock_location = (False, False, False) pbone.lock_rotation = (False, False, False) @@ -1060,7 +1128,7 @@ def create(obj): pbone.lock_scale = (False, False, False) pbone.rotation_mode = 'QUATERNION' pbone.bone.layers = [False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] - pbone = obj.pose.bones[bones['hair_base.03']] + pbone = obj.pose.bones[bones['mane_base.03']] pbone.rigify_type = 'limbs.super_finger' pbone.lock_location = (False, False, False) pbone.lock_rotation = (False, False, False) @@ -1076,7 +1144,7 @@ def create(obj): pbone.rigify_parameters.primary_rotation_axis = "Z" except AttributeError: pass - pbone = obj.pose.bones[bones['hair_top.04']] + pbone = obj.pose.bones[bones['mane_top.04']] pbone.rigify_type = '' pbone.lock_location = (False, False, False) pbone.lock_rotation = (False, False, False) @@ -1084,7 +1152,7 @@ def create(obj): pbone.lock_scale = (False, False, False) pbone.rotation_mode = 'QUATERNION' pbone.bone.layers = [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False] - pbone = obj.pose.bones[bones['hand.L']] + pbone = obj.pose.bones[bones['forefoot.L']] pbone.rigify_type = '' pbone.lock_location = (False, False, False) pbone.lock_rotation = (False, False, False) @@ -1092,7 +1160,7 @@ def create(obj): pbone.lock_scale = (False, False, False) pbone.rotation_mode = 'QUATERNION' pbone.bone.layers = [False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] - pbone = obj.pose.bones[bones['hand.R']] + pbone = obj.pose.bones[bones['forefoot.R']] pbone.rigify_type = '' pbone.lock_location = (False, False, False) pbone.lock_rotation = (False, False, False) @@ -1100,7 +1168,7 @@ def create(obj): pbone.lock_scale = (False, False, False) pbone.rotation_mode = 'QUATERNION' pbone.bone.layers = [False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] - pbone = obj.pose.bones[bones['spine.015']] + pbone = obj.pose.bones[bones['neck.004']] pbone.rigify_type = '' pbone.lock_location = (False, False, False) pbone.lock_rotation = (False, False, False) @@ -1108,7 +1176,7 @@ def create(obj): pbone.lock_scale = (False, False, False) pbone.rotation_mode = 'QUATERNION' pbone.bone.layers = [False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] - pbone = obj.pose.bones[bones['hair_base.02']] + pbone = obj.pose.bones[bones['mane_base.02']] pbone.rigify_type = 'limbs.super_finger' pbone.lock_location = (False, False, False) pbone.lock_rotation = (False, False, False) @@ -1124,7 +1192,7 @@ def create(obj): pbone.rigify_parameters.primary_rotation_axis = "Z" except AttributeError: pass - pbone = obj.pose.bones[bones['hair_top.03']] + pbone = obj.pose.bones[bones['mane_top.03']] pbone.rigify_type = '' pbone.lock_location = (False, False, False) pbone.lock_rotation = (False, False, False) @@ -1148,7 +1216,7 @@ def create(obj): pbone.lock_scale = (False, False, False) pbone.rotation_mode = 'QUATERNION' pbone.bone.layers = [False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] - pbone = obj.pose.bones[bones['spine.016']] + pbone = obj.pose.bones[bones['head']] pbone.rigify_type = '' pbone.lock_location = (False, False, False) pbone.lock_rotation = (False, False, False) @@ -1156,7 +1224,7 @@ def create(obj): pbone.lock_scale = (False, False, False) pbone.rotation_mode = 'QUATERNION' pbone.bone.layers = [False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] - pbone = obj.pose.bones[bones['hair_base.01']] + pbone = obj.pose.bones[bones['mane_base.01']] pbone.rigify_type = 'limbs.super_finger' pbone.lock_location = (False, False, False) pbone.lock_rotation = (False, False, False) @@ -1172,7 +1240,7 @@ def create(obj): pbone.rigify_parameters.primary_rotation_axis = "Z" except AttributeError: pass - pbone = obj.pose.bones[bones['hair_base.06']] + pbone = obj.pose.bones[bones['mane_base.06']] pbone.rigify_type = 'limbs.super_finger' pbone.lock_location = (False, False, False) pbone.lock_rotation = (False, False, False) @@ -1188,7 +1256,7 @@ def create(obj): pbone.rigify_parameters.primary_rotation_axis = "Z" except AttributeError: pass - pbone = obj.pose.bones[bones['hair_top.02']] + pbone = obj.pose.bones[bones['mane_top.02']] pbone.rigify_type = '' pbone.lock_location = (False, False, False) pbone.lock_rotation = (False, False, False) @@ -1196,6 +1264,22 @@ def create(obj): pbone.lock_scale = (False, False, False) pbone.rotation_mode = 'QUATERNION' pbone.bone.layers = [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False] + pbone = obj.pose.bones[bones['f_hoof.L']] + pbone.rigify_type = '' + pbone.lock_location = (False, False, False) + pbone.lock_rotation = (False, False, False) + pbone.lock_rotation_w = False + pbone.lock_scale = (False, False, False) + pbone.rotation_mode = 'QUATERNION' + pbone.bone.layers = [False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] + pbone = obj.pose.bones[bones['f_hoof.R']] + pbone.rigify_type = '' + pbone.lock_location = (False, False, False) + pbone.lock_rotation = (False, False, False) + pbone.lock_rotation_w = False + pbone.lock_scale = (False, False, False) + pbone.rotation_mode = 'QUATERNION' + pbone.bone.layers = [False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] pbone = obj.pose.bones[bones['skull']] pbone.rigify_type = 'basic.super_copy' pbone.lock_location = (False, False, False) @@ -1224,38 +1308,6 @@ def create(obj): pbone.rigify_parameters.copy_rotation_axes = [True, False, True] except AttributeError: pass - pbone = obj.pose.bones[bones['eye.L']] - pbone.rigify_type = 'basic.super_copy' - pbone.lock_location = (False, False, False) - pbone.lock_rotation = (False, False, False) - pbone.lock_rotation_w = False - pbone.lock_scale = (False, False, False) - pbone.rotation_mode = 'QUATERNION' - pbone.bone.layers = [True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] - pbone = obj.pose.bones[bones['nose.L']] - pbone.rigify_type = 'basic.super_copy' - pbone.lock_location = (False, False, False) - pbone.lock_rotation = (False, False, False) - pbone.lock_rotation_w = False - pbone.lock_scale = (False, False, False) - pbone.rotation_mode = 'QUATERNION' - pbone.bone.layers = [True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] - pbone = obj.pose.bones[bones['eye.R']] - pbone.rigify_type = 'basic.super_copy' - pbone.lock_location = (False, False, False) - pbone.lock_rotation = (False, False, False) - pbone.lock_rotation_w = False - pbone.lock_scale = (False, False, False) - pbone.rotation_mode = 'QUATERNION' - pbone.bone.layers = [True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] - pbone = obj.pose.bones[bones['nose.R']] - pbone.rigify_type = 'basic.super_copy' - pbone.lock_location = (False, False, False) - pbone.lock_rotation = (False, False, False) - pbone.lock_rotation_w = False - pbone.lock_scale = (False, False, False) - pbone.rotation_mode = 'QUATERNION' - pbone.bone.layers = [True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] pbone = obj.pose.bones[bones['ear.R']] pbone.rigify_type = 'limbs.simple_tentacle' pbone.lock_location = (False, False, False) @@ -1288,7 +1340,7 @@ def create(obj): pbone.rigify_parameters.copy_rotation_axes = [False, False, False] except AttributeError: pass - pbone = obj.pose.bones[bones['hair_top.01']] + pbone = obj.pose.bones[bones['mane_top.01']] pbone.rigify_type = '' pbone.lock_location = (False, False, False) pbone.lock_rotation = (False, False, False) @@ -1296,7 +1348,7 @@ def create(obj): pbone.lock_scale = (False, False, False) pbone.rotation_mode = 'QUATERNION' pbone.bone.layers = [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False] - pbone = obj.pose.bones[bones['hair_top.06']] + pbone = obj.pose.bones[bones['mane_top.06']] pbone.rigify_type = '' pbone.lock_location = (False, False, False) pbone.lock_rotation = (False, False, False) @@ -1344,6 +1396,38 @@ def create(obj): pbone.lock_scale = (False, False, False) pbone.rotation_mode = 'QUATERNION' pbone.bone.layers = [True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] + pbone = obj.pose.bones[bones['eye.L']] + pbone.rigify_type = 'basic.super_copy' + pbone.lock_location = (False, False, False) + pbone.lock_rotation = (False, False, False) + pbone.lock_rotation_w = False + pbone.lock_scale = (False, False, False) + pbone.rotation_mode = 'QUATERNION' + pbone.bone.layers = [True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] + pbone = obj.pose.bones[bones['nose.L']] + pbone.rigify_type = 'basic.super_copy' + pbone.lock_location = (False, False, False) + pbone.lock_rotation = (False, False, False) + pbone.lock_rotation_w = False + pbone.lock_scale = (False, False, False) + pbone.rotation_mode = 'QUATERNION' + pbone.bone.layers = [True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] + pbone = obj.pose.bones[bones['eye.R']] + pbone.rigify_type = 'basic.super_copy' + pbone.lock_location = (False, False, False) + pbone.lock_rotation = (False, False, False) + pbone.lock_rotation_w = False + pbone.lock_scale = (False, False, False) + pbone.rotation_mode = 'QUATERNION' + pbone.bone.layers = [True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] + pbone = obj.pose.bones[bones['nose.R']] + pbone.rigify_type = 'basic.super_copy' + pbone.lock_location = (False, False, False) + pbone.lock_rotation = (False, False, False) + pbone.lock_rotation_w = False + pbone.lock_scale = (False, False, False) + pbone.rotation_mode = 'QUATERNION' + pbone.bone.layers = [True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] pbone = obj.pose.bones[bones['ear.R.001']] pbone.rigify_type = '' pbone.lock_location = (False, False, False) diff --git a/rigify/metarigs/Animals/wolf.py b/rigify/metarigs/Animals/wolf.py index f6150c54..775f2973 100644 --- a/rigify/metarigs/Animals/wolf.py +++ b/rigify/metarigs/Animals/wolf.py @@ -166,1330 +166,1330 @@ def create(obj): bones = {} bone = arm.edit_bones.new('spine.004') - bone.head[:] = 0.0000, 0.4418, 0.7954 - bone.tail[:] = 0.0000, 0.3546, 0.8059 + bone.head = 0.0000, 0.4085, 0.7928 + bone.tail = 0.0000, 0.2416, 0.7928 bone.roll = 0.0000 bone.use_connect = False bones['spine.004'] = bone.name bone = arm.edit_bones.new('spine.003') - bone.head[:] = 0.0000, 0.4418, 0.7954 - bone.tail[:] = 0.0000, 0.5547, 0.7568 + bone.head = 0.0000, 0.4085, 0.7928 + bone.tail = 0.0000, 0.5555, 0.7567 bone.roll = 0.0000 bone.use_connect = False bone.parent = arm.edit_bones[bones['spine.004']] bones['spine.003'] = bone.name bone = arm.edit_bones.new('spine.005') - bone.head[:] = 0.0000, 0.3546, 0.8059 - bone.tail[:] = 0.0000, 0.1803, 0.7782 + bone.head = 0.0000, 0.2416, 0.7928 + bone.tail = 0.0000, 0.1202, 0.7773 bone.roll = 0.0000 bone.use_connect = True bone.parent = arm.edit_bones[bones['spine.004']] bones['spine.005'] = bone.name bone = arm.edit_bones.new('spine.002') - bone.head[:] = 0.0000, 0.5547, 0.7568 - bone.tail[:] = 0.0000, 0.7755, 0.7418 + bone.head = 0.0000, 0.5555, 0.7567 + bone.tail = 0.0000, 0.7816, 0.7412 bone.roll = 0.0000 bone.use_connect = True bone.parent = arm.edit_bones[bones['spine.003']] bones['spine.002'] = bone.name bone = arm.edit_bones.new('spine.006') - bone.head[:] = 0.0000, 0.1803, 0.7782 - bone.tail[:] = 0.0000, 0.0319, 0.7731 + bone.head = 0.0000, 0.1202, 0.7773 + bone.tail = 0.0000, 0.0096, 0.7773 bone.roll = 0.0000 bone.use_connect = True bone.parent = arm.edit_bones[bones['spine.005']] bones['spine.006'] = bone.name bone = arm.edit_bones.new('pelvis.L') - bone.head[:] = 0.0000, 0.3757, 0.6043 - bone.tail[:] = 0.0751, 0.2755, 0.8544 + bone.head = 0.0000, 0.3757, 0.6043 + bone.tail = 0.0751, 0.2755, 0.8544 bone.roll = -1.5841 bone.use_connect = False bone.parent = arm.edit_bones[bones['spine.005']] bones['pelvis.L'] = bone.name bone = arm.edit_bones.new('pelvis.R') - bone.head[:] = -0.0000, 0.3757, 0.6043 - bone.tail[:] = -0.0751, 0.2755, 0.8544 + bone.head = -0.0000, 0.3757, 0.6043 + bone.tail = -0.0751, 0.2755, 0.8544 bone.roll = 1.5841 bone.use_connect = False bone.parent = arm.edit_bones[bones['spine.005']] bones['pelvis.R'] = bone.name bone = arm.edit_bones.new('thigh.L') - bone.head[:] = 0.1249, 0.3419, 0.7379 - bone.tail[:] = 0.1249, 0.2712, 0.4731 + bone.head = 0.1249, 0.3419, 0.7379 + bone.tail = 0.1249, 0.2712, 0.4731 bone.roll = -0.0000 bone.use_connect = False bone.parent = arm.edit_bones[bones['spine.005']] bones['thigh.L'] = bone.name bone = arm.edit_bones.new('thigh.R') - bone.head[:] = -0.1249, 0.3419, 0.7379 - bone.tail[:] = -0.1249, 0.2712, 0.4731 + bone.head = -0.1249, 0.3419, 0.7379 + bone.tail = -0.1249, 0.2712, 0.4731 bone.roll = 0.0000 bone.use_connect = False bone.parent = arm.edit_bones[bones['spine.005']] bones['thigh.R'] = bone.name bone = arm.edit_bones.new('spine.001') - bone.head[:] = 0.0000, 0.7755, 0.7418 - bone.tail[:] = 0.0000, 0.9624, 0.7412 + bone.head = 0.0000, 0.7816, 0.7412 + bone.tail = 0.0000, 0.9624, 0.7412 bone.roll = 0.0000 bone.use_connect = True bone.parent = arm.edit_bones[bones['spine.002']] bones['spine.001'] = bone.name bone = arm.edit_bones.new('spine.007') - bone.head[:] = 0.0000, 0.0319, 0.7731 - bone.tail[:] = 0.0000, -0.0980, 0.7945 + bone.head = 0.0000, 0.0096, 0.7773 + bone.tail = 0.0000, -0.0980, 0.7945 bone.roll = 0.0000 bone.use_connect = True bone.parent = arm.edit_bones[bones['spine.006']] bones['spine.007'] = bone.name bone = arm.edit_bones.new('shin.L') - bone.head[:] = 0.1249, 0.2712, 0.4731 - bone.tail[:] = 0.1114, 0.4766, 0.2473 + bone.head = 0.1249, 0.2712, 0.4731 + bone.tail = 0.1114, 0.4766, 0.2473 bone.roll = 0.0195 bone.use_connect = True bone.parent = arm.edit_bones[bones['thigh.L']] bones['shin.L'] = bone.name bone = arm.edit_bones.new('shin.R') - bone.head[:] = -0.1249, 0.2712, 0.4731 - bone.tail[:] = -0.1114, 0.4766, 0.2473 + bone.head = -0.1249, 0.2712, 0.4731 + bone.tail = -0.1114, 0.4766, 0.2473 bone.roll = -0.0195 bone.use_connect = True bone.parent = arm.edit_bones[bones['thigh.R']] bones['shin.R'] = bone.name bone = arm.edit_bones.new('spine') - bone.head[:] = 0.0000, 0.9624, 0.7412 - bone.tail[:] = 0.0000, 1.1044, 0.7633 + bone.head = 0.0000, 0.9624, 0.7412 + bone.tail = 0.0000, 1.1044, 0.7633 bone.roll = 0.0000 bone.use_connect = True bone.parent = arm.edit_bones[bones['spine.001']] bones['spine'] = bone.name bone = arm.edit_bones.new('spine.008') - bone.head[:] = 0.0000, -0.0980, 0.7945 - bone.tail[:] = 0.0000, -0.3618, 0.8375 + bone.head = 0.0000, -0.0980, 0.7945 + bone.tail = 0.0000, -0.3618, 0.8375 bone.roll = 0.0000 bone.use_connect = True bone.parent = arm.edit_bones[bones['spine.007']] bones['spine.008'] = bone.name bone = arm.edit_bones.new('foot.L') - bone.head[:] = 0.1114, 0.4766, 0.2473 - bone.tail[:] = 0.1088, 0.4138, 0.0411 + bone.head = 0.1114, 0.4766, 0.2473 + bone.tail = 0.1088, 0.4138, 0.0411 bone.roll = 0.0165 bone.use_connect = True bone.parent = arm.edit_bones[bones['shin.L']] bones['foot.L'] = bone.name bone = arm.edit_bones.new('foot.R') - bone.head[:] = -0.1114, 0.4766, 0.2473 - bone.tail[:] = -0.1088, 0.4138, 0.0411 + bone.head = -0.1114, 0.4766, 0.2473 + bone.tail = -0.1088, 0.4138, 0.0411 bone.roll = -0.0165 bone.use_connect = True bone.parent = arm.edit_bones[bones['shin.R']] bones['foot.R'] = bone.name bone = arm.edit_bones.new('spine.009') - bone.head[:] = 0.0000, -0.3618, 0.8375 - bone.tail[:] = 0.0000, -0.4253, 0.8585 + bone.head = 0.0000, -0.3618, 0.8375 + bone.tail = 0.0000, -0.4253, 0.8585 bone.roll = 0.0000 bone.use_connect = False bone.parent = arm.edit_bones[bones['spine.008']] bones['spine.009'] = bone.name bone = arm.edit_bones.new('shoulder.L') - bone.head[:] = 0.0596, -0.2578, 0.8876 - bone.tail[:] = 0.1249, -0.3418, 0.7153 + bone.head = 0.0596, -0.2578, 0.8876 + bone.tail = 0.1249, -0.3418, 0.7153 bone.roll = -0.3526 bone.use_connect = False bone.parent = arm.edit_bones[bones['spine.008']] bones['shoulder.L'] = bone.name bone = arm.edit_bones.new('shoulder.R') - bone.head[:] = -0.0596, -0.2578, 0.8876 - bone.tail[:] = -0.1249, -0.3418, 0.7153 + bone.head = -0.0596, -0.2578, 0.8876 + bone.tail = -0.1249, -0.3418, 0.7153 bone.roll = 0.3526 bone.use_connect = False bone.parent = arm.edit_bones[bones['spine.008']] bones['shoulder.R'] = bone.name bone = arm.edit_bones.new('breast.L') - bone.head[:] = 0.0340, -0.1694, 0.6676 - bone.tail[:] = 0.0340, -0.3139, 0.5296 + bone.head = 0.0340, -0.1694, 0.6676 + bone.tail = 0.0340, -0.3139, 0.5296 bone.roll = 0.0000 bone.use_connect = False bone.parent = arm.edit_bones[bones['spine.008']] bones['breast.L'] = bone.name bone = arm.edit_bones.new('breast.R') - bone.head[:] = -0.0340, -0.1694, 0.6676 - bone.tail[:] = -0.0340, -0.3139, 0.5296 + bone.head = -0.0340, -0.1694, 0.6676 + bone.tail = -0.0340, -0.3139, 0.5296 bone.roll = -0.0000 bone.use_connect = False bone.parent = arm.edit_bones[bones['spine.008']] bones['breast.R'] = bone.name bone = arm.edit_bones.new('toe.L') - bone.head[:] = 0.1088, 0.4138, 0.0411 - bone.tail[:] = 0.1088, 0.3213, 0.0000 + bone.head = 0.1088, 0.4138, 0.0411 + bone.tail = 0.1088, 0.3213, 0.0000 bone.roll = 3.1416 bone.use_connect = True bone.parent = arm.edit_bones[bones['foot.L']] bones['toe.L'] = bone.name bone = arm.edit_bones.new('toe.R') - bone.head[:] = -0.1088, 0.4138, 0.0411 - bone.tail[:] = -0.1088, 0.3213, 0.0000 + bone.head = -0.1088, 0.4138, 0.0411 + bone.tail = -0.1088, 0.3213, 0.0000 bone.roll = -3.1416 bone.use_connect = True bone.parent = arm.edit_bones[bones['foot.R']] bones['toe.R'] = bone.name bone = arm.edit_bones.new('spine.010') - bone.head[:] = 0.0000, -0.4253, 0.8585 - bone.tail[:] = 0.0000, -0.4888, 0.8796 + bone.head = 0.0000, -0.4253, 0.8585 + bone.tail = 0.0000, -0.4888, 0.8796 bone.roll = 0.0000 bone.use_connect = True bone.parent = arm.edit_bones[bones['spine.009']] bones['spine.010'] = bone.name bone = arm.edit_bones.new('front_thigh.L') - bone.head[:] = 0.1249, -0.3161, 0.6902 - bone.tail[:] = 0.1249, -0.2245, 0.4418 + bone.head = 0.1249, -0.3161, 0.6902 + bone.tail = 0.1249, -0.2245, 0.4418 bone.roll = -0.0000 bone.use_connect = False bone.parent = arm.edit_bones[bones['shoulder.L']] bones['front_thigh.L'] = bone.name bone = arm.edit_bones.new('front_thigh.R') - bone.head[:] = -0.1249, -0.3161, 0.6902 - bone.tail[:] = -0.1249, -0.2245, 0.4418 + bone.head = -0.1249, -0.3161, 0.6902 + bone.tail = -0.1249, -0.2245, 0.4418 bone.roll = 0.0000 bone.use_connect = False bone.parent = arm.edit_bones[bones['shoulder.R']] bones['front_thigh.R'] = bone.name bone = arm.edit_bones.new('r_palm.04.L') - bone.head[:] = 0.1140, 0.4168, 0.0282 - bone.tail[:] = 0.1337, 0.3749, 0.0253 + bone.head = 0.1140, 0.4168, 0.0282 + bone.tail = 0.1337, 0.3749, 0.0253 bone.roll = -2.8623 bone.use_connect = False bone.parent = arm.edit_bones[bones['toe.L']] bones['r_palm.04.L'] = bone.name bone = arm.edit_bones.new('r_palm.03.L') - bone.head[:] = 0.1053, 0.4151, 0.0282 - bone.tail[:] = 0.1150, 0.3664, 0.0377 + bone.head = 0.1053, 0.4151, 0.0282 + bone.tail = 0.1150, 0.3664, 0.0377 bone.roll = 1.5833 bone.use_connect = False bone.parent = arm.edit_bones[bones['toe.L']] bones['r_palm.03.L'] = bone.name bone = arm.edit_bones.new('r_palm.02.L') - bone.head[:] = 0.0964, 0.4152, 0.0282 - bone.tail[:] = 0.0894, 0.3664, 0.0377 + bone.head = 0.0964, 0.4152, 0.0282 + bone.tail = 0.0894, 0.3664, 0.0377 bone.roll = -1.2317 bone.use_connect = False bone.parent = arm.edit_bones[bones['toe.L']] bones['r_palm.02.L'] = bone.name bone = arm.edit_bones.new('r_palm.01.L') - bone.head[:] = 0.0845, 0.4178, 0.0282 - bone.tail[:] = 0.0702, 0.3781, 0.0253 + bone.head = 0.0845, 0.4178, 0.0282 + bone.tail = 0.0702, 0.3781, 0.0253 bone.roll = 2.8333 bone.use_connect = False bone.parent = arm.edit_bones[bones['toe.L']] bones['r_palm.01.L'] = bone.name bone = arm.edit_bones.new('r_palm.04.R') - bone.head[:] = -0.1140, 0.4168, 0.0282 - bone.tail[:] = -0.1337, 0.3749, 0.0253 + bone.head = -0.1140, 0.4168, 0.0282 + bone.tail = -0.1337, 0.3749, 0.0253 bone.roll = 2.8623 bone.use_connect = False bone.parent = arm.edit_bones[bones['toe.R']] bones['r_palm.04.R'] = bone.name bone = arm.edit_bones.new('r_palm.03.R') - bone.head[:] = -0.1053, 0.4151, 0.0282 - bone.tail[:] = -0.1150, 0.3664, 0.0377 + bone.head = -0.1053, 0.4151, 0.0282 + bone.tail = -0.1150, 0.3664, 0.0377 bone.roll = -1.5833 bone.use_connect = False bone.parent = arm.edit_bones[bones['toe.R']] bones['r_palm.03.R'] = bone.name bone = arm.edit_bones.new('r_palm.02.R') - bone.head[:] = -0.0964, 0.4152, 0.0282 - bone.tail[:] = -0.0894, 0.3664, 0.0377 + bone.head = -0.0964, 0.4152, 0.0282 + bone.tail = -0.0894, 0.3664, 0.0377 bone.roll = 1.2317 bone.use_connect = False bone.parent = arm.edit_bones[bones['toe.R']] bones['r_palm.02.R'] = bone.name bone = arm.edit_bones.new('r_palm.01.R') - bone.head[:] = -0.0845, 0.4178, 0.0282 - bone.tail[:] = -0.0702, 0.3781, 0.0253 + bone.head = -0.0845, 0.4178, 0.0282 + bone.tail = -0.0702, 0.3781, 0.0253 bone.roll = -2.8333 bone.use_connect = False bone.parent = arm.edit_bones[bones['toe.R']] bones['r_palm.01.R'] = bone.name bone = arm.edit_bones.new('spine.011') - bone.head[:] = 0.0000, -0.4888, 0.8796 - bone.tail[:] = 0.0000, -0.6590, 0.9809 + bone.head = 0.0000, -0.4888, 0.8796 + bone.tail = 0.0000, -0.6590, 0.9809 bone.roll = 0.0000 bone.use_connect = True bone.parent = arm.edit_bones[bones['spine.010']] bones['spine.011'] = bone.name bone = arm.edit_bones.new('front_shin.L') - bone.head[:] = 0.1249, -0.2245, 0.4418 - bone.tail[:] = 0.1114, -0.2147, 0.1698 + bone.head = 0.1249, -0.2245, 0.4418 + bone.tail = 0.1114, -0.2147, 0.1698 bone.roll = 0.0098 bone.use_connect = True bone.parent = arm.edit_bones[bones['front_thigh.L']] bones['front_shin.L'] = bone.name bone = arm.edit_bones.new('front_shin.R') - bone.head[:] = -0.1249, -0.2245, 0.4418 - bone.tail[:] = -0.1114, -0.2147, 0.1698 + bone.head = -0.1249, -0.2245, 0.4418 + bone.tail = -0.1114, -0.2147, 0.1698 bone.roll = -0.0098 bone.use_connect = True bone.parent = arm.edit_bones[bones['front_thigh.R']] bones['front_shin.R'] = bone.name bone = arm.edit_bones.new('r_pinky.01.L') - bone.head[:] = 0.1337, 0.3749, 0.0253 - bone.tail[:] = 0.1388, 0.3551, 0.0222 + bone.head = 0.1337, 0.3749, 0.0253 + bone.tail = 0.1388, 0.3551, 0.0222 bone.roll = -2.0928 bone.use_connect = False bone.parent = arm.edit_bones[bones['r_palm.04.L']] bones['r_pinky.01.L'] = bone.name bone = arm.edit_bones.new('r_ring.01.L') - bone.head[:] = 0.1150, 0.3664, 0.0377 - bone.tail[:] = 0.1166, 0.3467, 0.0317 + bone.head = 0.1150, 0.3664, 0.0377 + bone.tail = 0.1166, 0.3467, 0.0317 bone.roll = -0.5451 bone.use_connect = False bone.parent = arm.edit_bones[bones['r_palm.03.L']] bones['r_ring.01.L'] = bone.name bone = arm.edit_bones.new('r_middle.01.L') - bone.head[:] = 0.0894, 0.3664, 0.0377 - bone.tail[:] = 0.0866, 0.3467, 0.0317 + bone.head = 0.0894, 0.3664, 0.0377 + bone.tail = 0.0866, 0.3467, 0.0317 bone.roll = 0.9401 bone.use_connect = False bone.parent = arm.edit_bones[bones['r_palm.02.L']] bones['r_middle.01.L'] = bone.name bone = arm.edit_bones.new('r_index.01.L') - bone.head[:] = 0.0702, 0.3781, 0.0253 - bone.tail[:] = 0.0660, 0.3581, 0.0222 + bone.head = 0.0702, 0.3781, 0.0253 + bone.tail = 0.0660, 0.3581, 0.0222 bone.roll = 1.9945 bone.use_connect = False bone.parent = arm.edit_bones[bones['r_palm.01.L']] bones['r_index.01.L'] = bone.name bone = arm.edit_bones.new('r_pinky.01.R') - bone.head[:] = -0.1337, 0.3749, 0.0253 - bone.tail[:] = -0.1388, 0.3551, 0.0222 + bone.head = -0.1337, 0.3749, 0.0253 + bone.tail = -0.1388, 0.3551, 0.0222 bone.roll = 2.0928 bone.use_connect = False bone.parent = arm.edit_bones[bones['r_palm.04.R']] bones['r_pinky.01.R'] = bone.name bone = arm.edit_bones.new('r_ring.01.R') - bone.head[:] = -0.1150, 0.3664, 0.0377 - bone.tail[:] = -0.1166, 0.3467, 0.0317 + bone.head = -0.1150, 0.3664, 0.0377 + bone.tail = -0.1166, 0.3467, 0.0317 bone.roll = 0.5451 bone.use_connect = False bone.parent = arm.edit_bones[bones['r_palm.03.R']] bones['r_ring.01.R'] = bone.name bone = arm.edit_bones.new('r_middle.01.R') - bone.head[:] = -0.0894, 0.3664, 0.0377 - bone.tail[:] = -0.0866, 0.3467, 0.0317 + bone.head = -0.0894, 0.3664, 0.0377 + bone.tail = -0.0866, 0.3467, 0.0317 bone.roll = -0.9401 bone.use_connect = False bone.parent = arm.edit_bones[bones['r_palm.02.R']] bones['r_middle.01.R'] = bone.name bone = arm.edit_bones.new('r_index.01.R') - bone.head[:] = -0.0702, 0.3781, 0.0253 - bone.tail[:] = -0.0660, 0.3581, 0.0222 + bone.head = -0.0702, 0.3781, 0.0253 + bone.tail = -0.0660, 0.3581, 0.0222 bone.roll = -1.9945 bone.use_connect = False bone.parent = arm.edit_bones[bones['r_palm.01.R']] bones['r_index.01.R'] = bone.name bone = arm.edit_bones.new('face') - bone.head[:] = -0.0000, -0.6484, 0.8273 - bone.tail[:] = -0.0000, -0.6484, 0.8890 + bone.head = -0.0000, -0.6484, 0.8273 + bone.tail = -0.0000, -0.6484, 0.8890 bone.roll = 0.0000 bone.use_connect = False bone.parent = arm.edit_bones[bones['spine.011']] bones['face'] = bone.name bone = arm.edit_bones.new('front_foot.L') - bone.head[:] = 0.1114, -0.2147, 0.1698 - bone.tail[:] = 0.1088, -0.2462, 0.0411 + bone.head = 0.1114, -0.2147, 0.1698 + bone.tail = 0.1088, -0.2462, 0.0411 bone.roll = 0.0272 bone.use_connect = True bone.parent = arm.edit_bones[bones['front_shin.L']] bones['front_foot.L'] = bone.name bone = arm.edit_bones.new('front_foot.R') - bone.head[:] = -0.1114, -0.2147, 0.1698 - bone.tail[:] = -0.1088, -0.2462, 0.0411 + bone.head = -0.1114, -0.2147, 0.1698 + bone.tail = -0.1088, -0.2462, 0.0411 bone.roll = -0.0272 bone.use_connect = True bone.parent = arm.edit_bones[bones['front_shin.R']] bones['front_foot.R'] = bone.name bone = arm.edit_bones.new('r_pinky.02.L') - bone.head[:] = 0.1388, 0.3551, 0.0222 - bone.tail[:] = 0.1431, 0.3382, 0.0170 + bone.head = 0.1388, 0.3551, 0.0222 + bone.tail = 0.1431, 0.3382, 0.0170 bone.roll = -1.4292 bone.use_connect = True bone.parent = arm.edit_bones[bones['r_pinky.01.L']] bones['r_pinky.02.L'] = bone.name bone = arm.edit_bones.new('r_ring.02.L') - bone.head[:] = 0.1166, 0.3467, 0.0317 - bone.tail[:] = 0.1188, 0.3297, 0.0224 + bone.head = 0.1166, 0.3467, 0.0317 + bone.tail = 0.1188, 0.3297, 0.0224 bone.roll = -0.5100 bone.use_connect = True bone.parent = arm.edit_bones[bones['r_ring.01.L']] bones['r_ring.02.L'] = bone.name bone = arm.edit_bones.new('r_middle.02.L') - bone.head[:] = 0.0866, 0.3467, 0.0317 - bone.tail[:] = 0.0851, 0.3297, 0.0224 + bone.head = 0.0866, 0.3467, 0.0317 + bone.tail = 0.0851, 0.3297, 0.0224 bone.roll = 0.4076 bone.use_connect = True bone.parent = arm.edit_bones[bones['r_middle.01.L']] bones['r_middle.02.L'] = bone.name bone = arm.edit_bones.new('r_index.02.L') - bone.head[:] = 0.0660, 0.3581, 0.0222 - bone.tail[:] = 0.0623, 0.3410, 0.0170 + bone.head = 0.0660, 0.3581, 0.0222 + bone.tail = 0.0623, 0.3410, 0.0170 bone.roll = 1.3847 bone.use_connect = True bone.parent = arm.edit_bones[bones['r_index.01.L']] bones['r_index.02.L'] = bone.name bone = arm.edit_bones.new('r_pinky.02.R') - bone.head[:] = -0.1388, 0.3551, 0.0222 - bone.tail[:] = -0.1431, 0.3382, 0.0170 + bone.head = -0.1388, 0.3551, 0.0222 + bone.tail = -0.1431, 0.3382, 0.0170 bone.roll = 1.4292 bone.use_connect = True bone.parent = arm.edit_bones[bones['r_pinky.01.R']] bones['r_pinky.02.R'] = bone.name bone = arm.edit_bones.new('r_ring.02.R') - bone.head[:] = -0.1166, 0.3467, 0.0317 - bone.tail[:] = -0.1188, 0.3297, 0.0224 + bone.head = -0.1166, 0.3467, 0.0317 + bone.tail = -0.1188, 0.3297, 0.0224 bone.roll = 0.5100 bone.use_connect = True bone.parent = arm.edit_bones[bones['r_ring.01.R']] bones['r_ring.02.R'] = bone.name bone = arm.edit_bones.new('r_middle.02.R') - bone.head[:] = -0.0866, 0.3467, 0.0317 - bone.tail[:] = -0.0851, 0.3297, 0.0224 + bone.head = -0.0866, 0.3467, 0.0317 + bone.tail = -0.0851, 0.3297, 0.0224 bone.roll = -0.4076 bone.use_connect = True bone.parent = arm.edit_bones[bones['r_middle.01.R']] bones['r_middle.02.R'] = bone.name bone = arm.edit_bones.new('r_index.02.R') - bone.head[:] = -0.0660, 0.3581, 0.0222 - bone.tail[:] = -0.0623, 0.3410, 0.0170 + bone.head = -0.0660, 0.3581, 0.0222 + bone.tail = -0.0623, 0.3410, 0.0170 bone.roll = -1.3847 bone.use_connect = True bone.parent = arm.edit_bones[bones['r_index.01.R']] bones['r_index.02.R'] = bone.name bone = arm.edit_bones.new('nose') - bone.head[:] = 0.0000, -0.7082, 0.9031 - bone.tail[:] = 0.0000, -0.7989, 0.8595 + bone.head = 0.0000, -0.7082, 0.9031 + bone.tail = 0.0000, -0.7989, 0.8595 bone.roll = 0.0000 bone.use_connect = False bone.parent = arm.edit_bones[bones['face']] bones['nose'] = bone.name bone = arm.edit_bones.new('lip.T.L') - bone.head[:] = 0.0000, -0.8212, 0.7930 - bone.tail[:] = 0.0353, -0.7614, 0.7866 + bone.head = 0.0000, -0.8212, 0.7930 + bone.tail = 0.0353, -0.7614, 0.7866 bone.roll = 0.0551 bone.use_connect = False bone.parent = arm.edit_bones[bones['face']] bones['lip.T.L'] = bone.name bone = arm.edit_bones.new('lip.B.L') - bone.head[:] = 0.0000, -0.7962, 0.7788 - bone.tail[:] = 0.0258, -0.7624, 0.7742 + bone.head = 0.0000, -0.7962, 0.7788 + bone.tail = 0.0258, -0.7624, 0.7742 bone.roll = 0.0255 bone.use_connect = False bone.parent = arm.edit_bones[bones['face']] bones['lip.B.L'] = bone.name bone = arm.edit_bones.new('jaw') - bone.head[:] = 0.0000, -0.6191, 0.7820 - bone.tail[:] = 0.0000, -0.6960, 0.7733 + bone.head = 0.0000, -0.6191, 0.7820 + bone.tail = 0.0000, -0.6960, 0.7733 bone.roll = 0.0000 bone.use_connect = False bone.parent = arm.edit_bones[bones['face']] bones['jaw'] = bone.name bone = arm.edit_bones.new('ear.L') - bone.head[:] = 0.0949, -0.5457, 0.9545 - bone.tail[:] = 0.0524, -0.5459, 0.9899 + bone.head = 0.0949, -0.5457, 0.9545 + bone.tail = 0.0524, -0.5459, 0.9899 bone.roll = -1.1774 bone.use_connect = False bone.parent = arm.edit_bones[bones['face']] bones['ear.L'] = bone.name bone = arm.edit_bones.new('ear.R') - bone.head[:] = -0.0949, -0.5457, 0.9545 - bone.tail[:] = -0.0524, -0.5459, 0.9899 + bone.head = -0.0949, -0.5457, 0.9545 + bone.tail = -0.0524, -0.5459, 0.9899 bone.roll = 1.1774 bone.use_connect = False bone.parent = arm.edit_bones[bones['face']] bones['ear.R'] = bone.name bone = arm.edit_bones.new('lip.T.R') - bone.head[:] = 0.0000, -0.8212, 0.7930 - bone.tail[:] = -0.0353, -0.7614, 0.7866 + bone.head = 0.0000, -0.8212, 0.7930 + bone.tail = -0.0353, -0.7614, 0.7866 bone.roll = -0.0551 bone.use_connect = False bone.parent = arm.edit_bones[bones['face']] bones['lip.T.R'] = bone.name bone = arm.edit_bones.new('lip.B.R') - bone.head[:] = 0.0000, -0.7962, 0.7788 - bone.tail[:] = -0.0258, -0.7624, 0.7742 + bone.head = 0.0000, -0.7962, 0.7788 + bone.tail = -0.0258, -0.7624, 0.7742 bone.roll = -0.0255 bone.use_connect = False bone.parent = arm.edit_bones[bones['face']] bones['lip.B.R'] = bone.name bone = arm.edit_bones.new('brow.B.L') - bone.head[:] = 0.0745, -0.6532, 0.9192 - bone.tail[:] = 0.0659, -0.6703, 0.9324 + bone.head = 0.0745, -0.6532, 0.9192 + bone.tail = 0.0659, -0.6703, 0.9324 bone.roll = 0.7673 bone.use_connect = False bone.parent = arm.edit_bones[bones['face']] bones['brow.B.L'] = bone.name bone = arm.edit_bones.new('lid.T.L') - bone.head[:] = 0.0621, -0.6644, 0.9197 - bone.tail[:] = 0.0588, -0.6755, 0.9223 + bone.head = 0.0621, -0.6644, 0.9197 + bone.tail = 0.0588, -0.6755, 0.9223 bone.roll = 0.0733 bone.use_connect = False bone.parent = arm.edit_bones[bones['face']] bones['lid.T.L'] = bone.name bone = arm.edit_bones.new('brow.B.R') - bone.head[:] = -0.0745, -0.6532, 0.9192 - bone.tail[:] = -0.0659, -0.6703, 0.9324 + bone.head = -0.0745, -0.6532, 0.9192 + bone.tail = -0.0659, -0.6703, 0.9324 bone.roll = -0.7673 bone.use_connect = False bone.parent = arm.edit_bones[bones['face']] bones['brow.B.R'] = bone.name bone = arm.edit_bones.new('lid.T.R') - bone.head[:] = -0.0621, -0.6644, 0.9197 - bone.tail[:] = -0.0588, -0.6755, 0.9223 + bone.head = -0.0621, -0.6644, 0.9197 + bone.tail = -0.0588, -0.6755, 0.9223 bone.roll = -0.0733 bone.use_connect = False bone.parent = arm.edit_bones[bones['face']] bones['lid.T.R'] = bone.name bone = arm.edit_bones.new('forehead.L') - bone.head[:] = 0.0208, -0.6604, 0.9808 - bone.tail[:] = 0.0160, -0.7017, 0.9527 + bone.head = 0.0208, -0.6604, 0.9808 + bone.tail = 0.0160, -0.7017, 0.9527 bone.roll = 1.9432 bone.use_connect = False bone.parent = arm.edit_bones[bones['face']] bones['forehead.L'] = bone.name bone = arm.edit_bones.new('forehead.R') - bone.head[:] = -0.0208, -0.6604, 0.9808 - bone.tail[:] = -0.0160, -0.7017, 0.9527 + bone.head = -0.0208, -0.6604, 0.9808 + bone.tail = -0.0160, -0.7017, 0.9527 bone.roll = -1.9432 bone.use_connect = False bone.parent = arm.edit_bones[bones['face']] bones['forehead.R'] = bone.name bone = arm.edit_bones.new('eye.L') - bone.head[:] = 0.0388, -0.6496, 0.9149 - bone.tail[:] = 0.0388, -0.7010, 0.9149 + bone.head = 0.0388, -0.6496, 0.9149 + bone.tail = 0.0388, -0.7010, 0.9149 bone.roll = 0.0000 bone.use_connect = False bone.parent = arm.edit_bones[bones['face']] bones['eye.L'] = bone.name bone = arm.edit_bones.new('eye.R') - bone.head[:] = -0.0388, -0.6496, 0.9149 - bone.tail[:] = -0.0388, -0.7010, 0.9149 + bone.head = -0.0388, -0.6496, 0.9149 + bone.tail = -0.0388, -0.7010, 0.9149 bone.roll = 0.0000 bone.use_connect = False bone.parent = arm.edit_bones[bones['face']] bones['eye.R'] = bone.name bone = arm.edit_bones.new('cheek.T.L') - bone.head[:] = 0.0906, -0.6428, 0.9032 - bone.tail[:] = 0.0660, -0.6881, 0.8704 + bone.head = 0.0906, -0.6428, 0.9032 + bone.tail = 0.0660, -0.6881, 0.8704 bone.roll = -0.0634 bone.use_connect = False bone.parent = arm.edit_bones[bones['face']] bones['cheek.T.L'] = bone.name bone = arm.edit_bones.new('cheek.T.R') - bone.head[:] = -0.0906, -0.6428, 0.9032 - bone.tail[:] = -0.0660, -0.6881, 0.8704 + bone.head = -0.0906, -0.6428, 0.9032 + bone.tail = -0.0660, -0.6881, 0.8704 bone.roll = 0.0634 bone.use_connect = False bone.parent = arm.edit_bones[bones['face']] bones['cheek.T.R'] = bone.name bone = arm.edit_bones.new('teeth.T') - bone.head[:] = 0.0004, -0.7594, 0.8194 - bone.tail[:] = 0.0004, -0.7302, 0.8292 + bone.head = 0.0004, -0.7594, 0.8194 + bone.tail = 0.0004, -0.7302, 0.8292 bone.roll = 0.0000 bone.use_connect = False bone.parent = arm.edit_bones[bones['face']] bones['teeth.T'] = bone.name bone = arm.edit_bones.new('teeth.B') - bone.head[:] = 0.0004, -0.7504, 0.7968 - bone.tail[:] = 0.0004, -0.7204, 0.8041 + bone.head = 0.0004, -0.7504, 0.7968 + bone.tail = 0.0004, -0.7204, 0.8041 bone.roll = 0.0000 bone.use_connect = False bone.parent = arm.edit_bones[bones['face']] bones['teeth.B'] = bone.name bone = arm.edit_bones.new('tongue') - bone.head[:] = 0.0004, -0.7646, 0.7930 - bone.tail[:] = 0.0004, -0.7476, 0.7967 + bone.head = 0.0004, -0.7646, 0.7930 + bone.tail = 0.0004, -0.7476, 0.7967 bone.roll = 0.0000 bone.use_connect = False bone.parent = arm.edit_bones[bones['face']] bones['tongue'] = bone.name bone = arm.edit_bones.new('front_toe.L') - bone.head[:] = 0.1088, -0.2462, 0.0411 - bone.tail[:] = 0.1088, -0.3259, 0.0000 + bone.head = 0.1088, -0.2462, 0.0411 + bone.tail = 0.1088, -0.3259, 0.0000 bone.roll = 3.1416 bone.use_connect = True bone.parent = arm.edit_bones[bones['front_foot.L']] bones['front_toe.L'] = bone.name bone = arm.edit_bones.new('front_toe.R') - bone.head[:] = -0.1088, -0.2462, 0.0411 - bone.tail[:] = -0.1088, -0.3259, 0.0000 + bone.head = -0.1088, -0.2462, 0.0411 + bone.tail = -0.1088, -0.3259, 0.0000 bone.roll = -3.1416 bone.use_connect = True bone.parent = arm.edit_bones[bones['front_foot.R']] bones['front_toe.R'] = bone.name bone = arm.edit_bones.new('r_pinky.03.L') - bone.head[:] = 0.1431, 0.3382, 0.0170 - bone.tail[:] = 0.1455, 0.3175, 0.0129 + bone.head = 0.1431, 0.3382, 0.0170 + bone.tail = 0.1455, 0.3175, 0.0129 bone.roll = -1.0952 bone.use_connect = True bone.parent = arm.edit_bones[bones['r_pinky.02.L']] bones['r_pinky.03.L'] = bone.name bone = arm.edit_bones.new('r_ring.03.L') - bone.head[:] = 0.1188, 0.3297, 0.0224 - bone.tail[:] = 0.1239, 0.2905, 0.0129 + bone.head = 0.1188, 0.3297, 0.0224 + bone.tail = 0.1239, 0.2905, 0.0129 bone.roll = -0.9905 bone.use_connect = True bone.parent = arm.edit_bones[bones['r_ring.02.L']] bones['r_ring.03.L'] = bone.name bone = arm.edit_bones.new('r_middle.03.L') - bone.head[:] = 0.0851, 0.3297, 0.0224 - bone.tail[:] = 0.0813, 0.2904, 0.0129 + bone.head = 0.0851, 0.3297, 0.0224 + bone.tail = 0.0813, 0.2904, 0.0129 bone.roll = 0.8084 bone.use_connect = True bone.parent = arm.edit_bones[bones['r_middle.02.L']] bones['r_middle.03.L'] = bone.name bone = arm.edit_bones.new('r_index.03.L') - bone.head[:] = 0.0623, 0.3410, 0.0170 - bone.tail[:] = 0.0552, 0.3214, 0.0129 + bone.head = 0.0623, 0.3410, 0.0170 + bone.tail = 0.0552, 0.3214, 0.0129 bone.roll = 2.2048 bone.use_connect = True bone.parent = arm.edit_bones[bones['r_index.02.L']] bones['r_index.03.L'] = bone.name bone = arm.edit_bones.new('r_pinky.03.R') - bone.head[:] = -0.1431, 0.3382, 0.0170 - bone.tail[:] = -0.1455, 0.3175, 0.0129 + bone.head = -0.1431, 0.3382, 0.0170 + bone.tail = -0.1455, 0.3175, 0.0129 bone.roll = 1.0952 bone.use_connect = True bone.parent = arm.edit_bones[bones['r_pinky.02.R']] bones['r_pinky.03.R'] = bone.name bone = arm.edit_bones.new('r_ring.03.R') - bone.head[:] = -0.1188, 0.3297, 0.0224 - bone.tail[:] = -0.1239, 0.2905, 0.0129 + bone.head = -0.1188, 0.3297, 0.0224 + bone.tail = -0.1239, 0.2905, 0.0129 bone.roll = 0.9905 bone.use_connect = True bone.parent = arm.edit_bones[bones['r_ring.02.R']] bones['r_ring.03.R'] = bone.name bone = arm.edit_bones.new('r_middle.03.R') - bone.head[:] = -0.0851, 0.3297, 0.0224 - bone.tail[:] = -0.0813, 0.2904, 0.0129 + bone.head = -0.0851, 0.3297, 0.0224 + bone.tail = -0.0813, 0.2904, 0.0129 bone.roll = -0.8084 bone.use_connect = True bone.parent = arm.edit_bones[bones['r_middle.02.R']] bones['r_middle.03.R'] = bone.name bone = arm.edit_bones.new('r_index.03.R') - bone.head[:] = -0.0623, 0.3410, 0.0170 - bone.tail[:] = -0.0552, 0.3214, 0.0129 + bone.head = -0.0623, 0.3410, 0.0170 + bone.tail = -0.0552, 0.3214, 0.0129 bone.roll = -2.2048 bone.use_connect = True bone.parent = arm.edit_bones[bones['r_index.02.R']] bones['r_index.03.R'] = bone.name bone = arm.edit_bones.new('nose.001') - bone.head[:] = 0.0000, -0.7989, 0.8595 - bone.tail[:] = 0.0000, -0.8391, 0.8371 + bone.head = 0.0000, -0.7989, 0.8595 + bone.tail = 0.0000, -0.8391, 0.8371 bone.roll = 0.0000 bone.use_connect = True bone.parent = arm.edit_bones[bones['nose']] bones['nose.001'] = bone.name bone = arm.edit_bones.new('lip.T.L.001') - bone.head[:] = 0.0353, -0.7614, 0.7866 - bone.tail[:] = 0.0482, -0.6927, 0.7995 + bone.head = 0.0353, -0.7614, 0.7866 + bone.tail = 0.0482, -0.6927, 0.7995 bone.roll = 0.1558 bone.use_connect = True bone.parent = arm.edit_bones[bones['lip.T.L']] bones['lip.T.L.001'] = bone.name bone = arm.edit_bones.new('lip.B.L.001') - bone.head[:] = 0.0258, -0.7624, 0.7742 - bone.tail[:] = 0.0482, -0.6927, 0.7995 + bone.head = 0.0258, -0.7624, 0.7742 + bone.tail = 0.0482, -0.6927, 0.7995 bone.roll = 0.4650 bone.use_connect = True bone.parent = arm.edit_bones[bones['lip.B.L']] bones['lip.B.L.001'] = bone.name bone = arm.edit_bones.new('chin') - bone.head[:] = 0.0000, -0.6960, 0.7733 - bone.tail[:] = 0.0000, -0.7687, 0.7625 + bone.head = 0.0000, -0.6960, 0.7733 + bone.tail = 0.0000, -0.7687, 0.7625 bone.roll = 0.0000 bone.use_connect = True bone.parent = arm.edit_bones[bones['jaw']] bones['chin'] = bone.name bone = arm.edit_bones.new('ear.L.001') - bone.head[:] = 0.0524, -0.5459, 0.9899 - bone.tail[:] = 0.0727, -0.5682, 1.0212 + bone.head = 0.0524, -0.5459, 0.9899 + bone.tail = 0.0727, -0.5682, 1.0212 bone.roll = 0.2280 bone.use_connect = True bone.parent = arm.edit_bones[bones['ear.L']] bones['ear.L.001'] = bone.name bone = arm.edit_bones.new('ear.R.001') - bone.head[:] = -0.0524, -0.5459, 0.9899 - bone.tail[:] = -0.0727, -0.5682, 1.0212 + bone.head = -0.0524, -0.5459, 0.9899 + bone.tail = -0.0727, -0.5682, 1.0212 bone.roll = -0.2280 bone.use_connect = True bone.parent = arm.edit_bones[bones['ear.R']] bones['ear.R.001'] = bone.name bone = arm.edit_bones.new('lip.T.R.001') - bone.head[:] = -0.0353, -0.7614, 0.7866 - bone.tail[:] = -0.0482, -0.6927, 0.7995 + bone.head = -0.0353, -0.7614, 0.7866 + bone.tail = -0.0482, -0.6927, 0.7995 bone.roll = -0.1558 bone.use_connect = True bone.parent = arm.edit_bones[bones['lip.T.R']] bones['lip.T.R.001'] = bone.name bone = arm.edit_bones.new('lip.B.R.001') - bone.head[:] = -0.0258, -0.7624, 0.7742 - bone.tail[:] = -0.0482, -0.6927, 0.7995 + bone.head = -0.0258, -0.7624, 0.7742 + bone.tail = -0.0482, -0.6927, 0.7995 bone.roll = -0.4650 bone.use_connect = True bone.parent = arm.edit_bones[bones['lip.B.R']] bones['lip.B.R.001'] = bone.name bone = arm.edit_bones.new('brow.B.L.001') - bone.head[:] = 0.0659, -0.6703, 0.9324 - bone.tail[:] = 0.0507, -0.6764, 0.9344 + bone.head = 0.0659, -0.6703, 0.9324 + bone.tail = 0.0507, -0.6764, 0.9344 bone.roll = 0.0953 bone.use_connect = True bone.parent = arm.edit_bones[bones['brow.B.L']] bones['brow.B.L.001'] = bone.name bone = arm.edit_bones.new('lid.T.L.001') - bone.head[:] = 0.0588, -0.6755, 0.9223 - bone.tail[:] = 0.0503, -0.6779, 0.9257 + bone.head = 0.0588, -0.6755, 0.9223 + bone.tail = 0.0503, -0.6779, 0.9257 bone.roll = 0.4801 bone.use_connect = True bone.parent = arm.edit_bones[bones['lid.T.L']] bones['lid.T.L.001'] = bone.name bone = arm.edit_bones.new('brow.B.R.001') - bone.head[:] = -0.0659, -0.6703, 0.9324 - bone.tail[:] = -0.0507, -0.6764, 0.9344 + bone.head = -0.0659, -0.6703, 0.9324 + bone.tail = -0.0507, -0.6764, 0.9344 bone.roll = -0.0953 bone.use_connect = True bone.parent = arm.edit_bones[bones['brow.B.R']] bones['brow.B.R.001'] = bone.name bone = arm.edit_bones.new('lid.T.R.001') - bone.head[:] = -0.0588, -0.6755, 0.9223 - bone.tail[:] = -0.0503, -0.6779, 0.9257 + bone.head = -0.0588, -0.6755, 0.9223 + bone.tail = -0.0503, -0.6779, 0.9257 bone.roll = -0.4801 bone.use_connect = True bone.parent = arm.edit_bones[bones['lid.T.R']] bones['lid.T.R.001'] = bone.name bone = arm.edit_bones.new('forehead.L.001') - bone.head[:] = 0.0418, -0.6520, 0.9749 - bone.tail[:] = 0.0510, -0.6773, 0.9561 + bone.head = 0.0418, -0.6520, 0.9749 + bone.tail = 0.0510, -0.6773, 0.9561 bone.roll = 0.5278 bone.use_connect = False bone.parent = arm.edit_bones[bones['forehead.L']] bones['forehead.L.001'] = bone.name bone = arm.edit_bones.new('forehead.R.001') - bone.head[:] = -0.0418, -0.6520, 0.9749 - bone.tail[:] = -0.0510, -0.6773, 0.9561 + bone.head = -0.0418, -0.6520, 0.9749 + bone.tail = -0.0510, -0.6773, 0.9561 bone.roll = -0.5278 bone.use_connect = False bone.parent = arm.edit_bones[bones['forehead.R']] bones['forehead.R.001'] = bone.name bone = arm.edit_bones.new('cheek.T.L.001') - bone.head[:] = 0.0660, -0.6881, 0.8704 - bone.tail[:] = 0.0389, -0.7093, 0.8768 + bone.head = 0.0660, -0.6881, 0.8704 + bone.tail = 0.0389, -0.7093, 0.8768 bone.roll = -0.5772 bone.use_connect = True bone.parent = arm.edit_bones[bones['cheek.T.L']] bones['cheek.T.L.001'] = bone.name bone = arm.edit_bones.new('cheek.T.R.001') - bone.head[:] = -0.0660, -0.6881, 0.8704 - bone.tail[:] = -0.0389, -0.7093, 0.8768 + bone.head = -0.0660, -0.6881, 0.8704 + bone.tail = -0.0389, -0.7093, 0.8768 bone.roll = 0.5772 bone.use_connect = True bone.parent = arm.edit_bones[bones['cheek.T.R']] bones['cheek.T.R.001'] = bone.name bone = arm.edit_bones.new('tongue.001') - bone.head[:] = 0.0004, -0.7476, 0.7967 - bone.tail[:] = 0.0004, -0.7246, 0.8052 + bone.head = 0.0004, -0.7476, 0.7967 + bone.tail = 0.0004, -0.7246, 0.8052 bone.roll = 0.0000 bone.use_connect = True bone.parent = arm.edit_bones[bones['tongue']] bones['tongue.001'] = bone.name bone = arm.edit_bones.new('f_palm.04.L') - bone.head[:] = 0.1229, -0.2329, 0.0282 - bone.tail[:] = 0.1426, -0.2749, 0.0253 + bone.head = 0.1229, -0.2329, 0.0282 + bone.tail = 0.1426, -0.2749, 0.0253 bone.roll = -2.8623 bone.use_connect = False bone.parent = arm.edit_bones[bones['front_toe.L']] bones['f_palm.04.L'] = bone.name bone = arm.edit_bones.new('f_palm.03.L') - bone.head[:] = 0.1142, -0.2346, 0.0282 - bone.tail[:] = 0.1239, -0.2833, 0.0377 + bone.head = 0.1142, -0.2346, 0.0282 + bone.tail = 0.1239, -0.2833, 0.0377 bone.roll = 1.5833 bone.use_connect = False bone.parent = arm.edit_bones[bones['front_toe.L']] bones['f_palm.03.L'] = bone.name bone = arm.edit_bones.new('f_palm.02.L') - bone.head[:] = 0.1053, -0.2345, 0.0282 - bone.tail[:] = 0.0983, -0.2834, 0.0377 + bone.head = 0.1053, -0.2345, 0.0282 + bone.tail = 0.0983, -0.2834, 0.0377 bone.roll = -1.2317 bone.use_connect = False bone.parent = arm.edit_bones[bones['front_toe.L']] bones['f_palm.02.L'] = bone.name bone = arm.edit_bones.new('f_palm.01.L') - bone.head[:] = 0.0934, -0.2319, 0.0282 - bone.tail[:] = 0.0791, -0.2716, 0.0253 + bone.head = 0.0934, -0.2319, 0.0282 + bone.tail = 0.0791, -0.2716, 0.0253 bone.roll = 2.8333 bone.use_connect = False bone.parent = arm.edit_bones[bones['front_toe.L']] bones['f_palm.01.L'] = bone.name bone = arm.edit_bones.new('f_palm.04.R') - bone.head[:] = -0.1229, -0.2329, 0.0282 - bone.tail[:] = -0.1426, -0.2749, 0.0253 + bone.head = -0.1229, -0.2329, 0.0282 + bone.tail = -0.1426, -0.2749, 0.0253 bone.roll = 2.8623 bone.use_connect = False bone.parent = arm.edit_bones[bones['front_toe.R']] bones['f_palm.04.R'] = bone.name bone = arm.edit_bones.new('f_palm.03.R') - bone.head[:] = -0.1142, -0.2346, 0.0282 - bone.tail[:] = -0.1239, -0.2833, 0.0377 + bone.head = -0.1142, -0.2346, 0.0282 + bone.tail = -0.1239, -0.2833, 0.0377 bone.roll = -1.5833 bone.use_connect = False bone.parent = arm.edit_bones[bones['front_toe.R']] bones['f_palm.03.R'] = bone.name bone = arm.edit_bones.new('f_palm.02.R') - bone.head[:] = -0.1053, -0.2345, 0.0282 - bone.tail[:] = -0.0983, -0.2834, 0.0377 + bone.head = -0.1053, -0.2345, 0.0282 + bone.tail = -0.0983, -0.2834, 0.0377 bone.roll = 1.2317 bone.use_connect = False bone.parent = arm.edit_bones[bones['front_toe.R']] bones['f_palm.02.R'] = bone.name bone = arm.edit_bones.new('f_palm.01.R') - bone.head[:] = -0.0934, -0.2319, 0.0282 - bone.tail[:] = -0.0791, -0.2716, 0.0253 + bone.head = -0.0934, -0.2319, 0.0282 + bone.tail = -0.0791, -0.2716, 0.0253 bone.roll = -2.8333 bone.use_connect = False bone.parent = arm.edit_bones[bones['front_toe.R']] bones['f_palm.01.R'] = bone.name bone = arm.edit_bones.new('nose.002') - bone.head[:] = 0.0000, -0.8391, 0.8371 - bone.tail[:] = 0.0000, -0.8452, 0.8281 + bone.head = 0.0000, -0.8391, 0.8371 + bone.tail = 0.0000, -0.8452, 0.8281 bone.roll = -0.0162 bone.use_connect = True bone.parent = arm.edit_bones[bones['nose.001']] bones['nose.002'] = bone.name bone = arm.edit_bones.new('chin.001') - bone.head[:] = 0.0000, -0.7687, 0.7625 - bone.tail[:] = 0.0000, -0.7926, 0.7756 + bone.head = 0.0000, -0.7687, 0.7625 + bone.tail = 0.0000, -0.7926, 0.7756 bone.roll = 0.0000 bone.use_connect = True bone.parent = arm.edit_bones[bones['chin']] bones['chin.001'] = bone.name bone = arm.edit_bones.new('ear.L.002') - bone.head[:] = 0.0727, -0.5682, 1.0212 - bone.tail[:] = 0.1158, -0.5606, 1.0358 + bone.head = 0.0727, -0.5682, 1.0212 + bone.tail = 0.1158, -0.5606, 1.0358 bone.roll = -1.9007 bone.use_connect = True bone.parent = arm.edit_bones[bones['ear.L.001']] bones['ear.L.002'] = bone.name bone = arm.edit_bones.new('ear.R.002') - bone.head[:] = -0.0727, -0.5682, 1.0212 - bone.tail[:] = -0.1158, -0.5606, 1.0358 + bone.head = -0.0727, -0.5682, 1.0212 + bone.tail = -0.1158, -0.5606, 1.0358 bone.roll = 1.9007 bone.use_connect = True bone.parent = arm.edit_bones[bones['ear.R.001']] bones['ear.R.002'] = bone.name bone = arm.edit_bones.new('brow.B.L.002') - bone.head[:] = 0.0507, -0.6764, 0.9344 - bone.tail[:] = 0.0362, -0.6871, 0.9343 + bone.head = 0.0507, -0.6764, 0.9344 + bone.tail = 0.0362, -0.6871, 0.9343 bone.roll = 0.2604 bone.use_connect = True bone.parent = arm.edit_bones[bones['brow.B.L.001']] bones['brow.B.L.002'] = bone.name bone = arm.edit_bones.new('lid.T.L.002') - bone.head[:] = 0.0503, -0.6779, 0.9257 - bone.tail[:] = 0.0361, -0.6798, 0.9241 + bone.head = 0.0503, -0.6779, 0.9257 + bone.tail = 0.0361, -0.6798, 0.9241 bone.roll = 0.0945 bone.use_connect = True bone.parent = arm.edit_bones[bones['lid.T.L.001']] bones['lid.T.L.002'] = bone.name bone = arm.edit_bones.new('brow.B.R.002') - bone.head[:] = -0.0507, -0.6764, 0.9344 - bone.tail[:] = -0.0362, -0.6871, 0.9343 + bone.head = -0.0507, -0.6764, 0.9344 + bone.tail = -0.0362, -0.6871, 0.9343 bone.roll = -0.2604 bone.use_connect = True bone.parent = arm.edit_bones[bones['brow.B.R.001']] bones['brow.B.R.002'] = bone.name bone = arm.edit_bones.new('lid.T.R.002') - bone.head[:] = -0.0503, -0.6779, 0.9257 - bone.tail[:] = -0.0361, -0.6798, 0.9241 + bone.head = -0.0503, -0.6779, 0.9257 + bone.tail = -0.0361, -0.6798, 0.9241 bone.roll = -0.0945 bone.use_connect = True bone.parent = arm.edit_bones[bones['lid.T.R.001']] bones['lid.T.R.002'] = bone.name bone = arm.edit_bones.new('forehead.L.002') - bone.head[:] = 0.0581, -0.6362, 0.9723 - bone.tail[:] = 0.0774, -0.6567, 0.9438 + bone.head = 0.0581, -0.6362, 0.9723 + bone.tail = 0.0774, -0.6567, 0.9438 bone.roll = -0.3374 bone.use_connect = False bone.parent = arm.edit_bones[bones['forehead.L.001']] bones['forehead.L.002'] = bone.name bone = arm.edit_bones.new('forehead.R.002') - bone.head[:] = -0.0581, -0.6362, 0.9723 - bone.tail[:] = -0.0774, -0.6567, 0.9438 + bone.head = -0.0581, -0.6362, 0.9723 + bone.tail = -0.0774, -0.6567, 0.9438 bone.roll = 0.3374 bone.use_connect = False bone.parent = arm.edit_bones[bones['forehead.R.001']] bones['forehead.R.002'] = bone.name bone = arm.edit_bones.new('nose.L') - bone.head[:] = 0.0389, -0.7093, 0.8768 - bone.tail[:] = 0.0360, -0.7993, 0.8371 + bone.head = 0.0389, -0.7093, 0.8768 + bone.tail = 0.0360, -0.7993, 0.8371 bone.roll = -2.8274 bone.use_connect = True bone.parent = arm.edit_bones[bones['cheek.T.L.001']] bones['nose.L'] = bone.name bone = arm.edit_bones.new('nose.R') - bone.head[:] = -0.0389, -0.7093, 0.8768 - bone.tail[:] = -0.0360, -0.7993, 0.8371 + bone.head = -0.0389, -0.7093, 0.8768 + bone.tail = -0.0360, -0.7993, 0.8371 bone.roll = 2.8274 bone.use_connect = True bone.parent = arm.edit_bones[bones['cheek.T.R.001']] bones['nose.R'] = bone.name bone = arm.edit_bones.new('tongue.002') - bone.head[:] = 0.0004, -0.7246, 0.8052 - bone.tail[:] = 0.0004, -0.6900, 0.8003 + bone.head = 0.0004, -0.7246, 0.8052 + bone.tail = 0.0004, -0.6900, 0.8003 bone.roll = 0.0000 bone.use_connect = True bone.parent = arm.edit_bones[bones['tongue.001']] bones['tongue.002'] = bone.name bone = arm.edit_bones.new('f_pinky.01.L') - bone.head[:] = 0.1426, -0.2749, 0.0253 - bone.tail[:] = 0.1477, -0.2946, 0.0222 + bone.head = 0.1426, -0.2749, 0.0253 + bone.tail = 0.1477, -0.2946, 0.0222 bone.roll = -2.0928 bone.use_connect = False bone.parent = arm.edit_bones[bones['f_palm.04.L']] bones['f_pinky.01.L'] = bone.name bone = arm.edit_bones.new('f_ring.01.L') - bone.head[:] = 0.1239, -0.2833, 0.0377 - bone.tail[:] = 0.1255, -0.3031, 0.0317 + bone.head = 0.1239, -0.2833, 0.0377 + bone.tail = 0.1255, -0.3031, 0.0317 bone.roll = -0.5451 bone.use_connect = False bone.parent = arm.edit_bones[bones['f_palm.03.L']] bones['f_ring.01.L'] = bone.name bone = arm.edit_bones.new('f_middle.01.L') - bone.head[:] = 0.0983, -0.2834, 0.0377 - bone.tail[:] = 0.0955, -0.3030, 0.0317 + bone.head = 0.0983, -0.2834, 0.0377 + bone.tail = 0.0955, -0.3030, 0.0317 bone.roll = 0.9401 bone.use_connect = False bone.parent = arm.edit_bones[bones['f_palm.02.L']] bones['f_middle.01.L'] = bone.name bone = arm.edit_bones.new('f_index.01.L') - bone.head[:] = 0.0791, -0.2716, 0.0253 - bone.tail[:] = 0.0749, -0.2916, 0.0222 + bone.head = 0.0791, -0.2716, 0.0253 + bone.tail = 0.0749, -0.2916, 0.0222 bone.roll = 1.9945 bone.use_connect = False bone.parent = arm.edit_bones[bones['f_palm.01.L']] bones['f_index.01.L'] = bone.name bone = arm.edit_bones.new('f_pinky.01.R') - bone.head[:] = -0.1426, -0.2749, 0.0253 - bone.tail[:] = -0.1477, -0.2946, 0.0222 + bone.head = -0.1426, -0.2749, 0.0253 + bone.tail = -0.1477, -0.2946, 0.0222 bone.roll = 2.0928 bone.use_connect = False bone.parent = arm.edit_bones[bones['f_palm.04.R']] bones['f_pinky.01.R'] = bone.name bone = arm.edit_bones.new('f_ring.01.R') - bone.head[:] = -0.1239, -0.2833, 0.0377 - bone.tail[:] = -0.1255, -0.3031, 0.0317 + bone.head = -0.1239, -0.2833, 0.0377 + bone.tail = -0.1255, -0.3031, 0.0317 bone.roll = 0.5451 bone.use_connect = False bone.parent = arm.edit_bones[bones['f_palm.03.R']] bones['f_ring.01.R'] = bone.name bone = arm.edit_bones.new('f_middle.01.R') - bone.head[:] = -0.0983, -0.2834, 0.0377 - bone.tail[:] = -0.0955, -0.3030, 0.0317 + bone.head = -0.0983, -0.2834, 0.0377 + bone.tail = -0.0955, -0.3030, 0.0317 bone.roll = -0.9401 bone.use_connect = False bone.parent = arm.edit_bones[bones['f_palm.02.R']] bones['f_middle.01.R'] = bone.name bone = arm.edit_bones.new('f_index.01.R') - bone.head[:] = -0.0791, -0.2716, 0.0253 - bone.tail[:] = -0.0749, -0.2916, 0.0222 + bone.head = -0.0791, -0.2716, 0.0253 + bone.tail = -0.0749, -0.2916, 0.0222 bone.roll = -1.9945 bone.use_connect = False bone.parent = arm.edit_bones[bones['f_palm.01.R']] bones['f_index.01.R'] = bone.name bone = arm.edit_bones.new('nose.003') - bone.head[:] = 0.0000, -0.8452, 0.8281 - bone.tail[:] = 0.0000, -0.8349, 0.8089 + bone.head = 0.0000, -0.8452, 0.8281 + bone.tail = 0.0000, -0.8349, 0.8089 bone.roll = -0.0248 bone.use_connect = True bone.parent = arm.edit_bones[bones['nose.002']] bones['nose.003'] = bone.name bone = arm.edit_bones.new('ear.L.003') - bone.head[:] = 0.1158, -0.5606, 1.0358 - bone.tail[:] = 0.1130, -0.5379, 0.9935 + bone.head = 0.1158, -0.5606, 1.0358 + bone.tail = 0.1130, -0.5379, 0.9935 bone.roll = 2.4141 bone.use_connect = True bone.parent = arm.edit_bones[bones['ear.L.002']] bones['ear.L.003'] = bone.name bone = arm.edit_bones.new('ear.R.003') - bone.head[:] = -0.1158, -0.5606, 1.0358 - bone.tail[:] = -0.1130, -0.5379, 0.9935 + bone.head = -0.1158, -0.5606, 1.0358 + bone.tail = -0.1130, -0.5379, 0.9935 bone.roll = -2.4141 bone.use_connect = True bone.parent = arm.edit_bones[bones['ear.R.002']] bones['ear.R.003'] = bone.name bone = arm.edit_bones.new('brow.B.L.003') - bone.head[:] = 0.0362, -0.6871, 0.9343 - bone.tail[:] = 0.0269, -0.6936, 0.9293 + bone.head = 0.0362, -0.6871, 0.9343 + bone.tail = 0.0269, -0.6936, 0.9293 bone.roll = 0.2912 bone.use_connect = True bone.parent = arm.edit_bones[bones['brow.B.L.002']] bones['brow.B.L.003'] = bone.name bone = arm.edit_bones.new('lid.T.L.003') - bone.head[:] = 0.0361, -0.6798, 0.9241 - bone.tail[:] = 0.0281, -0.6756, 0.9088 + bone.head = 0.0361, -0.6798, 0.9241 + bone.tail = 0.0281, -0.6756, 0.9088 bone.roll = -0.3539 bone.use_connect = True bone.parent = arm.edit_bones[bones['lid.T.L.002']] bones['lid.T.L.003'] = bone.name bone = arm.edit_bones.new('brow.B.R.003') - bone.head[:] = -0.0362, -0.6871, 0.9343 - bone.tail[:] = -0.0269, -0.6936, 0.9293 + bone.head = -0.0362, -0.6871, 0.9343 + bone.tail = -0.0269, -0.6936, 0.9293 bone.roll = -0.2912 bone.use_connect = True bone.parent = arm.edit_bones[bones['brow.B.R.002']] bones['brow.B.R.003'] = bone.name bone = arm.edit_bones.new('lid.T.R.003') - bone.head[:] = -0.0361, -0.6798, 0.9241 - bone.tail[:] = -0.0281, -0.6756, 0.9088 + bone.head = -0.0361, -0.6798, 0.9241 + bone.tail = -0.0281, -0.6756, 0.9088 bone.roll = 0.3539 bone.use_connect = True bone.parent = arm.edit_bones[bones['lid.T.R.002']] bones['lid.T.R.003'] = bone.name bone = arm.edit_bones.new('temple.L') - bone.head[:] = 0.0590, -0.5870, 0.9758 - bone.tail[:] = 0.0931, -0.5866, 0.8642 + bone.head = 0.0590, -0.5870, 0.9758 + bone.tail = 0.0931, -0.5866, 0.8642 bone.roll = -0.4594 bone.use_connect = False bone.parent = arm.edit_bones[bones['forehead.L.002']] bones['temple.L'] = bone.name bone = arm.edit_bones.new('temple.R') - bone.head[:] = -0.0590, -0.5870, 0.9758 - bone.tail[:] = -0.0931, -0.5866, 0.8642 + bone.head = -0.0590, -0.5870, 0.9758 + bone.tail = -0.0931, -0.5866, 0.8642 bone.roll = 0.4594 bone.use_connect = False bone.parent = arm.edit_bones[bones['forehead.R.002']] bones['temple.R'] = bone.name bone = arm.edit_bones.new('nose.L.001') - bone.head[:] = 0.0360, -0.7993, 0.8371 - bone.tail[:] = 0.0000, -0.8391, 0.8371 + bone.head = 0.0360, -0.7993, 0.8371 + bone.tail = 0.0000, -0.8391, 0.8371 bone.roll = 2.9287 bone.use_connect = True bone.parent = arm.edit_bones[bones['nose.L']] bones['nose.L.001'] = bone.name bone = arm.edit_bones.new('nose.R.001') - bone.head[:] = -0.0360, -0.7993, 0.8371 - bone.tail[:] = 0.0000, -0.8391, 0.8371 + bone.head = -0.0360, -0.7993, 0.8371 + bone.tail = 0.0000, -0.8391, 0.8371 bone.roll = -2.9287 bone.use_connect = True bone.parent = arm.edit_bones[bones['nose.R']] bones['nose.R.001'] = bone.name bone = arm.edit_bones.new('f_pinky.02.L') - bone.head[:] = 0.1477, -0.2946, 0.0222 - bone.tail[:] = 0.1520, -0.3116, 0.0170 + bone.head = 0.1477, -0.2946, 0.0222 + bone.tail = 0.1520, -0.3116, 0.0170 bone.roll = -1.4292 bone.use_connect = True bone.parent = arm.edit_bones[bones['f_pinky.01.L']] bones['f_pinky.02.L'] = bone.name bone = arm.edit_bones.new('f_ring.02.L') - bone.head[:] = 0.1255, -0.3031, 0.0317 - bone.tail[:] = 0.1278, -0.3200, 0.0224 + bone.head = 0.1255, -0.3031, 0.0317 + bone.tail = 0.1278, -0.3200, 0.0224 bone.roll = -0.5100 bone.use_connect = True bone.parent = arm.edit_bones[bones['f_ring.01.L']] bones['f_ring.02.L'] = bone.name bone = arm.edit_bones.new('f_middle.02.L') - bone.head[:] = 0.0955, -0.3030, 0.0317 - bone.tail[:] = 0.0940, -0.3200, 0.0224 + bone.head = 0.0955, -0.3030, 0.0317 + bone.tail = 0.0940, -0.3200, 0.0224 bone.roll = 0.4076 bone.use_connect = True bone.parent = arm.edit_bones[bones['f_middle.01.L']] bones['f_middle.02.L'] = bone.name bone = arm.edit_bones.new('f_index.02.L') - bone.head[:] = 0.0749, -0.2916, 0.0222 - bone.tail[:] = 0.0712, -0.3087, 0.0170 + bone.head = 0.0749, -0.2916, 0.0222 + bone.tail = 0.0712, -0.3087, 0.0170 bone.roll = 1.3847 bone.use_connect = True bone.parent = arm.edit_bones[bones['f_index.01.L']] bones['f_index.02.L'] = bone.name bone = arm.edit_bones.new('f_pinky.02.R') - bone.head[:] = -0.1477, -0.2946, 0.0222 - bone.tail[:] = -0.1520, -0.3116, 0.0170 + bone.head = -0.1477, -0.2946, 0.0222 + bone.tail = -0.1520, -0.3116, 0.0170 bone.roll = 1.4292 bone.use_connect = True bone.parent = arm.edit_bones[bones['f_pinky.01.R']] bones['f_pinky.02.R'] = bone.name bone = arm.edit_bones.new('f_ring.02.R') - bone.head[:] = -0.1255, -0.3031, 0.0317 - bone.tail[:] = -0.1278, -0.3200, 0.0224 + bone.head = -0.1255, -0.3031, 0.0317 + bone.tail = -0.1278, -0.3200, 0.0224 bone.roll = 0.5100 bone.use_connect = True bone.parent = arm.edit_bones[bones['f_ring.01.R']] bones['f_ring.02.R'] = bone.name bone = arm.edit_bones.new('f_middle.02.R') - bone.head[:] = -0.0955, -0.3030, 0.0317 - bone.tail[:] = -0.0940, -0.3200, 0.0224 + bone.head = -0.0955, -0.3030, 0.0317 + bone.tail = -0.0940, -0.3200, 0.0224 bone.roll = -0.4076 bone.use_connect = True bone.parent = arm.edit_bones[bones['f_middle.01.R']] bones['f_middle.02.R'] = bone.name bone = arm.edit_bones.new('f_index.02.R') - bone.head[:] = -0.0749, -0.2916, 0.0222 - bone.tail[:] = -0.0712, -0.3087, 0.0170 + bone.head = -0.0749, -0.2916, 0.0222 + bone.tail = -0.0712, -0.3087, 0.0170 bone.roll = -1.3847 bone.use_connect = True bone.parent = arm.edit_bones[bones['f_index.01.R']] bones['f_index.02.R'] = bone.name bone = arm.edit_bones.new('nose.004') - bone.head[:] = 0.0000, -0.8349, 0.8089 - bone.tail[:] = 0.0000, -0.8159, 0.7913 + bone.head = 0.0000, -0.8349, 0.8089 + bone.tail = 0.0000, -0.8159, 0.7913 bone.roll = 0.0082 bone.use_connect = True bone.parent = arm.edit_bones[bones['nose.003']] bones['nose.004'] = bone.name bone = arm.edit_bones.new('ear.L.004') - bone.head[:] = 0.1130, -0.5379, 0.9935 - bone.tail[:] = 0.0949, -0.5457, 0.9545 + bone.head = 0.1130, -0.5379, 0.9935 + bone.tail = 0.0949, -0.5457, 0.9545 bone.roll = -2.3814 bone.use_connect = True bone.parent = arm.edit_bones[bones['ear.L.003']] bones['ear.L.004'] = bone.name bone = arm.edit_bones.new('ear.R.004') - bone.head[:] = -0.1130, -0.5379, 0.9935 - bone.tail[:] = -0.0949, -0.5457, 0.9545 + bone.head = -0.1130, -0.5379, 0.9935 + bone.tail = -0.0949, -0.5457, 0.9545 bone.roll = 2.3814 bone.use_connect = True bone.parent = arm.edit_bones[bones['ear.R.003']] bones['ear.R.004'] = bone.name bone = arm.edit_bones.new('lid.B.L') - bone.head[:] = 0.0281, -0.6756, 0.9088 - bone.tail[:] = 0.0382, -0.6786, 0.9040 + bone.head = 0.0281, -0.6756, 0.9088 + bone.tail = 0.0382, -0.6786, 0.9040 bone.roll = 0.2941 bone.use_connect = True bone.parent = arm.edit_bones[bones['lid.T.L.003']] bones['lid.B.L'] = bone.name bone = arm.edit_bones.new('lid.B.R') - bone.head[:] = -0.0281, -0.6756, 0.9088 - bone.tail[:] = -0.0382, -0.6786, 0.9040 + bone.head = -0.0281, -0.6756, 0.9088 + bone.tail = -0.0382, -0.6786, 0.9040 bone.roll = -0.2941 bone.use_connect = True bone.parent = arm.edit_bones[bones['lid.T.R.003']] bones['lid.B.R'] = bone.name bone = arm.edit_bones.new('jaw.L') - bone.head[:] = 0.0931, -0.5866, 0.8642 - bone.tail[:] = 0.0694, -0.6211, 0.8005 + bone.head = 0.0931, -0.5866, 0.8642 + bone.tail = 0.0694, -0.6211, 0.8005 bone.roll = 0.0983 bone.use_connect = True bone.parent = arm.edit_bones[bones['temple.L']] bones['jaw.L'] = bone.name bone = arm.edit_bones.new('jaw.R') - bone.head[:] = -0.0931, -0.5866, 0.8642 - bone.tail[:] = -0.0694, -0.6211, 0.8005 + bone.head = -0.0931, -0.5866, 0.8642 + bone.tail = -0.0694, -0.6211, 0.8005 bone.roll = -0.0983 bone.use_connect = True bone.parent = arm.edit_bones[bones['temple.R']] bones['jaw.R'] = bone.name bone = arm.edit_bones.new('f_pinky.03.L') - bone.head[:] = 0.1520, -0.3116, 0.0170 - bone.tail[:] = 0.1544, -0.3323, 0.0129 + bone.head = 0.1520, -0.3116, 0.0170 + bone.tail = 0.1544, -0.3323, 0.0129 bone.roll = -1.0952 bone.use_connect = True bone.parent = arm.edit_bones[bones['f_pinky.02.L']] bones['f_pinky.03.L'] = bone.name bone = arm.edit_bones.new('f_ring.03.L') - bone.head[:] = 0.1278, -0.3200, 0.0224 - bone.tail[:] = 0.1328, -0.3592, 0.0129 + bone.head = 0.1278, -0.3200, 0.0224 + bone.tail = 0.1328, -0.3592, 0.0129 bone.roll = -0.9905 bone.use_connect = True bone.parent = arm.edit_bones[bones['f_ring.02.L']] bones['f_ring.03.L'] = bone.name bone = arm.edit_bones.new('f_middle.03.L') - bone.head[:] = 0.0940, -0.3200, 0.0224 - bone.tail[:] = 0.0902, -0.3593, 0.0129 + bone.head = 0.0940, -0.3200, 0.0224 + bone.tail = 0.0902, -0.3593, 0.0129 bone.roll = 0.8084 bone.use_connect = True bone.parent = arm.edit_bones[bones['f_middle.02.L']] bones['f_middle.03.L'] = bone.name bone = arm.edit_bones.new('f_index.03.L') - bone.head[:] = 0.0712, -0.3087, 0.0170 - bone.tail[:] = 0.0641, -0.3283, 0.0129 + bone.head = 0.0712, -0.3087, 0.0170 + bone.tail = 0.0641, -0.3283, 0.0129 bone.roll = 2.2048 bone.use_connect = True bone.parent = arm.edit_bones[bones['f_index.02.L']] bones['f_index.03.L'] = bone.name bone = arm.edit_bones.new('f_pinky.03.R') - bone.head[:] = -0.1520, -0.3116, 0.0170 - bone.tail[:] = -0.1544, -0.3323, 0.0129 + bone.head = -0.1520, -0.3116, 0.0170 + bone.tail = -0.1544, -0.3323, 0.0129 bone.roll = 1.0952 bone.use_connect = True bone.parent = arm.edit_bones[bones['f_pinky.02.R']] bones['f_pinky.03.R'] = bone.name bone = arm.edit_bones.new('f_ring.03.R') - bone.head[:] = -0.1278, -0.3200, 0.0224 - bone.tail[:] = -0.1328, -0.3592, 0.0129 + bone.head = -0.1278, -0.3200, 0.0224 + bone.tail = -0.1328, -0.3592, 0.0129 bone.roll = 0.9905 bone.use_connect = True bone.parent = arm.edit_bones[bones['f_ring.02.R']] bones['f_ring.03.R'] = bone.name bone = arm.edit_bones.new('f_middle.03.R') - bone.head[:] = -0.0940, -0.3200, 0.0224 - bone.tail[:] = -0.0902, -0.3593, 0.0129 + bone.head = -0.0940, -0.3200, 0.0224 + bone.tail = -0.0902, -0.3593, 0.0129 bone.roll = -0.8084 bone.use_connect = True bone.parent = arm.edit_bones[bones['f_middle.02.R']] bones['f_middle.03.R'] = bone.name bone = arm.edit_bones.new('f_index.03.R') - bone.head[:] = -0.0712, -0.3087, 0.0170 - bone.tail[:] = -0.0641, -0.3283, 0.0129 + bone.head = -0.0712, -0.3087, 0.0170 + bone.tail = -0.0641, -0.3283, 0.0129 bone.roll = -2.2048 bone.use_connect = True bone.parent = arm.edit_bones[bones['f_index.02.R']] bones['f_index.03.R'] = bone.name bone = arm.edit_bones.new('lid.B.L.001') - bone.head[:] = 0.0382, -0.6786, 0.9040 - bone.tail[:] = 0.0476, -0.6772, 0.9036 + bone.head = 0.0382, -0.6786, 0.9040 + bone.tail = 0.0476, -0.6772, 0.9036 bone.roll = 0.0266 bone.use_connect = True bone.parent = arm.edit_bones[bones['lid.B.L']] bones['lid.B.L.001'] = bone.name bone = arm.edit_bones.new('lid.B.R.001') - bone.head[:] = -0.0382, -0.6786, 0.9040 - bone.tail[:] = -0.0476, -0.6772, 0.9036 + bone.head = -0.0382, -0.6786, 0.9040 + bone.tail = -0.0476, -0.6772, 0.9036 bone.roll = -0.0266 bone.use_connect = True bone.parent = arm.edit_bones[bones['lid.B.R']] bones['lid.B.R.001'] = bone.name bone = arm.edit_bones.new('jaw.L.001') - bone.head[:] = 0.0694, -0.6211, 0.8005 - bone.tail[:] = 0.0481, -0.6715, 0.7849 + bone.head = 0.0694, -0.6211, 0.8005 + bone.tail = 0.0481, -0.6715, 0.7849 bone.roll = 0.2993 bone.use_connect = True bone.parent = arm.edit_bones[bones['jaw.L']] bones['jaw.L.001'] = bone.name bone = arm.edit_bones.new('jaw.R.001') - bone.head[:] = -0.0694, -0.6211, 0.8005 - bone.tail[:] = -0.0481, -0.6715, 0.7849 + bone.head = -0.0694, -0.6211, 0.8005 + bone.tail = -0.0481, -0.6715, 0.7849 bone.roll = -0.2993 bone.use_connect = True bone.parent = arm.edit_bones[bones['jaw.R']] bones['jaw.R.001'] = bone.name bone = arm.edit_bones.new('lid.B.L.002') - bone.head[:] = 0.0476, -0.6772, 0.9036 - bone.tail[:] = 0.0570, -0.6724, 0.9082 + bone.head = 0.0476, -0.6772, 0.9036 + bone.tail = 0.0570, -0.6724, 0.9082 bone.roll = -0.1195 bone.use_connect = True bone.parent = arm.edit_bones[bones['lid.B.L.001']] bones['lid.B.L.002'] = bone.name bone = arm.edit_bones.new('lid.B.R.002') - bone.head[:] = -0.0476, -0.6772, 0.9036 - bone.tail[:] = -0.0570, -0.6724, 0.9082 + bone.head = -0.0476, -0.6772, 0.9036 + bone.tail = -0.0570, -0.6724, 0.9082 bone.roll = 0.1195 bone.use_connect = True bone.parent = arm.edit_bones[bones['lid.B.R.001']] bones['lid.B.R.002'] = bone.name bone = arm.edit_bones.new('chin.L') - bone.head[:] = 0.0481, -0.6715, 0.7849 - bone.tail[:] = 0.0482, -0.6927, 0.7995 + bone.head = 0.0481, -0.6715, 0.7849 + bone.tail = 0.0482, -0.6927, 0.7995 bone.roll = 3.1083 bone.use_connect = True bone.parent = arm.edit_bones[bones['jaw.L.001']] bones['chin.L'] = bone.name bone = arm.edit_bones.new('chin.R') - bone.head[:] = -0.0481, -0.6715, 0.7849 - bone.tail[:] = -0.0482, -0.6927, 0.7995 + bone.head = -0.0481, -0.6715, 0.7849 + bone.tail = -0.0482, -0.6927, 0.7995 bone.roll = -3.1083 bone.use_connect = True bone.parent = arm.edit_bones[bones['jaw.R.001']] bones['chin.R'] = bone.name bone = arm.edit_bones.new('lid.B.L.003') - bone.head[:] = 0.0570, -0.6724, 0.9082 - bone.tail[:] = 0.0621, -0.6644, 0.9197 + bone.head = 0.0570, -0.6724, 0.9082 + bone.tail = 0.0621, -0.6644, 0.9197 bone.roll = -0.1171 bone.use_connect = True bone.parent = arm.edit_bones[bones['lid.B.L.002']] bones['lid.B.L.003'] = bone.name bone = arm.edit_bones.new('lid.B.R.003') - bone.head[:] = -0.0570, -0.6724, 0.9082 - bone.tail[:] = -0.0621, -0.6644, 0.9197 + bone.head = -0.0570, -0.6724, 0.9082 + bone.tail = -0.0621, -0.6644, 0.9197 bone.roll = 0.1171 bone.use_connect = True bone.parent = arm.edit_bones[bones['lid.B.R.002']] bones['lid.B.R.003'] = bone.name bone = arm.edit_bones.new('cheek.B.L') - bone.head[:] = 0.0482, -0.6927, 0.7995 - bone.tail[:] = 0.0707, -0.6771, 0.8294 + bone.head = 0.0482, -0.6927, 0.7995 + bone.tail = 0.0707, -0.6771, 0.8294 bone.roll = -0.1207 bone.use_connect = True bone.parent = arm.edit_bones[bones['chin.L']] bones['cheek.B.L'] = bone.name bone = arm.edit_bones.new('cheek.B.R') - bone.head[:] = -0.0482, -0.6927, 0.7995 - bone.tail[:] = -0.0707, -0.6771, 0.8294 + bone.head = -0.0482, -0.6927, 0.7995 + bone.tail = -0.0707, -0.6771, 0.8294 bone.roll = 0.1207 bone.use_connect = True bone.parent = arm.edit_bones[bones['chin.R']] bones['cheek.B.R'] = bone.name bone = arm.edit_bones.new('cheek.B.L.001') - bone.head[:] = 0.0707, -0.6771, 0.8294 - bone.tail[:] = 0.0906, -0.6428, 0.9032 + bone.head = 0.0707, -0.6771, 0.8294 + bone.tail = 0.0906, -0.6428, 0.9032 bone.roll = 0.0640 bone.use_connect = True bone.parent = arm.edit_bones[bones['cheek.B.L']] bones['cheek.B.L.001'] = bone.name bone = arm.edit_bones.new('cheek.B.R.001') - bone.head[:] = -0.0707, -0.6771, 0.8294 - bone.tail[:] = -0.0906, -0.6428, 0.9032 + bone.head = -0.0707, -0.6771, 0.8294 + bone.tail = -0.0906, -0.6428, 0.9032 bone.roll = -0.0640 bone.use_connect = True bone.parent = arm.edit_bones[bones['cheek.B.R']] bones['cheek.B.R.001'] = bone.name bone = arm.edit_bones.new('brow.T.L') - bone.head[:] = 0.0906, -0.6428, 0.9032 - bone.tail[:] = 0.0774, -0.6567, 0.9438 + bone.head = 0.0906, -0.6428, 0.9032 + bone.tail = 0.0774, -0.6567, 0.9438 bone.roll = 0.1270 bone.use_connect = True bone.parent = arm.edit_bones[bones['cheek.B.L.001']] bones['brow.T.L'] = bone.name bone = arm.edit_bones.new('brow.T.R') - bone.head[:] = -0.0906, -0.6428, 0.9032 - bone.tail[:] = -0.0774, -0.6567, 0.9438 + bone.head = -0.0906, -0.6428, 0.9032 + bone.tail = -0.0774, -0.6567, 0.9438 bone.roll = -0.1270 bone.use_connect = True bone.parent = arm.edit_bones[bones['cheek.B.R.001']] bones['brow.T.R'] = bone.name bone = arm.edit_bones.new('brow.T.L.001') - bone.head[:] = 0.0774, -0.6567, 0.9438 - bone.tail[:] = 0.0510, -0.6773, 0.9561 + bone.head = 0.0774, -0.6567, 0.9438 + bone.tail = 0.0510, -0.6773, 0.9561 bone.roll = -2.7274 bone.use_connect = True bone.parent = arm.edit_bones[bones['brow.T.L']] bones['brow.T.L.001'] = bone.name bone = arm.edit_bones.new('brow.T.R.001') - bone.head[:] = -0.0774, -0.6567, 0.9438 - bone.tail[:] = -0.0510, -0.6773, 0.9561 + bone.head = -0.0774, -0.6567, 0.9438 + bone.tail = -0.0510, -0.6773, 0.9561 bone.roll = 2.7274 bone.use_connect = True bone.parent = arm.edit_bones[bones['brow.T.R']] bones['brow.T.R.001'] = bone.name bone = arm.edit_bones.new('brow.T.L.002') - bone.head[:] = 0.0510, -0.6773, 0.9561 - bone.tail[:] = 0.0160, -0.7017, 0.9527 + bone.head = 0.0510, -0.6773, 0.9561 + bone.tail = 0.0160, -0.7017, 0.9527 bone.roll = 0.4172 bone.use_connect = True bone.parent = arm.edit_bones[bones['brow.T.L.001']] bones['brow.T.L.002'] = bone.name bone = arm.edit_bones.new('brow.T.R.002') - bone.head[:] = -0.0510, -0.6773, 0.9561 - bone.tail[:] = -0.0160, -0.7017, 0.9527 + bone.head = -0.0510, -0.6773, 0.9561 + bone.tail = -0.0160, -0.7017, 0.9527 bone.roll = -0.4172 bone.use_connect = True bone.parent = arm.edit_bones[bones['brow.T.R.001']] bones['brow.T.R.002'] = bone.name bone = arm.edit_bones.new('brow.T.L.003') - bone.head[:] = 0.0160, -0.7017, 0.9527 - bone.tail[:] = 0.0000, -0.7082, 0.9031 + bone.head = 0.0160, -0.7017, 0.9527 + bone.tail = 0.0000, -0.7082, 0.9031 bone.roll = -0.6706 bone.use_connect = True bone.parent = arm.edit_bones[bones['brow.T.L.002']] bones['brow.T.L.003'] = bone.name bone = arm.edit_bones.new('brow.T.R.003') - bone.head[:] = -0.0160, -0.7017, 0.9527 - bone.tail[:] = 0.0000, -0.7082, 0.9031 + bone.head = -0.0160, -0.7017, 0.9527 + bone.tail = 0.0000, -0.7082, 0.9031 bone.roll = 0.6706 bone.use_connect = True bone.parent = arm.edit_bones[bones['brow.T.R.002']] @@ -1505,7 +1505,7 @@ def create(obj): pbone.rotation_mode = 'QUATERNION' pbone.bone.layers = [False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] try: - pbone.rigify_parameters.pivot_pos = 4 + pbone.rigify_parameters.pivot_pos = 2 except AttributeError: pass try: @@ -1597,7 +1597,7 @@ def create(obj): except AttributeError: pass pbone = obj.pose.bones[bones['thigh.L']] - pbone.rigify_type = 'limbs.super_limb' + pbone.rigify_type = 'limbs.rear_paw' pbone.lock_location = (False, False, False) pbone.lock_rotation = (False, False, False) pbone.lock_rotation_w = False @@ -1617,7 +1617,7 @@ def create(obj): except AttributeError: pass pbone = obj.pose.bones[bones['thigh.R']] - pbone.rigify_type = 'limbs.super_limb' + pbone.rigify_type = 'limbs.rear_paw' pbone.lock_location = (False, False, False) pbone.lock_rotation = (False, False, False) pbone.lock_rotation_w = False @@ -1789,7 +1789,7 @@ def create(obj): pbone.rotation_mode = 'QUATERNION' pbone.bone.layers = [False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] pbone = obj.pose.bones[bones['front_thigh.L']] - pbone.rigify_type = 'limbs.super_limb' + pbone.rigify_type = 'limbs.front_paw' pbone.lock_location = (False, False, False) pbone.lock_rotation = (False, False, False) pbone.lock_rotation_w = False @@ -1809,7 +1809,7 @@ def create(obj): except AttributeError: pass pbone = obj.pose.bones[bones['front_thigh.R']] - pbone.rigify_type = 'limbs.super_limb' + pbone.rigify_type = 'limbs.front_paw' pbone.lock_location = (False, False, False) pbone.lock_rotation = (False, False, False) pbone.lock_rotation_w = False diff --git a/rigify/rig_ui_template.py b/rigify/rig_ui_template.py index 642b5110..c83dd02b 100644 --- a/rigify/rig_ui_template.py +++ b/rigify/rig_ui_template.py @@ -125,6 +125,11 @@ def get_pose_matrix_in_other_space(mat, pose_bone): return pose_bone.id_data.convert_space(matrix=mat, pose_bone=pose_bone, from_space='POSE', to_space='LOCAL') +def convert_pose_matrix_via_rest_delta(mat, from_bone, to_bone): + """Convert pose of one bone to another bone, preserving the rest pose difference between them.""" + return mat @ from_bone.bone.matrix_local.inverted() @ to_bone.bone.matrix_local + + def get_local_pose_matrix(pose_bone): """ Returns the local transform matrix of the given pose bone. """ @@ -193,39 +198,41 @@ def match_pose_scale(pose_bone, target_bone): ## IK/FK snapping functions ## ############################## -def correct_rotation(view_layer, bone_ik, target_matrix): +def correct_rotation(view_layer, bone_ik, target_matrix, *, ctrl_ik=None): """ Corrects the ik rotation in ik2fk snapping functions """ axis = target_matrix.to_3x3().col[1].normalized() + ctrl_ik = ctrl_ik or bone_ik def distance(angle): # Rotate the bone and return the actual angle between bones - bone_ik.rotation_euler[1] = angle + ctrl_ik.rotation_euler[1] = angle view_layer.update() return -(bone_ik.vector.normalized().dot(axis)) - if bone_ik.rotation_mode in {'QUATERNION', 'AXIS_ANGLE'}: - bone_ik.rotation_mode = 'ZXY' + if ctrl_ik.rotation_mode in {'QUATERNION', 'AXIS_ANGLE'}: + ctrl_ik.rotation_mode = 'ZXY' - start_angle = bone_ik.rotation_euler[1] + start_angle = ctrl_ik.rotation_euler[1] alfarange = find_min_range(distance, start_angle) alfamin = ternarySearch(distance, alfarange[0], alfarange[1], pi / 180) - bone_ik.rotation_euler[1] = alfamin + ctrl_ik.rotation_euler[1] = alfamin view_layer.update() -def correct_scale(view_layer, bone_ik, target_matrix): +def correct_scale(view_layer, bone_ik, target_matrix, *, ctrl_ik=None): """ Correct the scale of the base IK bone. """ input_scale = target_matrix.to_scale() + ctrl_ik = ctrl_ik or bone_ik for i in range(3): cur_scale = bone_ik.matrix.to_scale() - bone_ik.scale = [ + ctrl_ik.scale = [ v * i / c for v, i, c in zip(bone_ik.scale, input_scale, cur_scale) ] @@ -456,8 +463,8 @@ def fk2ik_leg(obj, fk, ik): view_layer.update() # Foot position - mat = mfoot.bone.matrix_local.inverted() @ foot.bone.matrix_local - footmat = get_pose_matrix_in_other_space(mfooti.matrix, foot) @ mat + footmat = get_pose_matrix_in_other_space(mfooti.matrix, foot) + footmat = convert_pose_matrix_via_rest_delta(footmat, mfoot, foot) set_pose_rotation(foot, footmat) set_pose_scale(foot, footmat) view_layer.update() @@ -475,8 +482,8 @@ def fk2ik_leg(obj, fk, ik): view_layer.update() # Foot position - mat = mfoot.bone.matrix_local.inverted() @ foot.bone.matrix_local - footmat = get_pose_matrix_in_other_space(mfooti.matrix, foot) @ mat + footmat = get_pose_matrix_in_other_space(mfooti.matrix, foot) + footmat = convert_pose_matrix_via_rest_delta(footmat, mfoot, foot) set_pose_rotation(foot, footmat) set_pose_scale(foot, footmat) view_layer.update() @@ -516,8 +523,8 @@ def ik2fk_leg(obj, fk, ik): view_layer.update() # Foot position - mat = mfooti.bone.matrix_local.inverted() @ footi.bone.matrix_local - footmat = get_pose_matrix_in_other_space(foot.matrix, footi) @ mat + footmat = get_pose_matrix_in_other_space(foot.matrix, footi) + footmat = convert_pose_matrix_via_rest_delta(footmat, mfooti, footi) set_pose_translation(footi, footmat) set_pose_rotation(footi, footmat) set_pose_scale(footi, footmat) @@ -544,8 +551,8 @@ def ik2fk_leg(obj, fk, ik): view_layer.update() # Foot position - mat = mfooti.bone.matrix_local.inverted() @ footi.bone.matrix_local - footmat = get_pose_matrix_in_other_space(mfoot.matrix, footi) @ mat + footmat = get_pose_matrix_in_other_space(mfoot.matrix, footi) + footmat = convert_pose_matrix_via_rest_delta(footmat, mfooti, footi) set_pose_translation(footi, footmat) set_pose_rotation(footi, footmat) set_pose_scale(footi, footmat) diff --git a/rigify/rigs/limbs/arm.py b/rigify/rigs/limbs/arm.py index e554465a..e276407e 100644 --- a/rigify/rigs/limbs/arm.py +++ b/rigify/rigs/limbs/arm.py @@ -37,10 +37,9 @@ from .limb_rigs import BaseLimbRig class Rig(BaseLimbRig): """Human arm rig.""" - def initialize(self): - if len(self.bones.org.main) != 3: - self.raise_error("Input to rig type must be a chain of 3 bones.") + min_valid_orgs = max_valid_orgs = 3 + def initialize(self): super().initialize() self.make_wrist_pivot = self.params.make_ik_wrist_pivot diff --git a/rigify/rigs/limbs/front_paw.py b/rigify/rigs/limbs/front_paw.py new file mode 100644 index 00000000..f89ca6c4 --- /dev/null +++ b/rigify/rigs/limbs/front_paw.py @@ -0,0 +1,288 @@ +#====================== BEGIN GPL LICENSE BLOCK ====================== +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +#======================= END GPL LICENSE BLOCK ======================== + +# <pep8 compliant> + +import bpy + +from ...utils.bones import align_bone_roll, put_bone, copy_bone_position, flip_bone +from ...utils.naming import make_derived_name +from ...utils.misc import map_list + +from itertools import count + +from ...base_rig import stage + +from .limb_rigs import BaseLimbRig +from .paw import Rig as pawRig + + +class Rig(pawRig): + """Front paw rig with special IK automation.""" + + #################################################### + # EXTRA BONES + # + # mch: + # ik2_chain[2] + # Second IK system (pre-driving heel) + # heel_track + # Bone tracking IK2 to rotate heel + # heel_parent + # Parent of the heel control + # + #################################################### + + #################################################### + # IK controls + + def get_middle_ik_controls(self): + return [self.bones.ctrl.heel] + + def get_ik_fk_position_chains(self): + ik_chain, fk_chain = super().get_ik_fk_position_chains() + if not self.use_heel2: + return [*ik_chain, ik_chain[-1]], [*fk_chain, fk_chain[-1]] + return ik_chain, fk_chain + + def get_extra_ik_controls(self): + extra = [self.bones.ctrl.heel2] if self.use_heel2 else [] + return BaseLimbRig.get_extra_ik_controls(self) + extra + + def get_ik_pole_parents(self): + return [(self.get_ik2_target_bone(), self.bones.ctrl.ik)] + + + #################################################### + # Second IK system (pre-driving heel) + + use_mch_ik_base = True + + def get_ik2_target_bone(self): + return self.bones.mch.ik2_target if self.use_heel2 else self.bones.mch.toe_socket + + @stage.generate_bones + def make_ik2_mch_chain(self): + orgs = self.bones.org.main + chain = map_list(self.make_ik2_mch_bone, count(0), orgs[0:2]) + self.bones.mch.ik2_chain = chain + + if self.use_heel2: + self.bones.mch.ik2_target = self.make_ik2_mch_target_bone(orgs) + + # Connect the chain end to the target + self.get_bone(chain[1]).tail = self.get_bone(orgs[2]).tail + align_bone_roll(self.obj, chain[1], orgs[1]) + + 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) + + def make_ik2_mch_bone(self, i, org): + return self.copy_bone(org, make_derived_name(org, 'mch', '_ik2')) + + @stage.parent_bones + def parent_ik2_mch_chain(self): + mch = self.bones.mch + if self.use_heel2: + self.set_bone_parent(mch.ik2_target, self.bones.ctrl.heel2) + 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) + + @stage.configure_bones + def configure_ik2_mch_chain(self): + for i, mch in enumerate(self.bones.mch.ik2_chain): + self.configure_ik2_mch_bone(i, mch) + + def configure_ik2_mch_bone(self, i, mch): + bone = self.get_bone(mch) + bone.ik_stretch = 0.1 + if i == 1: + bone.lock_ik_x = bone.lock_ik_y = bone.lock_ik_z = True + setattr(bone, 'lock_ik_' + self.main_axis, False) + + @stage.rig_bones + def rig_ik2_mch_chain(self): + target_bone = self.get_ik2_target_bone() + self.rig_ik_mch_end_bone(self.bones.mch.ik2_chain[-1], target_bone, self.bones.ctrl.ik_pole) + + + #################################################### + # Heel tracking from IK2 + + @stage.generate_bones + def make_heel_track_bones(self): + orgs = self.bones.org.main + mch = self.bones.mch + mch.heel_track = self.copy_bone(orgs[2], make_derived_name(orgs[2], 'mch', '_track')) + mch.heel_parent = self.copy_bone(orgs[2], make_derived_name(orgs[2], 'mch', '_parent')) + + # This two bone setup is used to move the damped track singularity out + # of the way to a forbidden zone of the rig, and thus avoid flipping. + # The bones are aligned to the center of the valid transformation zone. + self.align_ik_control_bone(mch.heel_track) + put_bone(self.obj, mch.heel_track, self.get_bone(orgs[2]).tail, scale=1/3) + copy_bone_position(self.obj, mch.heel_track, mch.heel_parent, scale=3/4) + + @stage.parent_bones + def parent_heel_control_bone(self): + self.set_bone_parent(self.bones.ctrl.heel, self.bones.mch.heel_parent) + + @stage.parent_bones + def parent_heel_track_bones(self): + # Parenting heel_parent deferred to apply_bones. + self.set_bone_parent(self.bones.mch.heel_track, self.get_ik2_target_bone()) + + @stage.configure_bones + def prerig_heel_track_bones(self): + # Assign the constraint before the apply stage. + self.make_constraint( + self.bones.mch.heel_track, 'DAMPED_TRACK', self.bones.mch.ik2_chain[1], + influence=self.params.front_paw_heel_influence + ) + + @stage.preapply_bones + def preapply_heel_track_bones(self): + # Assign local transform negating the effect of the constraint at rest. + track_bone = self.get_bone(self.bones.mch.heel_track) + bone = self.get_bone(self.bones.mch.heel_parent) + bone.matrix_basis = track_bone.matrix.inverted() @ bone.matrix + + @stage.apply_bones + def apply_heel_track_bones(self): + # Complete the parent chain. + self.set_bone_parent(self.bones.mch.heel_parent, self.bones.mch.heel_track) + + + #################################################### + # Settings + + @classmethod + def add_parameters(self, params): + super().add_parameters(params) + + params.front_paw_heel_influence = bpy.props.FloatProperty( + name = 'Heel IK Influence', + default = 0.8, + min = 0, + max = 1, + description = 'Influence of the secondary IK on the heel control rotation' + ) + + @classmethod + def parameters_ui(self, layout, params): + r = layout.row() + r.prop(params, "front_paw_heel_influence", slider=True) + + super().parameters_ui(layout, params) + + +def create_sample(obj): + # generated by rigify.utils.write_metarig + bpy.ops.object.mode_set(mode='EDIT') + arm = obj.data + + bones = {} + + bone = arm.edit_bones.new('front_thigh.L') + bone.head = 0.0000, 0.0000, 0.6902 + bone.tail = 0.0000, 0.0916, 0.4418 + bone.roll = 0.0000 + bone.use_connect = False + bones['front_thigh.L'] = bone.name + bone = arm.edit_bones.new('front_shin.L') + bone.head = 0.0000, 0.0916, 0.4418 + bone.tail = 0.0000, 0.1014, 0.1698 + bone.roll = 0.0000 + bone.use_connect = True + bone.parent = arm.edit_bones[bones['front_thigh.L']] + bones['front_shin.L'] = bone.name + bone = arm.edit_bones.new('front_foot.L') + bone.head = 0.0000, 0.1014, 0.1698 + bone.tail = 0.0000, 0.0699, 0.0411 + bone.roll = 0.0000 + bone.use_connect = True + bone.parent = arm.edit_bones[bones['front_shin.L']] + bones['front_foot.L'] = bone.name + bone = arm.edit_bones.new('front_toe.L') + bone.head = 0.0000, 0.0699, 0.0411 + bone.tail = 0.0000, -0.0540, 0.0000 + bone.roll = 3.1416 + bone.use_connect = True + bone.parent = arm.edit_bones[bones['front_foot.L']] + bones['front_toe.L'] = bone.name + + bpy.ops.object.mode_set(mode='OBJECT') + pbone = obj.pose.bones[bones['front_thigh.L']] + pbone.rigify_type = 'limbs.front_paw' + pbone.lock_location = (False, False, False) + pbone.lock_rotation = (False, False, False) + pbone.lock_rotation_w = False + pbone.lock_scale = (False, False, False) + pbone.rotation_mode = 'QUATERNION' + try: + pbone.rigify_parameters.limb_type = "paw" + except AttributeError: + pass + try: + pbone.rigify_parameters.fk_layers = [False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] + except AttributeError: + pass + try: + pbone.rigify_parameters.tweak_layers = [False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] + except AttributeError: + pass + pbone = obj.pose.bones[bones['front_shin.L']] + pbone.rigify_type = '' + pbone.lock_location = (False, False, False) + pbone.lock_rotation = (False, False, False) + pbone.lock_rotation_w = False + pbone.lock_scale = (False, False, False) + pbone.rotation_mode = 'QUATERNION' + pbone = obj.pose.bones[bones['front_foot.L']] + pbone.rigify_type = '' + pbone.lock_location = (False, False, False) + pbone.lock_rotation = (False, False, False) + pbone.lock_rotation_w = False + pbone.lock_scale = (False, False, False) + pbone.rotation_mode = 'QUATERNION' + pbone = obj.pose.bones[bones['front_toe.L']] + pbone.rigify_type = '' + pbone.lock_location = (False, False, False) + pbone.lock_rotation = (False, False, False) + pbone.lock_rotation_w = False + pbone.lock_scale = (False, False, False) + pbone.rotation_mode = 'QUATERNION' + try: + pbone.rigify_parameters.limb_type = "paw" + except AttributeError: + pass + + bpy.ops.object.mode_set(mode='EDIT') + for bone in arm.edit_bones: + bone.select = False + bone.select_head = False + bone.select_tail = False + for b in bones: + bone = arm.edit_bones[bones[b]] + bone.select = True + bone.select_head = True + bone.select_tail = True + bone.bbone_x = bone.bbone_z = bone.length * 0.05 + arm.edit_bones.active = bone + + return bones diff --git a/rigify/rigs/limbs/leg.py b/rigify/rigs/limbs/leg.py index 2be7ff35..d1b82c15 100644 --- a/rigify/rigs/limbs/leg.py +++ b/rigify/rigs/limbs/leg.py @@ -44,6 +44,8 @@ ALL_TRUE = (True, True, True) class Rig(BaseLimbRig): """Human leg rig.""" + min_valid_orgs = max_valid_orgs = 4 + def find_org_bones(self, bone): bones = super().find_org_bones(bone) @@ -57,9 +59,6 @@ class Rig(BaseLimbRig): return bones def initialize(self): - if len(self.bones.org.main) != 4: - self.raise_error("Input to rig type must be a chain of 4 bones.") - super().initialize() self.pivot_type = self.params.foot_pivot_type diff --git a/rigify/rigs/limbs/limb_rigs.py b/rigify/rigs/limbs/limb_rigs.py index 2e3fbc90..1c57a597 100644 --- a/rigify/rigs/limbs/limb_rigs.py +++ b/rigify/rigs/limbs/limb_rigs.py @@ -50,6 +50,8 @@ class BaseLimbRig(BaseRig): """Common base for limb rigs.""" segmented_orgs = 2 # Number of org bones to segment + min_valid_orgs = None + max_valid_orgs = None def find_org_bones(self, bone): return BoneDict( @@ -59,8 +61,11 @@ class BaseLimbRig(BaseRig): def initialize(self): orgs = self.bones.org.main - if len(orgs) < self.segmented_orgs + 1: - self.raise_error("Input to rig type must be a chain of at least 3 bones.") + min_length = max(self.segmented_orgs + 1, self.min_valid_orgs or 0) + if len(orgs) < min_length: + self.raise_error("Input to rig type must be a chain of at least {} bones.", min_length) + if self.max_valid_orgs and len(orgs) > self.max_valid_orgs: + self.raise_error("Input to rig type must be a chain of at most {} bones.", self.max_valid_orgs) self.segments = self.params.segments self.bbone_segments = self.params.bbones @@ -161,6 +166,8 @@ class BaseLimbRig(BaseRig): # IK stretch switch implementation. # ik_target # Corrected target position. + # ik_base + # Optionally the base of the ik chain (otherwise ctrl.ik_base) # ik_end # End of the IK chain: [ik_base, ik_end] # deform[]: @@ -242,8 +249,10 @@ class BaseLimbRig(BaseRig): def make_fk_control_chain(self): self.bones.ctrl.fk = map_list(self.make_fk_control_bone, count(0), self.bones.org.main) + fk_name_suffix_cutoff = 2 + def get_fk_name(self, i, org, kind): - return make_derived_name(org, kind, '_fk' if i <= 2 else '') + return make_derived_name(org, kind, '_fk' if i <= self.fk_name_suffix_cutoff else '') def make_fk_control_bone(self, i, org): return self.copy_bone(org, self.get_fk_name(i, org, 'ctrl')) @@ -296,7 +305,7 @@ class BaseLimbRig(BaseRig): self.bones.mch.fk = map_list(self.make_fk_parent_bone, count(0), self.bones.org.main) def make_fk_parent_bone(self, i, org): - if 2 <= i <= 3: + if i >= 2: return self.copy_bone(org, self.get_fk_name(i, org, 'mch'), parent=True, scale=1/4) @stage.parent_bones @@ -307,7 +316,7 @@ class BaseLimbRig(BaseRig): self.parent_fk_parent_bone(*args) def parent_fk_parent_bone(self, i, parent_mch, prev_ctrl, org, prev_org): - if i == 2: + if i >= 2: self.set_bone_parent(parent_mch, prev_ctrl, use_connect=True, inherit_scale='NONE') @stage.rig_bones @@ -316,7 +325,7 @@ class BaseLimbRig(BaseRig): self.rig_fk_parent_bone(*args) def rig_fk_parent_bone(self, i, parent_mch, org): - if i == 2: + if i >= 2: self.make_constraint(parent_mch, 'COPY_SCALE', 'root', use_make_uniform=True) @@ -329,10 +338,19 @@ class BaseLimbRig(BaseRig): else: return [] - def get_all_ik_controls(self): + def get_middle_ik_controls(self): + return [] + + def get_ik_fk_position_chains(self): + ik_chain = self.get_ik_output_chain() + return ik_chain, self.bones.ctrl.fk[0:len(ik_chain)] + + def get_ik_control_chain(self): ctrl = self.bones.ctrl - controls = [ctrl.ik_base, ctrl.ik_pole, ctrl.ik] - return controls + self.get_extra_ik_controls() + return [ctrl.ik_base, ctrl.ik_pole, *self.get_middle_ik_controls(), ctrl.ik] + + def get_all_ik_controls(self): + return self.get_ik_control_chain() + self.get_extra_ik_controls() @stage.generate_bones def make_ik_controls(self): @@ -371,6 +389,9 @@ class BaseLimbRig(BaseRig): else: return self.bones.ctrl.ik + def get_ik_pole_parents(self): + return [(self.bones.mch.ik_target, self.bones.ctrl.ik)] + def register_switch_parents(self, pbuilder): if self.rig_parent_bone: pbuilder.register_parent(self, self.rig_parent_bone) @@ -385,7 +406,6 @@ class BaseLimbRig(BaseRig): master = lambda: self.bones.ctrl.master pcontrols = lambda: [ ctrl.master ] + self.get_all_ik_controls() - pole_parents = lambda: [(self.bones.mch.ik_target, ctrl.ik)] self.register_switch_parents(pbuilder) @@ -395,7 +415,7 @@ class BaseLimbRig(BaseRig): ) pbuilder.build_child( - self, ctrl.ik_pole, prop_bone=master, extra_parents=pole_parents, + self, ctrl.ik_pole, prop_bone=master, extra_parents=self.get_ik_pole_parents, prop_id='pole_parent', prop_name='Pole Parent', controls=pcontrols, no_fix_rotation=True, no_fix_scale=True, ) @@ -409,7 +429,6 @@ class BaseLimbRig(BaseRig): base = self.get_bone(self.bones.ctrl.ik_base) base.rotation_mode = 'ZXY' base.lock_rotation = True, False, True - base.ik_stretch = 0.1 @stage.rig_bones def rig_ik_controls(self): @@ -421,6 +440,9 @@ class BaseLimbRig(BaseRig): set_bone_widget_transform(self.obj, ctrl.ik, self.get_ik_control_output()) + if self.use_mch_ik_base: + set_bone_widget_transform(self.obj, ctrl.ik_base, self.bones.mch.ik_base, target_size=True) + self.make_ik_base_widget(ctrl.ik_base) self.make_ik_pole_widget(ctrl.ik_pole) self.make_ik_ctrl_widget(ctrl.ik) @@ -475,19 +497,31 @@ class BaseLimbRig(BaseRig): ik_input_head_tail = 0.0 + use_mch_ik_base = False + def get_ik_input_bone(self): return self.get_ik_control_output() + def get_ik_chain_base(self): + return self.bones.mch.ik_base if self.use_mch_ik_base else self.bones.ctrl.ik_base + def get_ik_output_chain(self): - return [self.bones.ctrl.ik_base, self.bones.mch.ik_end, self.bones.mch.ik_target] + return [self.get_ik_chain_base(), self.bones.mch.ik_end, self.bones.mch.ik_target] @stage.generate_bones def make_ik_mch_chain(self): orgs = self.bones.org.main + + 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_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 @@ -498,12 +532,24 @@ 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_target, self.get_ik_input_bone()) - self.set_bone_parent(self.bones.mch.ik_end, self.bones.ctrl.ik_base) + self.set_bone_parent(self.bones.mch.ik_end, self.get_ik_chain_base()) @stage.configure_bones def configure_ik_mch_chain(self): + bone = self.get_bone(self.get_ik_chain_base()) + bone.ik_stretch = 0.1 + + bone = self.get_bone(self.bones.mch.ik_end) + bone.ik_stretch = 0.1 + bone.lock_ik_x = bone.lock_ik_y = bone.lock_ik_z = True + setattr(bone, 'lock_ik_' + self.main_axis, False) + + @stage.configure_bones + def configure_ik_mch_panel(self): ctrl = self.bones.ctrl panel = self.script.panel_with_selected_check(self, ctrl.flatten()) @@ -526,32 +572,34 @@ class BaseLimbRig(BaseRig): def add_global_buttons(self, panel, rig_name): ctrl = self.bones.ctrl ik_chain = self.get_ik_output_chain() + fk_chain = ctrl.fk[0:len(ik_chain)] add_generic_snap_fk_to_ik( panel, - fk_bones=self.bones.ctrl.fk[0:len(ik_chain)], - ik_bones=ik_chain, + fk_bones=fk_chain, ik_bones=ik_chain, ik_ctrl_bones=self.get_all_ik_controls(), rig_name=rig_name ) + ik_chain, fk_chain = self.get_ik_fk_position_chains() + add_limb_snap_ik_to_fk( panel, master=ctrl.master, - fk_bones=self.bones.ctrl.fk, ik_bones=ik_chain, - ik_ctrl_bones=[ctrl.ik_base, ctrl.ik, ctrl.ik_pole], + fk_bones=fk_chain, ik_bones=ik_chain, + ik_ctrl_bones=self.get_ik_control_chain(), ik_extra_ctrls=self.get_extra_ik_controls(), rig_name=rig_name ) def add_ik_only_buttons(self, panel, rig_name): ctrl = self.bones.ctrl - ik_chain = self.get_ik_output_chain() + ik_chain, fk_chain = self.get_ik_fk_position_chains() add_limb_toggle_pole( panel, master=ctrl.master, ik_bones=ik_chain, - ik_ctrl_bones=[ctrl.ik_base, ctrl.ik, ctrl.ik_pole], + ik_ctrl_bones=self.get_ik_control_chain(), ik_extra_ctrls=self.get_extra_ik_controls(), ) @@ -560,35 +608,35 @@ class BaseLimbRig(BaseRig): mch = self.bones.mch input_bone = self.get_ik_input_bone() - self.rig_ik_mch_stretch_bone(mch.ik_stretch, input_bone) - self.rig_ik_mch_target_bone(mch.ik_target, mch.ik_stretch, input_bone) + self.rig_ik_mch_stretch_bones(mch.ik_target, mch.ik_stretch, 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_bone(self, mch_stretch, input_bone): - self.make_constraint(mch_stretch, 'STRETCH_TO', input_bone, head_tail=self.ik_input_head_tail, keep_axis='SWING_Y') + def rig_ik_mch_stretch_bones(self, mch_target, mch_stretch, 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') - con = self.make_constraint(mch_stretch, 'LIMIT_SCALE', min_y=0.0, max_y=1.05, owner_space='LOCAL') + con = self.make_constraint(mch_stretch, 'LIMIT_SCALE', min_y=0.0, max_y=len_scale*bias, owner_space='LOCAL') self.make_driver(con, "influence", variables=[(self.prop_bone, 'IK_Stretch')], polynomial=[1.0, -1.0]) - def rig_ik_mch_target_bone(self, mch_target, mch_stretch, input_bone): + # 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): - bone = self.get_bone(mch_ik) - bone.ik_stretch = 0.1 - - bone.lock_ik_x = bone.lock_ik_y = bone.lock_ik_z = True - setattr(bone, 'lock_ik_' + self.main_axis, False) - + 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=2, + mch_ik, 'IK', mch_target, chain_count=chain, ) self.make_driver(con, "mute", variables=[(self.prop_bone, 'pole_vector')], polynomial=[0.0, 1.0]) con_pole = self.make_constraint( - mch_ik, 'IK', mch_target, chain_count=2, + mch_ik, 'IK', mch_target, chain_count=chain, pole_target=self.obj, pole_subtarget=ctrl_pole, pole_angle=self.pole_angle, ) @@ -901,26 +949,32 @@ class RigifyLimbIk2FkBase: if use_pole: match_pole_target( context.view_layer, - ik_bones[0], ik_bones[1], ctrl_bones[2], matrices[0], + ik_bones[0], ik_bones[1], ctrl_bones[1], matrices[0], (ik_bones[0].length + ik_bones[1].length) ) else: - correct_rotation(context.view_layer, ctrl_bones[0], matrices[0]) + correct_rotation(context.view_layer, ik_bones[0], matrices[0], ctrl_ik=ctrl_bones[0]) + + def assign_middle_controls(self, context, obj, matrices, ik_bones, ctrl_bones, *, lock=False, keyflags=None): + for mat, ik, ctrl in reversed(list(zip(matrices[2:-1], ik_bones[2:-1], ctrl_bones[2:-1]))): + ctrl.bone.use_inherit_rotation = not lock + ctrl.bone.inherit_scale = 'NONE' if lock else 'FULL' + context.view_layer.update() + mat = convert_pose_matrix_via_rest_delta(mat, ik, ctrl) + set_transform_from_matrix(obj, ctrl.name, mat, keyflags=keyflags) def apply_frame_state(self, context, obj, 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 ] - use_pole = len(ctrl_bones) > 2 and self.get_use_pole(obj) + use_pole = self.get_use_pole(obj) # Set the end control position - tgt_matrix = ik_bones[2].bone.matrix_local - ctrl_matrix = ctrl_bones[1].bone.matrix_local - endmat = matrices[2] @ tgt_matrix.inverted() @ ctrl_matrix + endmat = convert_pose_matrix_via_rest_delta(matrices[-1], ik_bones[-1], ctrl_bones[-1]) set_transform_from_matrix( - obj, self.ctrl_bone_list[1], endmat, keyflags=self.keyflags + obj, self.ctrl_bone_list[-1], endmat, keyflags=self.keyflags ) # Remove foot heel transform, if present @@ -937,15 +991,22 @@ class RigifyLimbIk2FkBase: no_scale=True, no_rot=use_pole, ) + # Lock middle control transforms (first pass) + self.assign_middle_controls(context, obj, matrices, ik_bones, ctrl_bones, lock=True) + + # Adjust the base bone state self.compute_base_rotation(context, ik_bones, ctrl_bones, matrices, use_pole) - correct_scale(context.view_layer, ctrl_bones[0], matrices[0]) + correct_scale(context.view_layer, ik_bones[0], matrices[0], ctrl_ik=ctrl_bones[0]) + + # Assign middle control transforms (final pass) + self.assign_middle_controls(context, obj, matrices, ik_bones, ctrl_bones, keyflags=self.keyflags) # Keyframe controls if self.keyflags is not None: if use_pole: keyframe_transform_properties( - obj, self.ctrl_bone_list[2], self.keyflags, + obj, self.ctrl_bone_list[1], self.keyflags, no_rot=True, no_scale=True, ) @@ -1015,11 +1076,17 @@ class RigifyLimbTogglePoleBase(RigifyLimbIk2FkBase): keyflags=self.keyflags_switch ) + # Lock middle control transforms + self.assign_middle_controls(context, obj, matrices, ik_bones, ctrl_bones, lock=True) + # Reset the base bone rotation set_pose_rotation(ctrl_bones[0], Matrix.Identity(4)) self.compute_base_rotation(context, ik_bones, ctrl_bones, matrices, self.use_pole) + # Assign middle control transforms (final pass) + self.assign_middle_controls(context, obj, matrices, ik_bones, ctrl_bones, keyflags=self.keyflags) + # Keyframe controls if self.keyflags is not None: if self.use_pole: diff --git a/rigify/rigs/limbs/paw.py b/rigify/rigs/limbs/paw.py index 4f6acaa8..7f9fcfe5 100644 --- a/rigify/rigs/limbs/paw.py +++ b/rigify/rigs/limbs/paw.py @@ -23,6 +23,7 @@ import bpy from ...utils.bones import compute_chain_x_axis, align_bone_x_axis, align_bone_z_axis from ...utils.bones import align_bone_to_axis, flip_bone from ...utils.naming import make_derived_name +from ...utils.widgets_basic import create_circle_widget, create_limb_widget from ..widgets import create_foot_widget, create_ballsocket_widget @@ -32,13 +33,19 @@ from .limb_rigs import BaseLimbRig class Rig(BaseLimbRig): - """Paw rig.""" + """Paw rig with an optional second heel control.""" segmented_orgs = 3 + min_valid_orgs = 4 + max_valid_orgs = 5 + toe_bone_index = 3 def initialize(self): - if len(self.bones.org.main) != 4: - self.raise_error("Input to rig type must be a chain of 4 bones.") + self.use_heel2 = len(self.bones.org.main) > 4 + + if self.use_heel2: + self.toe_bone_index = 4 + self.fk_name_suffix_cutoff = 3 super().initialize() @@ -61,6 +68,20 @@ class Rig(BaseLimbRig): align_bone_z_axis(self.obj, orgs[2], foot_x) align_bone_z_axis(self.obj, orgs[3], -foot_x) + #################################################### + # Utilities + + def align_ik_control_bone(self, name): + if self.params.rotation_axis == 'automatic' or self.params.auto_align_extremity: + align_bone_to_axis(self.obj, name, 'y', flip=True) + + else: + flip_bone(self.obj, name) + + bone = self.get_bone(name) + bone.tail[2] = bone.head[2] + bone.roll = 0 + #################################################### # EXTRA BONES @@ -68,32 +89,35 @@ class Rig(BaseLimbRig): # ctrl: # heel: # Foot heel control + # heel2 (optional): + # Second foot heel control # mch: # toe_socket: # IK toe orientation bone. + # ik_heel2 (optional): + # Final position of heel2 in the IK output. # #################################################### #################################################### # IK controls + def get_middle_ik_controls(self): + return [self.bones.ctrl.heel] if self.use_heel2 else [] + def get_extra_ik_controls(self): - return super().get_extra_ik_controls() + [self.bones.ctrl.heel] + extra = [self.bones.ctrl.heel2] if self.use_heel2 else [self.bones.ctrl.heel] + return super().get_extra_ik_controls() + extra def make_ik_control_bone(self, orgs): - name = self.copy_bone(orgs[3], make_derived_name(orgs[2], 'ctrl', '_ik')) + return self.make_paw_ik_control_bone(orgs[-2], orgs[-1], orgs[2]) - if self.params.rotation_axis == 'automatic' or self.params.auto_align_extremity: - align_bone_to_axis(self.obj, name, 'y', flip=True) + def make_paw_ik_control_bone(self, org_one, org_two, org_name): + name = self.copy_bone(org_two, make_derived_name(org_name, 'ctrl', '_ik')) - else: - flip_bone(self.obj, name) + self.align_ik_control_bone(name) - bone = self.get_bone(name) - bone.tail[2] = bone.head[2] - bone.roll = 0 - - vec = self.get_bone(orgs[3]).tail - self.get_bone(orgs[2]).head + vec = self.get_bone(org_two).tail - self.get_bone(org_one).head self.get_bone(name).length = self.vector_without_z(vec).length return name @@ -120,13 +144,15 @@ class Rig(BaseLimbRig): @stage.parent_bones def parent_heel_control_bone(self): - self.set_bone_parent(self.bones.ctrl.heel, self.get_ik_control_output()) + if self.use_heel2: + self.set_bone_parent(self.bones.ctrl.heel, self.bones.ctrl.heel2) + else: + self.set_bone_parent(self.bones.ctrl.heel, self.get_ik_control_output()) @stage.configure_bones def configure_heel_control_bone(self): bone = self.get_bone(self.bones.ctrl.heel) bone.lock_location = True, True, True - bone.lock_scale = True, True, True @stage.generate_widgets def generate_heel_control_widget(self): @@ -134,23 +160,67 @@ class Rig(BaseLimbRig): #################################################### + # Second Heel control + + @stage.generate_bones + def make_heel2_control_bone(self): + if self.use_heel2: + org = self.bones.org.main[3] + name = self.copy_bone(org, make_derived_name(org, 'ctrl', '_ik')) + self.bones.ctrl.heel2 = name + + flip_bone(self.obj, name) + + @stage.parent_bones + def parent_heel2_control_bone(self): + if self.use_heel2: + self.set_bone_parent(self.bones.ctrl.heel2, self.get_ik_control_output()) + + @stage.configure_bones + def configure_heel2_control_bone(self): + if self.use_heel2: + bone = self.get_bone(self.bones.ctrl.heel2) + bone.lock_location = True, True, True + + @stage.generate_widgets + def generate_heel2_control_widget(self): + if self.use_heel2: + create_ballsocket_widget(self.obj, self.bones.ctrl.heel2) + + + #################################################### + # FK control chain + + def make_fk_control_widget(self, i, ctrl): + if i < self.toe_bone_index - 1: + create_limb_widget(self.obj, ctrl) + elif i == self.toe_bone_index - 1: + create_circle_widget(self.obj, ctrl, radius=0.4, head_tail=0.0) + else: + create_circle_widget(self.obj, ctrl, radius=0.4, head_tail=0.5) + + + #################################################### # FK parents MCH chain @stage.generate_bones def make_toe_socket_bone(self): - org = self.bones.org.main[3] + org = self.bones.org.main[self.toe_bone_index] self.bones.mch.toe_socket = self.copy_bone(org, make_derived_name(org, 'mch', '_ik_socket')) + @stage.parent_bones + def parent_toe_socket_bone(self): + self.set_bone_parent(self.bones.mch.toe_socket, self.get_ik_control_output()) + def parent_fk_parent_bone(self, i, parent_mch, prev_ctrl, org, prev_org): - if i == 3: + if i == self.toe_bone_index: self.set_bone_parent(parent_mch, prev_org, use_connect=True) - self.set_bone_parent(self.bones.mch.toe_socket, self.get_ik_control_output()) else: super().parent_fk_parent_bone(i, parent_mch, prev_ctrl, org, prev_org) def rig_fk_parent_bone(self, i, parent_mch, org): - if i == 3: + if i == self.toe_bone_index: con = self.make_constraint(parent_mch, 'COPY_TRANSFORMS', self.bones.mch.toe_socket) self.make_driver(con, 'influence', variables=[(self.prop_bone, 'IK_FK')], polynomial=[1.0, -1.0]) @@ -175,6 +245,30 @@ class Rig(BaseLimbRig): #################################################### + # IK heel2 output + + def get_ik_output_chain(self): + tail = [self.bones.mch.ik_heel2] if self.use_heel2 else [] + return super().get_ik_output_chain() + tail + + @stage.generate_bones + def make_ik_heel2_bone(self): + if self.use_heel2: + orgs = self.bones.org.main + self.bones.mch.ik_heel2 = self.copy_bone(orgs[3], make_derived_name(orgs[3], 'mch', '_ik_out')) + + @stage.parent_bones + def parent_ik_heel2_bone(self): + if self.use_heel2: + self.set_bone_parent(self.bones.mch.ik_heel2, self.bones.ctrl.heel2) + + @stage.rig_bones + def rig_ik_heel2_bone(self): + if self.use_heel2: + self.make_constraint(self.bones.mch.ik_heel2, 'COPY_LOCATION', self.bones.mch.ik_target, head_tail=1) + + + #################################################### # Deform chain def rig_deform_bone(self, i, deform, entry, next_entry, tweak, next_tweak): @@ -284,3 +378,5 @@ def create_sample(obj): bone.select_head = True bone.select_tail = True arm.edit_bones.active = bone + + return bones diff --git a/rigify/rigs/limbs/rear_paw.py b/rigify/rigs/limbs/rear_paw.py index 2d6894e1..5c1bf5c8 100644 --- a/rigify/rigs/limbs/rear_paw.py +++ b/rigify/rigs/limbs/rear_paw.py @@ -1,300 +1,194 @@ +#====================== BEGIN GPL LICENSE BLOCK ====================== +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +#======================= END GPL LICENSE BLOCK ======================== + +# <pep8 compliant> + import bpy -from .paw import Rig as pawRig +from ...utils.bones import align_bone_roll +from ...utils.naming import make_derived_name +from ...utils.misc import map_list + +from itertools import count +from ...base_rig import stage -IMPLEMENTATION = True # Include and set True if Rig is just an implementation for a wrapper class - # add_parameters and parameters_ui are unused for implementation classes +from .limb_rigs import BaseLimbRig +from .paw import Rig as pawRig, create_sample as create_paw_sample class Rig(pawRig): - pass + """Rear paw rig with special IK automation.""" + + #################################################### + # EXTRA BONES + # + # mch: + # ik2_stretch, ik2_target + # Three bone IK stretch limit + # ik2_chain[2] + # Second IK system (pre-driving thigh and ik3) + # ik3_chain[2] + # Third IK system (pre-driving heel) + # + #################################################### + + #################################################### + # IK controls + + def get_middle_ik_controls(self): + return [self.bones.ctrl.heel] + + def get_ik_fk_position_chains(self): + ik_chain, fk_chain = super().get_ik_fk_position_chains() + if not self.use_heel2: + return [*ik_chain, ik_chain[-1]], [*fk_chain, fk_chain[-1]] + return ik_chain, fk_chain + + def get_extra_ik_controls(self): + extra = [self.bones.ctrl.heel2] if self.use_heel2 else [] + return BaseLimbRig.get_extra_ik_controls(self) + extra + + def get_ik_pole_parents(self): + return [(self.bones.mch.ik2_target, self.bones.ctrl.ik)] + + + #################################################### + # Heel control + + @stage.parent_bones + def parent_heel_control_bone(self): + self.set_bone_parent(self.bones.ctrl.heel, self.bones.mch.ik3_chain[-1]) + + + #################################################### + # Second IK system (pre-driving thigh) + + use_mch_ik_base = True + + def get_ik2_input_bone(self): + return self.bones.ctrl.heel2 if self.use_heel2 else self.bones.mch.toe_socket + + @stage.generate_bones + 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) + + @stage.generate_bones + def make_ik2_mch_chain(self): + orgs = self.bones.org.main + chain = map_list(self.make_ik2_mch_bone, count(0), orgs[0:2]) + self.bones.mch.ik2_chain = chain + + org_bones = map_list(self.get_bone, orgs) + chain_bones = map_list(self.get_bone, chain) + + # Extend the base IK control (used in the ik2 chain) with the projected length of org2 + chain_bones[0].length += org_bones[2].vector.dot(chain_bones[0].vector.normalized()) + chain_bones[1].head = chain_bones[0].tail + chain_bones[1].tail = org_bones[2].tail + align_bone_roll(self.obj, chain[1], orgs[1]) + + def make_ik2_mch_bone(self, i, org): + return self.copy_bone(org, make_derived_name(org, 'mch', '_ik2')) + + @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) + + @stage.configure_bones + def configure_ik2_mch_chain(self): + for i, mch in enumerate(self.bones.mch.ik2_chain): + self.configure_ik2_mch_bone(i, mch) + + def configure_ik2_mch_bone(self, i, mch): + bone = self.get_bone(mch) + bone.ik_stretch = 0.1 + if i == 1: + bone.lock_ik_x = bone.lock_ik_y = bone.lock_ik_z = True + setattr(bone, 'lock_ik_' + self.main_axis, False) + + @stage.rig_bones + def rig_ik2_mch_chain(self): + mch = self.bones.mch + 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_end_bone(mch.ik2_chain[-1], mch.ik2_target, self.bones.ctrl.ik_pole) + + + #################################################### + # Third IK system (pre-driving heel control) + + @stage.generate_bones + def make_ik3_mch_chain(self): + self.bones.mch.ik3_chain = map_list(self.make_ik3_mch_bone, count(0), self.bones.org.main[1:3]) + + def make_ik3_mch_bone(self, i, org): + return self.copy_bone(org, make_derived_name(org, 'mch', '_ik3')) + + @stage.parent_bones + def parent_ik3_mch_chain(self): + mch = self.bones.mch + + self.set_bone_parent(mch.ik3_chain[0], mch.ik2_chain[0]) + self.parent_bone_chain(mch.ik3_chain, use_connect=True) + + @stage.configure_bones + def configure_ik3_mch_chain(self): + for i, mch in enumerate(self.bones.mch.ik3_chain): + self.configure_ik3_mch_bone(i, mch) + + def configure_ik3_mch_bone(self, i, mch): + bone = self.get_bone(mch) + bone.ik_stretch = 0.1 + if i == 0: + bone.lock_ik_x = bone.lock_ik_y = bone.lock_ik_z = True + setattr(bone, 'lock_ik_' + self.main_axis, False) + + @stage.rig_bones + def rig_ik3_mch_chain(self): + mch = self.bones.mch + # Mostly cancel ik2 scaling. + self.make_constraint( + mch.ik3_chain[0], 'COPY_SCALE', self.bones.ctrl.ik_base, + use_make_uniform=True, influence=0.75, + ) + self.make_constraint(mch.ik3_chain[-1], 'IK', mch.ik2_target, chain_count=2) def create_sample(obj): - # generated by rigify.utils.write_metarig - bpy.ops.object.mode_set(mode='EDIT') - arm = obj.data - - bones = {} - - bone = arm.edit_bones.new('thigh.L') - bone.head[:] = 0.0291, 0.1181, 0.2460 - bone.tail[:] = 0.0293, 0.1107, 0.1682 - bone.roll = 3.1383 - bone.use_connect = False - bones['thigh.L'] = bone.name - bone = arm.edit_bones.new('shin.L') - bone.head[:] = 0.0293, 0.1107, 0.1682 - bone.tail[:] = 0.0293, 0.1684, 0.1073 - bone.roll = 3.1416 - bone.use_connect = True - bone.parent = arm.edit_bones[bones['thigh.L']] - bones['shin.L'] = bone.name - bone = arm.edit_bones.new('foot.L') - bone.head[:] = 0.0293, 0.1684, 0.1073 - bone.tail[:] = 0.0293, 0.1530, 0.0167 - bone.roll = 3.1416 - bone.use_connect = True - bone.parent = arm.edit_bones[bones['shin.L']] - bones['foot.L'] = bone.name - bone = arm.edit_bones.new('r_toe.L') - bone.head[:] = 0.0293, 0.1530, 0.0167 - bone.tail[:] = 0.0293, 0.1224, 0.0167 - bone.roll = 0.0000 - bone.use_connect = True - bone.parent = arm.edit_bones[bones['foot.L']] - bones['r_toe.L'] = bone.name - bone = arm.edit_bones.new('r_palm.001.L') - bone.head[:] = 0.0220, 0.1457, 0.0123 - bone.tail[:] = 0.0215, 0.1401, 0.0123 - bone.roll = 0.0014 - bone.use_connect = False - bone.parent = arm.edit_bones[bones['r_toe.L']] - bones['r_palm.001.L'] = bone.name - bone = arm.edit_bones.new('r_palm.002.L') - bone.head[:] = 0.0297, 0.1458, 0.0123 - bone.tail[:] = 0.0311, 0.1393, 0.0123 - bone.roll = -0.0005 - bone.use_connect = False - bone.parent = arm.edit_bones[bones['r_toe.L']] - bones['r_palm.002.L'] = bone.name - bone = arm.edit_bones.new('r_palm.003.L') - bone.head[:] = 0.0363, 0.1473, 0.0123 - bone.tail[:] = 0.0376, 0.1407, 0.0123 - bone.roll = 0.0000 - bone.use_connect = False - bone.parent = arm.edit_bones[bones['r_toe.L']] - bones['r_palm.003.L'] = bone.name - bone = arm.edit_bones.new('r_palm.004.L') - bone.head[:] = 0.0449, 0.1501, 0.0123 - bone.tail[:] = 0.0466, 0.1479, 0.0123 - bone.roll = -0.0004 - bone.use_connect = False - bone.parent = arm.edit_bones[bones['r_toe.L']] - bones['r_palm.004.L'] = bone.name - bone = arm.edit_bones.new('r_index.001.L') - bone.head[:] = 0.0215, 0.1367, 0.0087 - bone.tail[:] = 0.0217, 0.1325, 0.0070 - bone.roll = -0.3427 - bone.use_connect = False - bone.parent = arm.edit_bones[bones['r_palm.001.L']] - bones['r_index.001.L'] = bone.name - bone = arm.edit_bones.new('r_middle.001.L') - bone.head[:] = 0.0311, 0.1358, 0.0117 - bone.tail[:] = 0.0324, 0.1297, 0.0092 - bone.roll = -1.0029 - bone.use_connect = False - bone.parent = arm.edit_bones[bones['r_palm.002.L']] - bones['r_middle.001.L'] = bone.name - bone = arm.edit_bones.new('r_ring.001.L') - bone.head[:] = 0.0376, 0.1372, 0.0117 - bone.tail[:] = 0.0389, 0.1311, 0.0092 - bone.roll = -1.0029 - bone.use_connect = False - bone.parent = arm.edit_bones[bones['r_palm.003.L']] - bones['r_ring.001.L'] = bone.name - bone = arm.edit_bones.new('r_pinky.001.L') - bone.head[:] = 0.0466, 0.1444, 0.0083 - bone.tail[:] = 0.0476, 0.1412, 0.0074 - bone.roll = -1.7551 - bone.use_connect = False - bone.parent = arm.edit_bones[bones['r_palm.004.L']] - bones['r_pinky.001.L'] = bone.name - bone = arm.edit_bones.new('r_index.002.L') - bone.head[:] = 0.0217, 0.1325, 0.0070 - bone.tail[:] = 0.0221, 0.1271, 0.0038 - bone.roll = -0.2465 - bone.use_connect = True - bone.parent = arm.edit_bones[bones['r_index.001.L']] - bones['r_index.002.L'] = bone.name - bone = arm.edit_bones.new('r_middle.002.L') - bone.head[:] = 0.0324, 0.1297, 0.0092 - bone.tail[:] = 0.0343, 0.1210, 0.0039 - bone.roll = -0.7479 - bone.use_connect = True - bone.parent = arm.edit_bones[bones['r_middle.001.L']] - bones['r_middle.002.L'] = bone.name - bone = arm.edit_bones.new('r_ring.002.L') - bone.head[:] = 0.0389, 0.1311, 0.0092 - bone.tail[:] = 0.0407, 0.1229, 0.0042 - bone.roll = -0.7479 - bone.use_connect = True - bone.parent = arm.edit_bones[bones['r_ring.001.L']] - bones['r_ring.002.L'] = bone.name - bone = arm.edit_bones.new('r_pinky.002.L') - bone.head[:] = 0.0476, 0.1412, 0.0074 - bone.tail[:] = 0.0494, 0.1351, 0.0032 - bone.roll = -0.8965 - bone.use_connect = True - bone.parent = arm.edit_bones[bones['r_pinky.001.L']] - bones['r_pinky.002.L'] = bone.name - - bpy.ops.object.mode_set(mode='OBJECT') + bones = create_paw_sample(obj) pbone = obj.pose.bones[bones['thigh.L']] - pbone.rigify_type = 'limbs.paw' - pbone.lock_location = (False, False, False) - pbone.lock_rotation = (False, False, False) - pbone.lock_rotation_w = False - pbone.lock_scale = (False, False, False) - pbone.rotation_mode = 'QUATERNION' - try: - pbone.rigify_parameters.limb_type = "paw" - except AttributeError: - pass - try: - pbone.rigify_parameters.fk_layers = [False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] - except AttributeError: - pass - try: - pbone.rigify_parameters.tweak_layers = [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] - except AttributeError: - pass - try: - pbone.rigify_parameters.segments = 2 - except AttributeError: - pass - pbone = obj.pose.bones[bones['shin.L']] - pbone.rigify_type = '' - pbone.lock_location = (False, False, False) - pbone.lock_rotation = (False, False, False) - pbone.lock_rotation_w = False - pbone.lock_scale = (False, False, False) - pbone.rotation_mode = 'QUATERNION' - pbone = obj.pose.bones[bones['foot.L']] - pbone.rigify_type = '' - pbone.lock_location = (False, False, False) - pbone.lock_rotation = (False, False, False) - pbone.lock_rotation_w = False - pbone.lock_scale = (False, False, False) - pbone.rotation_mode = 'QUATERNION' - pbone = obj.pose.bones[bones['r_toe.L']] - pbone.rigify_type = '' - pbone.lock_location = (False, False, False) - pbone.lock_rotation = (False, False, False) - pbone.lock_rotation_w = False - pbone.lock_scale = (False, False, False) - pbone.rotation_mode = 'QUATERNION' - pbone = obj.pose.bones[bones['r_palm.001.L']] - pbone.rigify_type = 'limbs.super_palm' - pbone.lock_location = (False, False, False) - pbone.lock_rotation = (False, False, False) - pbone.lock_rotation_w = False - pbone.lock_scale = (False, False, False) - pbone.rotation_mode = 'QUATERNION' - pbone = obj.pose.bones[bones['r_palm.002.L']] - pbone.rigify_type = '' - pbone.lock_location = (False, False, False) - pbone.lock_rotation = (False, False, False) - pbone.lock_rotation_w = False - pbone.lock_scale = (False, False, False) - pbone.rotation_mode = 'QUATERNION' - pbone = obj.pose.bones[bones['r_palm.003.L']] - pbone.rigify_type = '' - pbone.lock_location = (False, False, False) - pbone.lock_rotation = (False, False, False) - pbone.lock_rotation_w = False - pbone.lock_scale = (False, False, False) - pbone.rotation_mode = 'QUATERNION' - pbone = obj.pose.bones[bones['r_palm.004.L']] - pbone.rigify_type = 'limbs.super_palm' - pbone.lock_location = (False, False, False) - pbone.lock_rotation = (False, False, False) - pbone.lock_rotation_w = False - pbone.lock_scale = (False, False, False) - pbone.rotation_mode = 'QUATERNION' - pbone = obj.pose.bones[bones['r_index.001.L']] - pbone.rigify_type = 'limbs.simple_tentacle' - pbone.lock_location = (False, False, False) - pbone.lock_rotation = (False, False, False) - pbone.lock_rotation_w = False - pbone.lock_scale = (False, False, False) - pbone.rotation_mode = 'QUATERNION' - try: - pbone.rigify_parameters.tweak_layers = [False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] - except AttributeError: - pass - pbone = obj.pose.bones[bones['r_middle.001.L']] - pbone.rigify_type = 'limbs.simple_tentacle' - pbone.lock_location = (False, False, False) - pbone.lock_rotation = (False, False, False) - pbone.lock_rotation_w = False - pbone.lock_scale = (False, False, False) - pbone.rotation_mode = 'QUATERNION' - try: - pbone.rigify_parameters.tweak_layers = [False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] - except AttributeError: - pass - pbone = obj.pose.bones[bones['r_ring.001.L']] - pbone.rigify_type = 'limbs.simple_tentacle' - pbone.lock_location = (False, False, False) - pbone.lock_rotation = (False, False, False) - pbone.lock_rotation_w = False - pbone.lock_scale = (False, False, False) - pbone.rotation_mode = 'QUATERNION' - try: - pbone.rigify_parameters.tweak_layers = [False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] - except AttributeError: - pass - pbone = obj.pose.bones[bones['r_pinky.001.L']] - pbone.rigify_type = 'limbs.simple_tentacle' - pbone.lock_location = (False, False, False) - pbone.lock_rotation = (False, False, False) - pbone.lock_rotation_w = False - pbone.lock_scale = (False, False, False) - pbone.rotation_mode = 'QUATERNION' - try: - pbone.rigify_parameters.tweak_layers = [False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] - except AttributeError: - pass - pbone = obj.pose.bones[bones['r_index.002.L']] - pbone.rigify_type = '' - pbone.lock_location = (False, False, False) - pbone.lock_rotation = (False, False, False) - pbone.lock_rotation_w = False - pbone.lock_scale = (False, False, False) - pbone.rotation_mode = 'QUATERNION' - pbone = obj.pose.bones[bones['r_middle.002.L']] - pbone.rigify_type = '' - pbone.lock_location = (False, False, False) - pbone.lock_rotation = (False, False, False) - pbone.lock_rotation_w = False - pbone.lock_scale = (False, False, False) - pbone.rotation_mode = 'QUATERNION' - pbone = obj.pose.bones[bones['r_ring.002.L']] - pbone.rigify_type = '' - pbone.lock_location = (False, False, False) - pbone.lock_rotation = (False, False, False) - pbone.lock_rotation_w = False - pbone.lock_scale = (False, False, False) - pbone.rotation_mode = 'QUATERNION' - pbone = obj.pose.bones[bones['r_pinky.002.L']] - pbone.rigify_type = '' - pbone.lock_location = (False, False, False) - pbone.lock_rotation = (False, False, False) - pbone.lock_rotation_w = False - pbone.lock_scale = (False, False, False) - pbone.rotation_mode = 'QUATERNION' - - bpy.ops.object.mode_set(mode='EDIT') - for bone in arm.edit_bones: - bone.select = False - bone.select_head = False - bone.select_tail = False - for b in bones: - bone = arm.edit_bones[bones[b]] - bone.select = True - bone.select_head = True - bone.select_tail = True - arm.edit_bones.active = bone - - for eb in arm.edit_bones: - if ('thigh' in eb.name) or ('shin' in eb.name) or ('foot' in eb.name) or ('toe' in eb.name): - eb.layers = (False, False, False, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False) - else: - eb.layers = (False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False) - arm.layers = (False, False, False, False, False, True, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False) - - -if __name__ == "__main__": - create_sample(bpy.context.active_object) + pbone.rigify_type = 'limbs.rear_paw' + return bones diff --git a/rigify/utils/bones.py b/rigify/utils/bones.py index f0341a8f..f0e5e388 100644 --- a/rigify/utils/bones.py +++ b/rigify/utils/bones.py @@ -659,13 +659,15 @@ def align_bone_to_axis(obj, bone_name, axis, *, length=None, roll=0, flip=False) bone_e.roll = roll -def set_bone_widget_transform(obj, bone_name, transform_bone, use_size=True, scale=1.0): +def set_bone_widget_transform(obj, bone_name, transform_bone, use_size=True, scale=1.0, target_size=False): assert obj.mode != 'EDIT' bone = obj.pose.bones[bone_name] if transform_bone and transform_bone != bone_name: - bone.custom_shape_transform = obj.pose.bones[transform_bone] + bone.custom_shape_transform = bone2 = obj.pose.bones[transform_bone] + if use_size and target_size: + scale *= bone2.length / bone.length else: bone.custom_shape_transform = None |