23
from mathutils import Vector, Matrix
24
from rigify.utils import MetarigError
25
from rigify.utils import copy_bone, put_bone
26
from rigify.utils import connected_children_names
27
from rigify.utils import strip_org, make_mechanism_name, make_deformer_name
30
def align_roll(obj, bone1, bone2):
31
bone1_e = obj.data.edit_bones[bone1]
32
bone2_e = obj.data.edit_bones[bone2]
36
# Get the directions the bones are pointing in, as vectors
42
# Get the shortest axis to rotate bone1 on to point in the same direction as bone2
46
# Angle to rotate on that shortest axis
49
# Create rotation matrix to make bone1 point in the same direction as bone2
50
rot_mat = Matrix.Rotation(angle, 3, axis)
64
# Check if we rolled in the right direction
65
x3 = rot_mat * bone1_e.x_axis
23
from .. import limb_common
25
from ....utils import MetarigError
26
from ....utils import connected_children_names
27
from ....utils import strip_org
92
42
raise MetarigError("RIGIFY ERROR: Bone '%s': input to rig type must be a chain of 3 bones" % (strip_org(bone)))
94
44
# Get rig parameters
95
self.use_upper_arm_twist = params.use_upper_arm_twist
96
self.use_forearm_twist = params.use_forearm_twist
45
if params.separate_hose_layers:
46
layers = list(params.hose_layers)
49
use_complex_rig = params.use_complex_arm
50
elbow_base_name = params.elbow_base_name
51
primary_rotation_axis = params.primary_rotation_axis
53
# Based on common limb
54
self.rubber_hose_limb = limb_common.RubberHoseLimb(obj, self.org_bones[0], self.org_bones[1], self.org_bones[2], use_complex_rig, elbow_base_name, primary_rotation_axis, layers)
98
56
def generate(self):
100
Do NOT modify any of the original bones, except for adding constraints.
101
The main armature should be selected and active before this is called.
104
bpy.ops.object.mode_set(mode='EDIT')
106
# Create upper arm bones
107
if self.use_upper_arm_twist:
108
uarm1 = copy_bone(self.obj, self.org_bones[0], make_deformer_name(strip_org(self.org_bones[0] + ".01")))
109
uarm2 = copy_bone(self.obj, self.org_bones[0], make_deformer_name(strip_org(self.org_bones[0] + ".02")))
110
utip = copy_bone(self.obj, self.org_bones[0], make_mechanism_name(strip_org(self.org_bones[0] + ".tip")))
112
uarm = copy_bone(self.obj, self.org_bones[0], make_deformer_name(strip_org(self.org_bones[0])))
114
# Create forearm bones
115
if self.use_forearm_twist:
116
farm1 = copy_bone(self.obj, self.org_bones[1], make_deformer_name(strip_org(self.org_bones[1] + ".01")))
117
farm2 = copy_bone(self.obj, self.org_bones[1], make_deformer_name(strip_org(self.org_bones[1] + ".02")))
118
ftip = copy_bone(self.obj, self.org_bones[1], make_mechanism_name(strip_org(self.org_bones[1] + ".tip")))
120
farm = copy_bone(self.obj, self.org_bones[1], make_deformer_name(strip_org(self.org_bones[1])))
123
hand = copy_bone(self.obj, self.org_bones[2], make_deformer_name(strip_org(self.org_bones[2])))
126
eb = self.obj.data.edit_bones
128
org_uarm_e = eb[self.org_bones[0]]
129
if self.use_upper_arm_twist:
136
org_farm_e = eb[self.org_bones[1]]
137
if self.use_forearm_twist:
144
org_hand_e = eb[self.org_bones[2]]
147
# Parent and position upper arm bones
148
if self.use_upper_arm_twist:
149
uarm1_e.use_connect = False
150
uarm2_e.use_connect = False
151
utip_e.use_connect = False
153
uarm1_e.parent = org_uarm_e.parent
154
uarm2_e.parent = org_uarm_e
155
utip_e.parent = org_uarm_e
157
center = Vector((org_uarm_e.head + org_uarm_e.tail) / 2)
159
uarm1_e.tail = center
160
uarm2_e.head = center
161
put_bone(self.obj, utip, org_uarm_e.tail)
162
utip_e.length = org_uarm_e.length / 8
164
uarm_e.use_connect = False
165
uarm_e.parent = org_uarm_e
167
# Parent and position forearm bones
168
if self.use_forearm_twist:
169
farm1_e.use_connect = False
170
farm2_e.use_connect = False
171
ftip_e.use_connect = False
173
farm1_e.parent = org_farm_e
174
farm2_e.parent = org_farm_e
175
ftip_e.parent = org_farm_e
177
center = Vector((org_farm_e.head + org_farm_e.tail) / 2)
179
farm1_e.tail = center
180
farm2_e.head = center
181
put_bone(self.obj, ftip, org_farm_e.tail)
182
ftip_e.length = org_farm_e.length / 8
184
# Align roll of farm2 with hand
185
align_roll(self.obj, farm2, hand)
187
farm_e.use_connect = False
188
farm_e.parent = org_farm_e
191
hand_e.use_connect = False
192
hand_e.parent = org_hand_e
194
# Object mode, get pose bones
195
bpy.ops.object.mode_set(mode='OBJECT')
196
pb = self.obj.pose.bones
198
if self.use_upper_arm_twist:
200
if self.use_forearm_twist:
202
# hand_p = pb[hand] # UNUSED
204
# Upper arm constraints
205
if self.use_upper_arm_twist:
206
con = uarm1_p.constraints.new('COPY_LOCATION')
207
con.name = "copy_location"
208
con.target = self.obj
209
con.subtarget = self.org_bones[0]
211
con = uarm1_p.constraints.new('COPY_SCALE')
212
con.name = "copy_scale"
213
con.target = self.obj
214
con.subtarget = self.org_bones[0]
216
con = uarm1_p.constraints.new('DAMPED_TRACK')
217
con.name = "track_to"
218
con.target = self.obj
221
# Forearm constraints
222
if self.use_forearm_twist:
223
con = farm2_p.constraints.new('COPY_ROTATION')
224
con.name = "copy_rotation"
225
con.target = self.obj
228
con = farm2_p.constraints.new('DAMPED_TRACK')
229
con.name = "track_to"
230
con.target = self.obj
57
bone_list = self.rubber_hose_limb.generate()