def connect(self, avar, avar_grp, ud=True, fb=True, lr=True, yw=True, pt=True, rl=True, sx=True, sy=True, sz=True): need_flip = avar.need_flip_lr() # Position if ud: attr_inn_ud = self.ctrl.translateY libRigging.connectAttr_withBlendWeighted(attr_inn_ud, avar.attr_ud) if lr: attr_inn_lr = self.ctrl.translateX if need_flip: attr_inn_lr = libRigging.create_utility_node('multiplyDivide', input1X=attr_inn_lr, input2X=-1).outputX libRigging.connectAttr_withBlendWeighted(attr_inn_lr, avar.attr_lr) if fb: attr_inn_fb = self.ctrl.translateZ libRigging.connectAttr_withBlendWeighted(attr_inn_fb, avar.attr_fb) # Rotation if yw: attr_inn_yw = self.ctrl.rotateY if need_flip: attr_inn_yw = libRigging.create_utility_node('multiplyDivide', input1X=attr_inn_yw, input2X=-1).outputX libRigging.connectAttr_withBlendWeighted(attr_inn_yw, avar.attr_yw) if pt: attr_inn_pt = self.ctrl.rotateX libRigging.connectAttr_withBlendWeighted(attr_inn_pt, avar.attr_pt) if rl: attr_inn_rl = self.ctrl.rotateZ if need_flip: attr_inn_rl = libRigging.create_utility_node('multiplyDivide', input1X=attr_inn_rl, input2X=-1).outputX libRigging.connectAttr_withBlendWeighted(attr_inn_rl, avar.attr_rl) # Scale if sx: attr_inn = self.ctrl.scaleX libRigging.connectAttr_withBlendWeighted(attr_inn, avar.attr_sx) if sy: attr_inn = self.ctrl.scaleY libRigging.connectAttr_withBlendWeighted(attr_inn, avar.attr_sy) if sz: attr_inn = self.ctrl.scaleZ libRigging.connectAttr_withBlendWeighted(attr_inn, avar.attr_sz)
def connect_global_avars(self): for avar in self.avars: # HACK: Ignore nose bend pivot if avar == self.avar_nose_upp: continue libRigging.connectAttr_withBlendWeighted(self.attr_ud, avar.attr_ud) libRigging.connectAttr_withBlendWeighted(self.attr_lr, avar.attr_lr) libRigging.connectAttr_withBlendWeighted(self.attr_fb, avar.attr_fb) libRigging.connectAttr_withBlendWeighted(self.attr_yw, avar.attr_yw) libRigging.connectAttr_withBlendWeighted(self.attr_pt, avar.attr_pt) libRigging.connectAttr_withBlendWeighted(self.attr_rl, avar.attr_rl)
def connect(self, avar, ud=True, fb=True, lr=True, yw=True, pt=True, rl=True, sx=True, sy=True, sz=True): libRigging.connectAttr_withBlendWeighted(self._attr_out_lr, avar.attr_lr) libRigging.connectAttr_withBlendWeighted(self._attr_out_ud, avar.attr_ud) libRigging.connectAttr_withBlendWeighted(self._attr_out_fb, avar.attr_fb) libRigging.connectAttr_withBlendWeighted(self._attr_out_yw, avar.attr_yw) libRigging.connectAttr_withBlendWeighted(self._attr_out_pt, avar.attr_pt) libRigging.connectAttr_withBlendWeighted(self._attr_out_rl, avar.attr_rl)
def build_stack(self, stack, aim_target=None, **kwargs): nomenclature_rig = self.get_nomenclature_rig() # Build an aim node in-place for performance # This separated node allow the joints to be driven by the avars. aim_grp_name = nomenclature_rig.resolve('lookgrp') aim_grp = pymel.createNode('transform', name=aim_grp_name) aim_node_name = nomenclature_rig.resolve('looknode') aim_node = pymel.createNode('transform', name=aim_node_name) aim_node.setParent(aim_grp) aim_target_name = nomenclature_rig.resolve('target') aim_target = pymel.createNode('transform', name=aim_target_name) aim_target.setParent(aim_grp) self.target = aim_target # Build an upnode for the eyes. # I'm not a fan of upnodes but in this case it's better to guessing the joint orient. aim_upnode_name = nomenclature_rig.resolve('upnode') aim_upnode = pymel.createNode('transform', name=aim_upnode_name) # aim_upnode.setParent(self.grp_rig) pymel.parentConstraint(aim_grp, aim_upnode, maintainOffset=True) pymel.aimConstraint(aim_target, aim_node, maintainOffset=True, aimVector=(0.0, 0.0, 1.0), upVector=(0.0, 1.0, 0.0), worldUpObject=aim_upnode, worldUpType='object') # Position objects aim_grp.setParent(self._grp_offset) # todo: add begin , end property aim_grp.t.set(0, 0, 0) aim_grp.r.set(0, 0, 0) jnt_tm = self.jnt.getMatrix(worldSpace=True) jnt_pos = jnt_tm.translate aim_upnode_pos = pymel.datatypes.Point(0, 1, 0) + jnt_pos aim_upnode.setTranslation(aim_upnode_pos, space='world') aim_target_pos = pymel.datatypes.Point(0, 0, 1) + jnt_pos aim_target.setTranslation(aim_target_pos, space='world') pymel.parentConstraint(aim_node, stack, maintainOffset=True) # Convert the rotation to avars to additional values can be added. util_decomposeMatrix = libRigging.create_utility_node( 'decomposeMatrix', inputMatrix=aim_node.matrix) libRigging.connectAttr_withBlendWeighted( util_decomposeMatrix.outputTranslateX, self.attr_lr) libRigging.connectAttr_withBlendWeighted( util_decomposeMatrix.outputTranslateY, self.attr_ud) libRigging.connectAttr_withBlendWeighted( util_decomposeMatrix.outputTranslateZ, self.attr_fb) libRigging.connectAttr_withBlendWeighted( util_decomposeMatrix.outputRotateY, self.attr_yw) libRigging.connectAttr_withBlendWeighted( util_decomposeMatrix.outputRotateX, self.attr_pt) libRigging.connectAttr_withBlendWeighted( util_decomposeMatrix.outputRotateZ, self.attr_rl)
def _connect_ctrl(self, ctrl, attr_ud=None, attr_lr=None, attr_fb=None, attr_yw=None, attr_pt=None, attr_rl=None): need_flip = self.need_flip_lr() if attr_ud: attr_inn_ud = ctrl.translateY libRigging.connectAttr_withBlendWeighted(attr_inn_ud, attr_ud) if attr_lr: attr_inn_lr = ctrl.translateX if need_flip: attr_inn_lr = libRigging.create_utility_node( 'multiplyDivide', input1X=attr_inn_lr, input2X=-1).outputX libRigging.connectAttr_withBlendWeighted(attr_inn_lr, attr_lr) if attr_fb: attr_inn_fb = ctrl.translateZ libRigging.connectAttr_withBlendWeighted(attr_inn_fb, attr_fb) if attr_yw: attr_inn_yw = ctrl.rotateY if need_flip: attr_inn_yw = libRigging.create_utility_node( 'multiplyDivide', input1X=attr_inn_yw, input2X=-1).outputX libRigging.connectAttr_withBlendWeighted(attr_inn_yw, attr_yw) if attr_pt: attr_inn_pt = ctrl.rotateX libRigging.connectAttr_withBlendWeighted(attr_inn_pt, attr_pt) if attr_rl: attr_inn_rl = ctrl.rotateZ if need_flip: attr_inn_rl = libRigging.create_utility_node( 'multiplyDivide', input1X=attr_inn_rl, input2X=-1).outputX libRigging.connectAttr_withBlendWeighted(attr_inn_rl, attr_rl)
def build_stack(self, stack, aim_target=None, **kwargs): nomenclature_rig = self.get_nomenclature_rig() # Build an aim node in-place for performance # This separated node allow the joints to be driven by the avars. aim_grp_name = nomenclature_rig.resolve('lookgrp') aim_grp = pymel.createNode('transform', name=aim_grp_name) aim_node_name = nomenclature_rig.resolve('looknode') aim_node = pymel.createNode('transform', name=aim_node_name) aim_node.setParent(aim_grp) aim_target_name = nomenclature_rig.resolve('target') aim_target = pymel.createNode('transform', name=aim_target_name) aim_target.setParent(aim_grp) self.target = aim_target # Build an upnode for the eyes. # I'm not a fan of upnodes but in this case it's better to guessing the joint orient. aim_upnode_name = nomenclature_rig.resolve('upnode') aim_upnode = pymel.createNode('transform', name=aim_upnode_name) # aim_upnode.setParent(self.grp_rig) pymel.parentConstraint(aim_grp, aim_upnode, maintainOffset=True) pymel.aimConstraint(aim_target, aim_node, maintainOffset=True, aimVector=(0.0, 0.0, 1.0), upVector=(0.0, 1.0, 0.0), worldUpObject=aim_upnode, worldUpType='object' ) # Position objects aim_grp.setParent(self._grp_offset) # todo: add begin , end property aim_grp.t.set(0,0,0) aim_grp.r.set(0,0,0) jnt_tm = self.jnt.getMatrix(worldSpace=True) jnt_pos = jnt_tm.translate aim_upnode_pos = pymel.datatypes.Point(0,1,0) + jnt_pos aim_upnode.setTranslation(aim_upnode_pos, space='world') aim_target_pos = pymel.datatypes.Point(0,0,1) + jnt_pos aim_target.setTranslation(aim_target_pos, space='world') pymel.parentConstraint(aim_node, stack, maintainOffset=True) # Convert the rotation to avars to additional values can be added. util_decomposeMatrix = libRigging.create_utility_node('decomposeMatrix', inputMatrix=aim_node.matrix) libRigging.connectAttr_withBlendWeighted(util_decomposeMatrix.outputTranslateX, self.attr_lr) libRigging.connectAttr_withBlendWeighted(util_decomposeMatrix.outputTranslateY, self.attr_ud) libRigging.connectAttr_withBlendWeighted(util_decomposeMatrix.outputTranslateZ, self.attr_fb) libRigging.connectAttr_withBlendWeighted(util_decomposeMatrix.outputRotateY, self.attr_yw) libRigging.connectAttr_withBlendWeighted(util_decomposeMatrix.outputRotateX, self.attr_pt) libRigging.connectAttr_withBlendWeighted(util_decomposeMatrix.outputRotateZ, self.attr_rl)
def _connect_ctrl(self, ctrl, attr_ud=None, attr_lr=None, attr_fb=None, attr_yw=None, attr_pt=None, attr_rl=None): need_flip = self.need_flip_lr() if attr_ud: attr_inn_ud = ctrl.translateY libRigging.connectAttr_withBlendWeighted(attr_inn_ud, attr_ud) if attr_lr: attr_inn_lr = ctrl.translateX if need_flip: attr_inn_lr = libRigging.create_utility_node('multiplyDivide', input1X=attr_inn_lr, input2X=-1).outputX libRigging.connectAttr_withBlendWeighted(attr_inn_lr, attr_lr) if attr_fb: attr_inn_fb = ctrl.translateZ libRigging.connectAttr_withBlendWeighted(attr_inn_fb, attr_fb) if attr_yw: attr_inn_yw = ctrl.rotateY if need_flip: attr_inn_yw = libRigging.create_utility_node('multiplyDivide', input1X=attr_inn_yw, input2X=-1).outputX libRigging.connectAttr_withBlendWeighted(attr_inn_yw, attr_yw) if attr_pt: attr_inn_pt = ctrl.rotateX libRigging.connectAttr_withBlendWeighted(attr_inn_pt, attr_pt) if attr_rl: attr_inn_rl = ctrl.rotateZ if need_flip: attr_inn_rl = libRigging.create_utility_node('multiplyDivide', input1X=attr_inn_rl, input2X=-1).outputX libRigging.connectAttr_withBlendWeighted(attr_inn_rl, attr_rl)
def connect_global_avars(self): for avar in self.avars: # HACK: Ignore nose bend pivot if avar == self.avar_nose_upp: continue libRigging.connectAttr_withBlendWeighted(self.attr_ud, avar.attr_ud) libRigging.connectAttr_withBlendWeighted(self.attr_lr, avar.attr_lr) libRigging.connectAttr_withBlendWeighted(self.attr_fb, avar.attr_fb) libRigging.connectAttr_withBlendWeighted(self.attr_yw, avar.attr_yw) libRigging.connectAttr_withBlendWeighted(self.attr_pt, avar.attr_pt) libRigging.connectAttr_withBlendWeighted(self.attr_rl, avar.attr_rl)
def connect_global_avars(self): for avar in self.avars: libRigging.connectAttr_withBlendWeighted(self.attr_ud, avar.attr_ud) libRigging.connectAttr_withBlendWeighted(self.attr_lr, avar.attr_lr) libRigging.connectAttr_withBlendWeighted(self.attr_fb, avar.attr_fb) libRigging.connectAttr_withBlendWeighted(self.attr_yw, avar.attr_yw) libRigging.connectAttr_withBlendWeighted(self.attr_pt, avar.attr_pt) libRigging.connectAttr_withBlendWeighted(self.attr_rl, avar.attr_rl)
def connect_global_avars(self): for avar in self.avars: libRigging.connectAttr_withBlendWeighted(self.attr_ud, avar.attr_ud) libRigging.connectAttr_withBlendWeighted(self.attr_lr, avar.attr_lr) libRigging.connectAttr_withBlendWeighted(self.attr_fb, avar.attr_fb) libRigging.connectAttr_withBlendWeighted(self.attr_yw, avar.attr_yw) libRigging.connectAttr_withBlendWeighted(self.attr_pt, avar.attr_pt) libRigging.connectAttr_withBlendWeighted(self.attr_rl, avar.attr_rl)