def __init__(self, name='Clavicle', parent=None): Profiler.getInstance().push("Construct Clavicle Rig Component:" + name) super(FabriceClavicleRig, self).__init__(name, parent) # ========= # Controls # ========= # Clavicle self.clavicleCtrlSpace = CtrlSpace('clavicle', parent=self.ctrlCmpGrp) self.clavicleCtrl = Control('clavicle', parent=self.clavicleCtrlSpace, shape="cube") self.clavicleCtrl.alignOnXAxis() # ========== # Deformers # ========== deformersLayer = self.getOrCreateLayer('deformers') defCmpGrp = ComponentGroup(self.getName(), self, parent=deformersLayer) self.ctrlCmpGrp.setComponent(self) self.clavicleDef = Joint('clavicle', parent=defCmpGrp) self.clavicleDef.setComponent(self) # ============== # Constrain I/O # ============== # Constraint inputs clavicleInputConstraint = PoseConstraint('_'.join([self.clavicleCtrl.getName(), 'To', self.spineEndInputTgt.getName()])) clavicleInputConstraint.setMaintainOffset(True) clavicleInputConstraint.addConstrainer(self.spineEndInputTgt) self.clavicleCtrlSpace.addConstraint(clavicleInputConstraint) # Constraint outputs clavicleConstraint = PoseConstraint('_'.join([self.clavicleOutputTgt.getName(), 'To', self.clavicleCtrl.getName()])) clavicleConstraint.addConstrainer(self.clavicleCtrl) self.clavicleOutputTgt.addConstraint(clavicleConstraint) # =============== # Add Splice Ops # =============== # Add Deformer Splice Op spliceOp = KLOperator('clavicleDeformerKLOp', 'PoseConstraintSolver', 'Kraken') self.addOperator(spliceOp) # Add Att Inputs spliceOp.setInput('drawDebug', self.drawDebugInputAttr) spliceOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Inputs spliceOp.setInput('constrainer', self.clavicleOutputTgt) # Add Xfo Outputs spliceOp.setOutput('constrainee', self.clavicleDef) Profiler.getInstance().pop()
def __init__(self, name='Hand', parent=None): Profiler.getInstance().push("Construct Hand Rig Component:" + name) super(HandComponentRig, self).__init__(name, parent) # ========= # Controls # ========= # Hand self.handCtrlSpace = CtrlSpace('hand', parent=self.ctrlCmpGrp) self.handCtrl = Control('hand', parent=self.handCtrlSpace, shape="square") self.handCtrl.rotatePoints(0, 0, 90.0) self.handCtrl.lockScale(True, True, True) self.handCtrl.lockTranslation(True, True, True) # ========== # Deformers # ========== self.deformersLayer = self.getOrCreateLayer('deformers') self.defCmpGrp = ComponentGroup(self.getName(), self, parent=self.deformersLayer) self.addItem('defCmpGrp', self.defCmpGrp) self.handDef = Joint('hand', parent=self.defCmpGrp) self.handDef.setComponent(self) # ============== # Constrain I/O # ============== # Constraint inputs self.armEndInputConstraint = PoseConstraint('_'.join([self.handCtrlSpace.getName(), 'To', self.armEndInputTgt.getName()])) self.armEndInputConstraint.setMaintainOffset(True) self.armEndInputConstraint.addConstrainer(self.armEndInputTgt) self.handCtrlSpace.addConstraint(self.armEndInputConstraint) # Constraint outputs self.handOutputConstraint = PoseConstraint('_'.join([self.handOutputTgt.getName(), 'To', self.handCtrl.getName()])) self.handOutputConstraint.addConstrainer(self.handCtrl) self.handOutputTgt.addConstraint(self.handOutputConstraint) # Constraint deformers self.handDefConstraint = PoseConstraint('_'.join([self.handDef.getName(), 'To', self.handCtrl.getName()])) self.handDefConstraint.addConstrainer(self.handCtrl) self.handDef.addConstraint(self.handDefConstraint) Profiler.getInstance().pop()
def buildXfoConnection(self, kConnection): """Builds the connection between the xfo and the connection. Arguments: kConnection -- Object, kraken connection to build. Return: True if successful. """ source = kConnection.getSource() target = kConnection.getTarget() if source is None or target is None: raise Exception("Component connection '" + kConnection.getName() + "'is invalid! Missing Source or Target!") constraint = PoseConstraint('_'.join([target.getName(), 'To', source.getName()])) constraint.setMaintainOffset(True) constraint.setConstrainee(target) constraint.addConstrainer(source) dccSceneItem = self.buildPoseConstraint(constraint) self._registerSceneItemPair(kConnection, dccSceneItem) return None
def buildXfoConnection(self, componentInput): """Builds the constraint between the target and connection target. Args: componentInput (object): kraken component input to build connections for. Returns: bool: True if successful. """ if componentInput.isConnected() is False: return False connection = componentInput.getConnection() connectionTarget = connection.getTarget() inputTarget = componentInput.getTarget() if connection.getDataType().endswith('[]'): if componentInput.getIndex() > len(connection.getTarget()) - 1: inputParent = componentInput.getParent() inputParentDecoration = inputParent.getNameDecoration() fullInputName = inputParent.getName() + inputParentDecoration + "." + componentInput.getName() raise Exception(fullInputName + " index (" + str(componentInput.getIndex()) + ") is out of range (" + str(len(connection.getTarget()) - 1) + ")!") connectionTarget = connection.getTarget()[componentInput.getIndex()] else: connectionTarget = connection.getTarget() constraint = PoseConstraint('_'.join([inputTarget.getName(), 'To', connectionTarget.getName()])) constraint.setMaintainOffset(True) constraint.setConstrainee(inputTarget) constraint.addConstrainer(connectionTarget) dccSceneItem = self.buildPoseConstraint(constraint) self._registerSceneItemPair(componentInput, dccSceneItem) return True
def __init__(self, name='leg', parent=None): Profiler.getInstance().push("Construct Leg Rig Component:" + name) super(LegComponentRig, self).__init__(name, parent) # ========= # Controls # ========= # Femur self.femurFKCtrlSpace = CtrlSpace('femurFK', parent=self.ctrlCmpGrp) self.femurFKCtrl = Control('femurFK', parent=self.femurFKCtrlSpace, shape="cube") self.femurFKCtrl.alignOnXAxis() # Shin self.shinFKCtrlSpace = CtrlSpace('shinFK', parent=self.femurFKCtrl) self.shinFKCtrl = Control('shinFK', parent=self.shinFKCtrlSpace, shape="cube") self.shinFKCtrl.alignOnXAxis() # Ankle self.legIKCtrlSpace = CtrlSpace('IK', parent=self.ctrlCmpGrp) self.legIKCtrl = Control('IK', parent=self.legIKCtrlSpace, shape="pin") # FK Foot self.footCtrlSpace = CtrlSpace('foot', parent=self.ctrlCmpGrp) self.footCtrl = Control('foot', parent=self.footCtrlSpace, shape="cube") self.footCtrl.alignOnXAxis() # FK Toe self.toeCtrlSpace = CtrlSpace('toe', parent=self.footCtrl) self.toeCtrl = Control('toe', parent=self.toeCtrlSpace, shape="cube") self.toeCtrl.alignOnXAxis() # Rig Ref objects self.footRefSrt = Locator('footRef', parent=self.ctrlCmpGrp) # Add Component Params to IK control footSettingsAttrGrp = AttributeGroup("DisplayInfo_FootSettings", parent=self.footCtrl) footLinkToWorldInputAttr = ScalarAttribute('linkToWorld', 1.0, maxValue=1.0, parent=footSettingsAttrGrp) # Add Component Params to IK control legSettingsAttrGrp = AttributeGroup("DisplayInfo_LegSettings", parent=self.legIKCtrl) legDrawDebugInputAttr = BoolAttribute('drawDebug', value=False, parent=legSettingsAttrGrp) self.legBone0LenInputAttr = ScalarAttribute('bone0Len', value=1.0, parent=legSettingsAttrGrp) self.legBone1LenInputAttr = ScalarAttribute('bone1Len', value=1.0, parent=legSettingsAttrGrp) legIKBlendInputAttr = ScalarAttribute('ikblend', value=1.0, minValue=0.0, maxValue=1.0, parent=legSettingsAttrGrp) legSoftIKInputAttr = BoolAttribute('softIK', value=True, parent=legSettingsAttrGrp) legSoftDistInputAttr = ScalarAttribute('softDist', value=0.0, minValue=0.0, parent=legSettingsAttrGrp) legStretchInputAttr = BoolAttribute('stretch', value=True, parent=legSettingsAttrGrp) legStretchBlendInputAttr = ScalarAttribute('stretchBlend', value=0.0, minValue=0.0, maxValue=1.0, parent=legSettingsAttrGrp) self.drawDebugInputAttr.connect(legDrawDebugInputAttr) # UpV self.legUpVCtrlSpace = CtrlSpace('UpV', parent=self.ctrlCmpGrp) self.legUpVCtrl = Control('UpV', parent=self.legUpVCtrlSpace, shape="triangle") self.legUpVCtrl.alignOnZAxis() # ========== # Deformers # ========== deformersLayer = self.getOrCreateLayer('deformers') self.defCmpGrp = ComponentGroup(self.getName(), self, parent=deformersLayer) femurDef = Joint('femur', parent=self.defCmpGrp) femurDef.setComponent(self) shinDef = Joint('shin', parent=self.defCmpGrp) shinDef.setComponent(self) ankleDef = Joint('ankle', parent=self.defCmpGrp) ankleDef.setComponent(self) self.footDef = Joint('foot', parent=self.defCmpGrp) self.footDef.setComponent(self) self.toeDef = Joint('toe', parent=self.defCmpGrp) self.toeDef.setComponent(self) # ============== # Constrain I/O # ============== # Constraint inputs self.legIKCtrlSpaceInputConstraint = PoseConstraint('_'.join([self.legIKCtrlSpace.getName(), 'To', self.globalSRTInputTgt.getName()])) self.legIKCtrlSpaceInputConstraint.setMaintainOffset(True) self.legIKCtrlSpaceInputConstraint.addConstrainer(self.globalSRTInputTgt) self.legIKCtrlSpace.addConstraint(self.legIKCtrlSpaceInputConstraint) self.legUpVCtrlSpaceInputConstraint = PoseConstraint('_'.join([self.legUpVCtrlSpace.getName(), 'To', self.globalSRTInputTgt.getName()])) self.legUpVCtrlSpaceInputConstraint.setMaintainOffset(True) self.legUpVCtrlSpaceInputConstraint.addConstrainer(self.globalSRTInputTgt) self.legUpVCtrlSpace.addConstraint(self.legUpVCtrlSpaceInputConstraint) self.legRootInputConstraint = PoseConstraint('_'.join([self.legIKCtrl.getName(), 'To', self.legPelvisInputTgt.getName()])) self.legRootInputConstraint.setMaintainOffset(True) self.legRootInputConstraint.addConstrainer(self.legPelvisInputTgt) self.femurFKCtrlSpace.addConstraint(self.legRootInputConstraint) # Constraint outputs self.footOutputConstraint = PoseConstraint('_'.join([self.footOutputTgt.getName(), 'To', self.footCtrl.getName()])) self.footOutputConstraint.addConstrainer(self.footCtrl) self.footOutputTgt.addConstraint(self.footOutputConstraint) self.footCtrlSpaceConstraint = PoseConstraint('_'.join([self.footCtrlSpace.getName(), 'To', self.legEndXfoOutputTgt.getName()])) self.footCtrlSpaceConstraint.setMaintainOffset(True) self.footCtrlSpaceConstraint.addConstrainer(self.legEndXfoOutputTgt) self.footCtrlSpace.addConstraint(self.footCtrlSpaceConstraint) self.toeOutputConstraint = PoseConstraint('_'.join([self.toeOutputTgt.getName(), 'To', self.toeCtrl.getName()])) self.toeOutputConstraint.addConstrainer(self.toeCtrl) self.toeOutputTgt.addConstraint(self.toeOutputConstraint) # =============== # Add Splice Ops # =============== # Add Leg Splice Op self.legIKKLOp = KLOperator('legKLOp', 'TwoBoneIKSolver', 'Kraken') self.addOperator(self.legIKKLOp) # Add Att Inputs self.legIKKLOp.setInput('drawDebug', self.drawDebugInputAttr) self.legIKKLOp.setInput('rigScale', self.rigScaleInputAttr) self.legIKKLOp.setInput('bone0Len', self.legBone0LenInputAttr) self.legIKKLOp.setInput('bone1Len', self.legBone1LenInputAttr) self.legIKKLOp.setInput('ikblend', legIKBlendInputAttr) self.legIKKLOp.setInput('softIK', legSoftIKInputAttr) self.legIKKLOp.setInput('softDist', legSoftDistInputAttr) self.legIKKLOp.setInput('stretch', legStretchInputAttr) self.legIKKLOp.setInput('stretchBlend', legStretchBlendInputAttr) self.legIKKLOp.setInput('rightSide', self.rightSideInputAttr) # Add Xfo Inputs self.legIKKLOp.setInput('root', self.legPelvisInputTgt) self.legIKKLOp.setInput('bone0FK', self.femurFKCtrl) self.legIKKLOp.setInput('bone1FK', self.shinFKCtrl) self.legIKKLOp.setInput('ikHandle', self.legIKCtrl) self.legIKKLOp.setInput('upV', self.legUpVCtrl) # Add Xfo Outputs self.legIKKLOp.setOutput('bone0Out', self.femurOutputTgt) self.legIKKLOp.setOutput('bone1Out', self.shinOutputTgt) self.legIKKLOp.setOutput('bone2Out', self.legEndXfoOutputTgt) # Add Leg Deformer Splice Op self.outputsToDeformersKLOp = KLOperator('legDeformerKLOp', 'MultiPoseConstraintSolver', 'Kraken') self.addOperator(self.outputsToDeformersKLOp) # Add Att Inputs self.outputsToDeformersKLOp.setInput('drawDebug', self.drawDebugInputAttr) self.outputsToDeformersKLOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Inputs self.outputsToDeformersKLOp.setInput('constrainers', [self.femurOutputTgt, self.shinOutputTgt, self.legEndXfoOutputTgt]) # Add Xfo Outputs self.outputsToDeformersKLOp.setOutput('constrainees', [femurDef, shinDef, ankleDef]) # Add Foot Deformer Splice Op self.footDefKLOp = KLOperator('footDeformerKLOp', 'PoseConstraintSolver', 'Kraken') self.addOperator(self.footDefKLOp) # Add Att Inputs self.footDefKLOp.setInput('drawDebug', self.drawDebugInputAttr) self.footDefKLOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Inputs) self.footDefKLOp.setInput('constrainer', self.footOutputTgt) # Add Xfo Outputs self.footDefKLOp.setOutput('constrainee', self.footDef) # Add Toe Deformer Splice Op self.toeDefKLOp = KLOperator('toeDeformerKLOp', 'PoseConstraintSolver', 'Kraken') self.addOperator(self.toeDefKLOp) # Add Att Inputs self.toeDefKLOp.setInput('drawDebug', self.drawDebugInputAttr) self.toeDefKLOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Inputs self.toeDefKLOp.setInput('constrainer', self.toeOutputTgt) # Add Xfo Outputs self.toeDefKLOp.setOutput('constrainee', self.toeDef) Profiler.getInstance().pop()
def __init__(self, name='FKCollision', parent=None): Profiler.getInstance().push("Construct FK Collision Rig Component:" + name) super(FKCollisionComponentRig, self).__init__(name, parent) # ========= # Controls # ========= # Ground self.groundCtrl = Control('ground', parent=self.ctrlCmpGrp, shape='square') self.groundCtrl.insertCtrlSpace() groundSettingsAttrGrp = AttributeGroup("DisplayInfo_ChainSettings", parent=self.groundCtrl) self.groundOffsetYInputAttr = ScalarAttribute( 'ground_offsetY', 0.0, minValue=0.0, maxValue=10.0, parent=groundSettingsAttrGrp) # FK self.fkCtrlSpaces = [] self.fkCtrls = [] self.transforms = [] self.setNumControls(4) self.setNumTransforms(4) # Add Component Params to FK control chainSettingsAttrGrp = AttributeGroup("DisplayInfo_ChainSettings", parent=self.fkCtrls[0]) chainDrawDebugInputAttr = BoolAttribute('drawDebug', value=False, parent=chainSettingsAttrGrp) # Connect IO to controls self.drawDebugInputAttr.connect(chainDrawDebugInputAttr) # ========== # Deformers # ========== deformersLayer = self.getOrCreateLayer('deformers') self.defCmpGrp = ComponentGroup(self.getName(), self, parent=deformersLayer) self.addItem('defCmpGrp', self.defCmpGrp) self.deformerJoints = [] self.boneOutputsTgt = [] self.setNumDeformers(4) # ===================== # Create Component I/O # ===================== # Set IO Targets self.boneOutputs.setTarget(self.boneOutputsTgt) # ============== # Constrain I/O # ============== # Constrain inputs self.rootInputConstraint = PoseConstraint('_'.join([ self.fkCtrlSpaces[0].getName(), 'To', self.rootInputTgt.getName() ])) self.rootInputConstraint.setMaintainOffset(True) self.rootInputConstraint.addConstrainer(self.rootInputTgt) self.fkCtrlSpaces[0].addConstraint(self.rootInputConstraint) # =============== # Add Canvas Ops # =============== # Add Output Canvas Op self.collisionCanvasOp = CanvasOperator( 'collisionCanvasOp', 'Kraken.Solvers.CollideChainSolver') self.addOperator(self.collisionCanvasOp) # Add Att Inputs self.collisionCanvasOp.setInput('drawDebug', self.drawDebugInputAttr) self.collisionCanvasOp.setInput('rigScale', self.rigScaleInputAttr) self.collisionCanvasOp.setInput('ground_offsetY', self.groundOffsetYInputAttr) # Add Xfo Inputs self.collisionCanvasOp.setInput('ground', self.groundCtrl) self.collisionCanvasOp.setInput('joints', self.transforms) # Add Xfo Outputs self.collisionCanvasOp.setOutput('outputs', self.boneOutputsTgt) # Add Deformer Canvas Op self.deformersToOutputsKLOp = KLOperator('fkChainDeformerKLOp', 'MultiPoseConstraintSolver', 'Kraken') self.addOperator(self.deformersToOutputsKLOp) # Add Att Inputs self.deformersToOutputsKLOp.setInput('drawDebug', False) self.deformersToOutputsKLOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Inputs self.deformersToOutputsKLOp.setInput('constrainers', self.boneOutputsTgt) # Add Xfo Outputs self.deformersToOutputsKLOp.setOutput('constrainees', self.deformerJoints) Profiler.getInstance().pop()
def __init__(self, name='leg', parent=None): Profiler.getInstance().push("Construct Leg Rig Component:" + name) super(LegComponentRig, self).__init__(name, parent) # ========= # Controls # ========= # Femur self.femurFKCtrlSpace = CtrlSpace('femurFK', parent=self.ctrlCmpGrp) self.femurFKCtrl = Control('femurFK', parent=self.femurFKCtrlSpace, shape="cube") self.femurFKCtrl.alignOnXAxis() # Shin self.shinFKCtrlSpace = CtrlSpace('shinFK', parent=self.femurFKCtrl) self.shinFKCtrl = Control('shinFK', parent=self.shinFKCtrlSpace, shape="cube") self.shinFKCtrl.alignOnXAxis() # Ankle self.legIKCtrlSpace = CtrlSpace('IK', parent=self.ctrlCmpGrp) self.legIKCtrl = Control('IK', parent=self.legIKCtrlSpace, shape="pin") # FK Foot self.footCtrlSpace = CtrlSpace('foot', parent=self.ctrlCmpGrp) self.footCtrl = Control('foot', parent=self.footCtrlSpace, shape="cube") self.footCtrl.alignOnXAxis() # FK Toe self.toeCtrlSpace = CtrlSpace('toe', parent=self.footCtrl) self.toeCtrl = Control('toe', parent=self.toeCtrlSpace, shape="cube") self.toeCtrl.alignOnXAxis() # Rig Ref objects self.footRefSrt = Locator('footRef', parent=self.ctrlCmpGrp) # Add Component Params to IK control footSettingsAttrGrp = AttributeGroup("DisplayInfo_FootSettings", parent=self.footCtrl) footLinkToWorldInputAttr = ScalarAttribute('linkToWorld', 1.0, maxValue=1.0, parent=footSettingsAttrGrp) # Add Component Params to IK control legSettingsAttrGrp = AttributeGroup("DisplayInfo_LegSettings", parent=self.legIKCtrl) legDrawDebugInputAttr = BoolAttribute('drawDebug', value=False, parent=legSettingsAttrGrp) self.legBone0LenInputAttr = ScalarAttribute('bone0Len', value=1.0, parent=legSettingsAttrGrp) self.legBone1LenInputAttr = ScalarAttribute('bone1Len', value=1.0, parent=legSettingsAttrGrp) legIKBlendInputAttr = ScalarAttribute('ikblend', value=1.0, minValue=0.0, maxValue=1.0, parent=legSettingsAttrGrp) legSoftIKInputAttr = BoolAttribute('softIK', value=True, parent=legSettingsAttrGrp) legSoftDistInputAttr = ScalarAttribute('softDist', value=0.0, minValue=0.0, parent=legSettingsAttrGrp) legStretchInputAttr = BoolAttribute('stretch', value=True, parent=legSettingsAttrGrp) legStretchBlendInputAttr = ScalarAttribute('stretchBlend', value=0.0, minValue=0.0, maxValue=1.0, parent=legSettingsAttrGrp) self.drawDebugInputAttr.connect(legDrawDebugInputAttr) # UpV self.legUpVCtrlSpace = CtrlSpace('UpV', parent=self.ctrlCmpGrp) self.legUpVCtrl = Control('UpV', parent=self.legUpVCtrlSpace, shape="triangle") self.legUpVCtrl.alignOnZAxis() # ========== # Deformers # ========== deformersLayer = self.getOrCreateLayer('deformers') self.defCmpGrp = ComponentGroup(self.getName(), self, parent=deformersLayer) femurDef = Joint('femur', parent=self.defCmpGrp) femurDef.setComponent(self) shinDef = Joint('shin', parent=self.defCmpGrp) shinDef.setComponent(self) ankleDef = Joint('ankle', parent=self.defCmpGrp) ankleDef.setComponent(self) self.footDef = Joint('foot', parent=self.defCmpGrp) self.footDef.setComponent(self) self.toeDef = Joint('toe', parent=self.defCmpGrp) self.toeDef.setComponent(self) # ============== # Constrain I/O # ============== # Constraint inputs self.legIKCtrlSpaceInputConstraint = PoseConstraint('_'.join([self.legIKCtrlSpace.getName(), 'To', self.globalSRTInputTgt.getName()])) self.legIKCtrlSpaceInputConstraint.setMaintainOffset(True) self.legIKCtrlSpaceInputConstraint.addConstrainer(self.globalSRTInputTgt) self.legIKCtrlSpace.addConstraint(self.legIKCtrlSpaceInputConstraint) self.legUpVCtrlSpaceInputConstraint = PoseConstraint('_'.join([self.legUpVCtrlSpace.getName(), 'To', self.globalSRTInputTgt.getName()])) self.legUpVCtrlSpaceInputConstraint.setMaintainOffset(True) self.legUpVCtrlSpaceInputConstraint.addConstrainer(self.globalSRTInputTgt) self.legUpVCtrlSpace.addConstraint(self.legUpVCtrlSpaceInputConstraint) self.legRootInputConstraint = PoseConstraint('_'.join([self.legIKCtrl.getName(), 'To', self.legPelvisInputTgt.getName()])) self.legRootInputConstraint.setMaintainOffset(True) self.legRootInputConstraint.addConstrainer(self.legPelvisInputTgt) self.femurFKCtrlSpace.addConstraint(self.legRootInputConstraint) # Constraint outputs self.footOutputConstraint = PoseConstraint('_'.join([self.footOutputTgt.getName(), 'To', self.footCtrl.getName()])) self.footOutputConstraint.addConstrainer(self.footCtrl) self.footOutputTgt.addConstraint(self.footOutputConstraint) self.toeOutputConstraint = PoseConstraint('_'.join([self.toeOutputTgt.getName(), 'To', self.toeCtrl.getName()])) self.toeOutputConstraint.addConstrainer(self.toeCtrl) self.toeOutputTgt.addConstraint(self.toeOutputConstraint) # =============== # Add Splice Ops # =============== # Add Leg Splice Op self.legIKSpliceOp = SpliceOperator('legSpliceOp', 'TwoBoneIKSolver', 'Kraken') self.addOperator(self.legIKSpliceOp) # Add Att Inputs self.legIKSpliceOp.setInput('drawDebug', self.drawDebugInputAttr) self.legIKSpliceOp.setInput('rigScale', self.rigScaleInputAttr) self.legIKSpliceOp.setInput('bone0Len', self.legBone0LenInputAttr) self.legIKSpliceOp.setInput('bone1Len', self.legBone1LenInputAttr) self.legIKSpliceOp.setInput('ikblend', legIKBlendInputAttr) self.legIKSpliceOp.setInput('softIK', legSoftIKInputAttr) self.legIKSpliceOp.setInput('softDist', legSoftDistInputAttr) self.legIKSpliceOp.setInput('stretch', legStretchInputAttr) self.legIKSpliceOp.setInput('stretchBlend', legStretchBlendInputAttr) self.legIKSpliceOp.setInput('rightSide', self.rightSideInputAttr) # Add Xfo Inputs self.legIKSpliceOp.setInput('root', self.legPelvisInputTgt) self.legIKSpliceOp.setInput('bone0FK', self.femurFKCtrl) self.legIKSpliceOp.setInput('bone1FK', self.shinFKCtrl) self.legIKSpliceOp.setInput('ikHandle', self.legIKCtrl) self.legIKSpliceOp.setInput('upV', self.legUpVCtrl) # Add Xfo Outputs self.legIKSpliceOp.setOutput('bone0Out', self.femurOutputTgt) self.legIKSpliceOp.setOutput('bone1Out', self.shinOutputTgt) self.legIKSpliceOp.setOutput('bone2Out', self.legEndXfoOutputTgt) # Add Leg Deformer Splice Op self.outputsToDeformersSpliceOp = SpliceOperator('legDeformerSpliceOp', 'MultiPoseConstraintSolver', 'Kraken') self.addOperator(self.outputsToDeformersSpliceOp) # Add Att Inputs self.outputsToDeformersSpliceOp.setInput('drawDebug', self.drawDebugInputAttr) self.outputsToDeformersSpliceOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Inputs self.outputsToDeformersSpliceOp.setInput('constrainers', [self.femurOutputTgt, self.shinOutputTgt, self.legEndXfoOutputTgt]) # Add Xfo Outputs self.outputsToDeformersSpliceOp.setOutput('constrainees', [femurDef, shinDef, ankleDef]) # Add Foot Deformer Splice Op self.footDefSpliceOp = SpliceOperator('footDeformerSpliceOp', 'PoseConstraintSolver', 'Kraken') self.addOperator(self.footDefSpliceOp) # Add Att Inputs self.footDefSpliceOp.setInput('drawDebug', self.drawDebugInputAttr) self.footDefSpliceOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Inputs) self.footDefSpliceOp.setInput('constrainer', self.footOutputTgt) # Add Xfo Outputs self.footDefSpliceOp.setOutput('constrainee', self.footDef) # Add Toe Deformer Splice Op self.toeDefSpliceOp = SpliceOperator('toeDeformerSpliceOp', 'PoseConstraintSolver', 'Kraken') self.addOperator(self.toeDefSpliceOp) # Add Att Inputs self.toeDefSpliceOp.setInput('drawDebug', self.drawDebugInputAttr) self.toeDefSpliceOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Inputs self.toeDefSpliceOp.setInput('constrainer', self.toeOutputTgt) # Add Xfo Outputs self.toeDefSpliceOp.setOutput('constrainee', self.toeDef) Profiler.getInstance().pop()
def __init__(self, name="foot", parent=None): Profiler.getInstance().push("Construct Neck Rig Component:" + name) super(FootComponentRig, self).__init__(name, parent) # ========= # Controls # ========= self.ankleLenInputAttr = ScalarAttribute('ankleLen', 1.0, maxValue=1.0, parent=self.cmpInputAttrGrp) self.toeLenInputAttr = ScalarAttribute('toeLen', 1.0, maxValue=1.0, parent=self.cmpInputAttrGrp) self.rightSideInputAttr = BoolAttribute('rightSide', False, parent=self.cmpInputAttrGrp) self.footAll = Locator('footAll', parent=self.ctrlCmpGrp) self.footAll.setShapeVisibility(False) self.ankleIKCtrlSpace = CtrlSpace('ankleIK', parent=self.footAll) self.ankleIKCtrl = Control('ankleIK', parent=self.ankleIKCtrlSpace, shape="square") self.ankleIKCtrl.alignOnXAxis(negative=True) self.ankleIKCtrl.lockTranslation(True, True, True) self.ankleIKCtrl.lockScale(True, True, True) self.toeIKCtrlSpace = CtrlSpace('toeIK', parent=self.footAll) self.toeIKCtrl = Control('toeIK', parent=self.toeIKCtrlSpace, shape="square") self.toeIKCtrl.alignOnXAxis() self.toeIKCtrl.lockTranslation(True, True, True) self.toeIKCtrl.lockScale(True, True, True) self.ankleFKCtrlSpace = CtrlSpace('ankleFK', parent=self.ctrlCmpGrp) self.ankleFKCtrl = Control('ankleFK', parent=self.ankleFKCtrlSpace, shape="cube") self.ankleFKCtrl.alignOnXAxis() self.ankleFKCtrl.lockTranslation(True, True, True) self.ankleFKCtrl.lockScale(True, True, True) self.toeFKCtrlSpace = CtrlSpace('toeFK', parent=self.ankleFKCtrl) self.toeFKCtrl = Control('toeFK', parent=self.toeFKCtrlSpace, shape="cube") self.toeFKCtrl.alignOnXAxis() self.toeFKCtrl.lockTranslation(True, True, True) self.toeFKCtrl.lockScale(True, True, True) self.footSettingsAttrGrp = AttributeGroup("DisplayInfo_FootSettings", parent=self.ankleIKCtrl) self.footDebugInputAttr = BoolAttribute('drawDebug', value=False, parent=self.footSettingsAttrGrp) self.footRockInputAttr = ScalarAttribute('footRock', value=0.0, minValue=-1.0, maxValue=1.0, parent=self.footSettingsAttrGrp) self.footBankInputAttr = ScalarAttribute('footBank', value=0.0, minValue=-1.0, maxValue=1.0, parent=self.footSettingsAttrGrp) self.drawDebugInputAttr.connect(self.footDebugInputAttr) self.pivotAll = Locator('pivotAll', parent=self.ctrlCmpGrp) self.pivotAll.setShapeVisibility(False) self.backPivotCtrl = Control('backPivot', parent=self.pivotAll, shape="axesHalfTarget") self.backPivotCtrl.scalePoints(Vec3(0.5, 0.5, 0.5)) self.backPivotCtrl.lockScale(True, True, True) self.backPivotCtrlSpace = self.backPivotCtrl.insertCtrlSpace() self.frontPivotCtrl = Control('frontPivot', parent=self.pivotAll, shape="axesHalfTarget") self.frontPivotCtrl.rotatePoints(0.0, 180.0, 0.0) self.frontPivotCtrl.lockScale(True, True, True) self.frontPivotCtrlSpace = self.frontPivotCtrl.insertCtrlSpace() self.frontPivotCtrl.scalePoints(Vec3(0.5, 0.5, 0.5)) self.outerPivotCtrl = Control('outerPivot', parent=self.pivotAll, shape="axesHalfTarget") self.outerPivotCtrl.rotatePoints(0.0, -90.0, 0.0) self.outerPivotCtrl.lockScale(True, True, True) self.outerPivotCtrlSpace = self.outerPivotCtrl.insertCtrlSpace() self.outerPivotCtrl.scalePoints(Vec3(0.5, 0.5, 0.5)) self.innerPivotCtrl = Control('innerPivot', parent=self.pivotAll, shape="axesHalfTarget") self.innerPivotCtrl.rotatePoints(0.0, 90.0, 0.0) self.innerPivotCtrl.lockScale(True, True, True) self.innerPivotCtrlSpace = self.innerPivotCtrl.insertCtrlSpace() self.innerPivotCtrl.scalePoints(Vec3(0.5, 0.5, 0.5)) # ========== # Deformers # ========== deformersLayer = self.getOrCreateLayer('deformers') self.defCmpGrp = ComponentGroup(self.getName(), self, parent=deformersLayer) self.addItem('defCmpGrp', self.defCmpGrp) self.ankleDef = Joint('ankle', parent=self.defCmpGrp) self.ankleDef.setComponent(self) self.toeDef = Joint('toe', parent=self.defCmpGrp) self.toeDef.setComponent(self) # ============== # Constrain I/O # ============== # Constraint to inputs self.pivotAllInputConstraint = PoseConstraint('_'.join([self.pivotAll.getName(), 'To', self.ikHandleInputTgt.getName()])) self.pivotAllInputConstraint.setMaintainOffset(True) self.pivotAllInputConstraint.addConstrainer(self.ikHandleInputTgt) self.pivotAll.addConstraint(self.pivotAllInputConstraint) self.ankleFKInputConstraint = PoseConstraint('_'.join([self.ankleFKCtrlSpace.getName(), 'To', self.legEndFKInputTgt.getName()])) self.ankleFKInputConstraint.setMaintainOffset(True) self.ankleFKInputConstraint.addConstrainer(self.legEndFKInputTgt) self.ankleFKCtrlSpace.addConstraint(self.ankleFKInputConstraint) # Constraint outputs self.ikTargetOutputConstraint = PoseConstraint('_'.join([self.ikTargetOutputTgt.getName(), 'To', self.ankleIKCtrl.getName()])) self.ikTargetOutputConstraint.setMaintainOffset(True) self.ikTargetOutputConstraint.addConstrainer(self.ankleIKCtrl) self.ikTargetOutputTgt.addConstraint(self.ikTargetOutputConstraint) # ========================= # Add Foot Pivot Canvas Op # ========================= # self.footPivotCanvasOp = CanvasOperator('footPivotCanvasOp', 'Kraken.Solvers.Biped.BipedFootPivotSolver') self.footPivotCanvasOp = KLOperator('footPivotKLOp', 'BipedFootPivotSolver', 'Kraken') self.addOperator(self.footPivotCanvasOp) # Add Att Inputs self.footPivotCanvasOp.setInput('drawDebug', self.drawDebugInputAttr) self.footPivotCanvasOp.setInput('rigScale', self.rigScaleInputAttr) self.footPivotCanvasOp.setInput('rightSide', self.rightSideInputAttr) self.footPivotCanvasOp.setInput('footRock', self.footRockInputAttr) self.footPivotCanvasOp.setInput('footBank', self.footBankInputAttr) # Add Xfo Inputs self.footPivotCanvasOp.setInput('pivotAll', self.pivotAll) self.footPivotCanvasOp.setInput('backPivot', self.backPivotCtrl) self.footPivotCanvasOp.setInput('frontPivot', self.frontPivotCtrl) self.footPivotCanvasOp.setInput('outerPivot', self.outerPivotCtrl) self.footPivotCanvasOp.setInput('innerPivot', self.innerPivotCtrl) # Add Xfo Outputs self.footPivotCanvasOp.setOutput('result', self.footAll) # ========================= # Add Foot Solver Canvas Op # ========================= # self.footSolverCanvasOp = CanvasOperator('footSolverCanvasOp', 'Kraken.Solvers.Biped.BipedFootSolver') self.footSolverCanvasOp = KLOperator('footSolverKLOp', 'BipedFootSolver', 'Kraken') self.addOperator(self.footSolverCanvasOp) # Add Att Inputs self.footSolverCanvasOp.setInput('drawDebug', self.drawDebugInputAttr) self.footSolverCanvasOp.setInput('rigScale', self.rigScaleInputAttr) self.footSolverCanvasOp.setInput('ikBlend', self.ikBlendInputAttr) self.footSolverCanvasOp.setInput('ankleLen', self.ankleLenInputAttr) self.footSolverCanvasOp.setInput('toeLen', self.toeLenInputAttr) # Add Xfo Inputs self.footSolverCanvasOp.setInput('legEnd', self.legEndInputTgt) self.footSolverCanvasOp.setInput('ankleIK', self.ankleIKCtrl) self.footSolverCanvasOp.setInput('toeIK', self.toeIKCtrl) self.footSolverCanvasOp.setInput('ankleFK', self.ankleFKCtrl) self.footSolverCanvasOp.setInput('toeFK', self.toeFKCtrl) # Add Xfo Outputs self.footSolverCanvasOp.setOutput('ankle_result', self.ankleOutputTgt) self.footSolverCanvasOp.setOutput('toe_result', self.toeOutputTgt) # =================== # Add Deformer KL Op # =================== self.outputsToDeformersKLOp = KLOperator('foot' + self.getLocation() + 'DeformerKLOp', 'MultiPoseConstraintSolver', 'Kraken') self.addOperator(self.outputsToDeformersKLOp) # Add Att Inputs self.outputsToDeformersKLOp.setInput('drawDebug', self.drawDebugInputAttr) self.outputsToDeformersKLOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Inputs self.outputsToDeformersKLOp.setInput('constrainers', [self.ankleOutputTgt, self.toeOutputTgt]) # Add Xfo Outputs self.outputsToDeformersKLOp.setOutput('constrainees', [self.ankleDef, self.toeDef]) Profiler.getInstance().pop()
def __init__(self, name='Clavicle', parent=None): Profiler.getInstance().push("Construct Clavicle Rig Component:" + name) super(ClavicleComponentRig, self).__init__(name, parent) # ========= # Controls # ========= # Clavicle self.clavicleCtrlSpace = CtrlSpace('clavicle', parent=self.ctrlCmpGrp) self.clavicleCtrl = Control('clavicle', parent=self.clavicleCtrlSpace, shape="cube") self.clavicleCtrl.alignOnXAxis() self.clavicleCtrl.lockTranslation(True, True, True) self.clavicleCtrl.lockScale(True, True, True) # ========== # Deformers # ========== self.deformersLayer = self.getOrCreateLayer('deformers') self.defCmpGrp = ComponentGroup(self.getName(), self, parent=self.deformersLayer) self.addItem('defCmpGrp', self.defCmpGrp) self.clavicleDef = Joint('clavicle', parent=self.defCmpGrp) self.clavicleDef.setComponent(self) # ============== # Constrain I/O # ============== # Constraint inputs self.clavicleInputConstraint = PoseConstraint('_'.join([self.clavicleCtrl.getName(), 'To', self.spineEndInputTgt.getName()])) self.clavicleInputConstraint.setMaintainOffset(True) self.clavicleInputConstraint.addConstrainer(self.spineEndInputTgt) self.clavicleCtrlSpace.addConstraint(self.clavicleInputConstraint) # Constraint outputs self.clavicleConstraint = PoseConstraint('_'.join([self.clavicleOutputTgt.getName(), 'To', self.clavicleCtrl.getName()])) self.clavicleConstraint.addConstrainer(self.clavicleCtrl) self.clavicleOutputTgt.addConstraint(self.clavicleConstraint) self.clavicleEndConstraint = PoseConstraint('_'.join([self.clavicleEndOutputTgt.getName(), 'To', self.clavicleCtrl.getName()])) self.clavicleEndConstraint.setMaintainOffset(True) self.clavicleEndConstraint.addConstrainer(self.clavicleCtrl) self.clavicleEndOutputTgt.addConstraint(self.clavicleEndConstraint) # =============== # Add Canavs Ops # =============== # Add Deformer Canvas Op self.clavicleDefOp = KLOperator('defConstraint', 'PoseConstraintSolver', 'Kraken') self.addOperator(self.clavicleDefOp) # Add Att Inputs self.clavicleDefOp.setInput('drawDebug', self.drawDebugInputAttr) self.clavicleDefOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Inputs self.clavicleDefOp.setInput('constrainer', self.clavicleOutputTgt) # Add Xfo Outputs self.clavicleDefOp.setOutput('constrainee', self.clavicleDef) Profiler.getInstance().pop()
def __init__(self, name='arm', parent=None): Profiler.getInstance().push("Construct Arm Rig Component:" + name) super(ArmComponentRig, self).__init__(name, parent) # ========= # Controls # ========= # Bicep self.bicepFKCtrlSpace = CtrlSpace('bicepFK', parent=self.ctrlCmpGrp) self.bicepFKCtrl = Control('bicepFK', parent=self.bicepFKCtrlSpace, shape="cube") self.bicepFKCtrl.alignOnXAxis() self.bicepFKCtrl.lockScale(True, True, True) self.bicepFKCtrl.lockTranslation(True, True, True) # Forearm self.forearmFKCtrlSpace = CtrlSpace('forearmFK', parent=self.bicepFKCtrl) self.forearmFKCtrl = Control('forearmFK', parent=self.forearmFKCtrlSpace, shape="cube") self.forearmFKCtrl.alignOnXAxis() self.forearmFKCtrl.lockScale(True, True, True) self.forearmFKCtrl.lockTranslation(True, True, True) # Arm IK self.armIKCtrlSpace = CtrlSpace('IK', parent=self.ctrlCmpGrp) self.armIKCtrl = Control('IK', parent=self.armIKCtrlSpace, shape="jack") self.armIKCtrl.scalePoints(Vec3(2.0, 2.0, 2.0)) self.armIKCtrl.lockScale(True, True, True) # Add Params to IK control armSettingsAttrGrp = AttributeGroup("DisplayInfo_ArmSettings", parent=self.armIKCtrl) self.armDebugInputAttr = BoolAttribute('drawDebug', value=False, parent=armSettingsAttrGrp) self.armBone0LenInputAttr = ScalarAttribute('bone1Len', value=0.0, parent=armSettingsAttrGrp) self.armBone1LenInputAttr = ScalarAttribute('bone2Len', value=0.0, parent=armSettingsAttrGrp) self.armIKBlendInputAttr = ScalarAttribute('fkik', value=0.0, minValue=0.0, maxValue=1.0, parent=armSettingsAttrGrp) # Util Objects self.ikRootPosition = Transform("ikPosition", parent=self.ctrlCmpGrp) # Connect Input Attrs self.drawDebugInputAttr.connect(self.armDebugInputAttr) # Connect Output Attrs self.drawDebugOutputAttr.connect(self.armDebugInputAttr) self.ikBlendOutputAttr.connect(self.armIKBlendInputAttr) # UpV self.armUpVCtrlSpace = CtrlSpace('UpV', parent=self.ctrlCmpGrp) self.armUpVCtrl = Control('UpV', parent=self.armUpVCtrlSpace, shape="triangle") self.armUpVCtrl.alignOnZAxis() self.armUpVCtrl.rotatePoints(180, 0, 0) self.armIKCtrl.lockScale(True, True, True) self.armIKCtrl.lockRotation(True, True, True) # ========== # Deformers # ========== self.deformersLayer = self.getOrCreateLayer('deformers') self.defCmpGrp = ComponentGroup(self.getName(), self, parent=self.deformersLayer) self.addItem('defCmpGrp', self.defCmpGrp) self.bicepDef = Joint('bicep', parent=self.defCmpGrp) self.bicepDef.setComponent(self) self.elbowDef = Joint('elbow', parent=self.defCmpGrp) self.elbowDef.setComponent(self) self.forearmDef = Joint('forearm', parent=self.defCmpGrp) self.forearmDef.setComponent(self) self.wristDef = Joint('wrist', parent=self.defCmpGrp) self.wristDef.setComponent(self) # ============== # Constrain I/O # ============== # Constraint inputs self.armIKCtrlSpaceInputConstraint = PoseConstraint('_'.join([ self.armIKCtrlSpace.getName(), 'To', self.globalSRTInputTgt.getName() ])) self.armIKCtrlSpaceInputConstraint.setMaintainOffset(True) self.armIKCtrlSpaceInputConstraint.addConstrainer( self.globalSRTInputTgt) self.armIKCtrlSpace.addConstraint(self.armIKCtrlSpaceInputConstraint) self.armUpVCtrlSpaceInputConstraint = PoseConstraint('_'.join([ self.armUpVCtrlSpace.getName(), 'To', self.globalSRTInputTgt.getName() ])) self.armUpVCtrlSpaceInputConstraint.setMaintainOffset(True) self.armUpVCtrlSpaceInputConstraint.addConstrainer( self.globalSRTInputTgt) self.armUpVCtrlSpace.addConstraint(self.armUpVCtrlSpaceInputConstraint) self.armRootInputConstraint = PoseConstraint('_'.join([ self.bicepFKCtrlSpace.getName(), 'To', self.rootInputTgt.getName() ])) self.armRootInputConstraint.setMaintainOffset(True) self.armRootInputConstraint.addConstrainer(self.rootInputTgt) self.bicepFKCtrlSpace.addConstraint(self.armRootInputConstraint) self.ikPosInputConstraint = PoseConstraint('_'.join( [self.ikRootPosition.getName(), 'To', self.rootInputTgt.getName()])) self.ikPosInputConstraint.setMaintainOffset(True) self.ikPosInputConstraint.addConstrainer(self.rootInputTgt) self.ikRootPosition.addConstraint(self.ikPosInputConstraint) # Constraint outputs # =============== # Add Splice Ops # =============== # Add Splice Op self.armSolverKLOperator = KLOperator('ikSolver', 'TwoBoneIKSolver', 'Kraken') self.addOperator(self.armSolverKLOperator) # Add Att Inputs self.armSolverKLOperator.setInput('drawDebug', self.drawDebugInputAttr) self.armSolverKLOperator.setInput('rigScale', self.rigScaleInputAttr) self.armSolverKLOperator.setInput('bone0Len', self.armBone0LenInputAttr) self.armSolverKLOperator.setInput('bone1Len', self.armBone1LenInputAttr) self.armSolverKLOperator.setInput('ikblend', self.armIKBlendInputAttr) self.armSolverKLOperator.setInput('rightSide', self.rightSideInputAttr) # Add Xfo Inputs self.armSolverKLOperator.setInput('root', self.ikRootPosition) self.armSolverKLOperator.setInput('bone0FK', self.bicepFKCtrl) self.armSolverKLOperator.setInput('bone1FK', self.forearmFKCtrl) self.armSolverKLOperator.setInput('ikHandle', self.armIKCtrl) self.armSolverKLOperator.setInput('upV', self.armUpVCtrl) # Add Xfo Outputs self.armSolverKLOperator.setOutput('bone0Out', self.bicepOutputTgt) self.armSolverKLOperator.setOutput('bone1Out', self.forearmOutputTgt) self.armSolverKLOperator.setOutput('bone2Out', self.wristOutputTgt) self.armSolverKLOperator.setOutput('midJointOut', self.elbowOutputTgt) # Add Deformer Splice Op self.outputsToDeformersKLOp = KLOperator('defConstraint', 'MultiPoseConstraintSolver', 'Kraken') self.addOperator(self.outputsToDeformersKLOp) # Add Att Inputs self.outputsToDeformersKLOp.setInput('drawDebug', self.drawDebugInputAttr) self.outputsToDeformersKLOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Inputs self.outputsToDeformersKLOp.setInput('constrainers', [ self.bicepOutputTgt, self.elbowOutputTgt, self.forearmOutputTgt, self.wristOutputTgt ]) # Add Xfo Outputs self.outputsToDeformersKLOp.setOutput( 'constrainees', [self.bicepDef, self.elbowDef, self.forearmDef, self.wristDef]) Profiler.getInstance().pop()
def __init__(self, name='mainSrt', parent=None): Profiler.getInstance().push("Construct MainSrt Rig Component:" + name) super(MainSrtComponentRig, self).__init__(name, parent) # ========= # Controls # ========= # Add Controls self.mainSRTCtrlSpace = CtrlSpace('SRT', parent=self.ctrlCmpGrp) self.mainSRTCtrl = Control('SRT', shape='circle', parent=self.mainSRTCtrlSpace) self.mainSRTCtrl.lockScale(x=True, y=True, z=True) self.offsetCtrlSpace = CtrlSpace('Offset', parent=self.mainSRTCtrl) self.offsetCtrl = Control('Offset', shape='circle', parent=self.offsetCtrlSpace) self.offsetCtrl.setColor("orange") self.offsetCtrl.lockScale(x=True, y=True, z=True) # Add Component Params to IK control mainSrtSettingsAttrGrp = AttributeGroup('DisplayInfo_MainSrtSettings', parent=self.mainSRTCtrl) self.rigScaleAttr = ScalarAttribute('rigScale', value=1.0, parent=mainSrtSettingsAttrGrp, minValue=0.1, maxValue=100.0) self.rigScaleOutputAttr.connect(self.rigScaleAttr) # ========== # Deformers # ========== # ============== # Constrain I/O # ============== # Constraint inputs # Constraint outputs srtConstraint = PoseConstraint('_'.join([self.srtOutputTgt.getName(), 'To', self.mainSRTCtrl.getName()])) srtConstraint.addConstrainer(self.mainSRTCtrl) self.srtOutputTgt.addConstraint(srtConstraint) offsetConstraint = PoseConstraint('_'.join([self.offsetOutputTgt.getName(), 'To', self.mainSRTCtrl.getName()])) offsetConstraint.addConstrainer(self.offsetCtrl) self.offsetOutputTgt.addConstraint(offsetConstraint) # =============== # Add Splice Ops # =============== #Add Rig Scale Splice Op self.rigScaleKLOp = KLOperator('rigScaleKLOp', 'RigScaleSolver', 'Kraken') self.addOperator(self.rigScaleKLOp) # Add Att Inputs self.rigScaleKLOp.setInput('drawDebug', self.drawDebugInputAttr) self.rigScaleKLOp.setInput('rigScale', self.rigScaleOutputAttr) # Add Xfo Inputs # Add Xfo Outputs self.rigScaleKLOp.setOutput('target', self.mainSRTCtrlSpace) Profiler.getInstance().pop()
class StretchyLimbComponentRig(StretchyLimbComponent): """StretchyLimb Component""" def __init__(self, name='limb', parent=None): Profiler.getInstance().push("Construct StretchyLimb Rig Component:" + name) super(StretchyLimbComponentRig, self).__init__(name, parent) # ========= # Controls # ========= # Upper (FK) self.upperFKCtrlSpace = CtrlSpace('upperFK', parent=self.ctrlCmpGrp) self.upperFKCtrl = Control('upperFK', parent=self.upperFKCtrlSpace, shape="cube") self.upperFKCtrl.alignOnXAxis() # Lower (FK) self.lowerFKCtrlSpace = CtrlSpace('lowerFK', parent=self.upperFKCtrl) self.lowerFKCtrl = Control('lowerFK', parent=self.lowerFKCtrlSpace, shape="cube") self.lowerFKCtrl.alignOnXAxis() # End (IK) self.limbIKCtrlSpace = CtrlSpace('IK', parent=self.ctrlCmpGrp) self.limbIKCtrl = Control('IK', parent=self.limbIKCtrlSpace, shape="pin") # Add Component Params to IK control # TODO: Move these separate control limbSettingsAttrGrp = AttributeGroup("DisplayInfo_StretchyLimbSettings", parent=self.limbIKCtrl) limbDrawDebugInputAttr = BoolAttribute('drawDebug', value=False, parent=limbSettingsAttrGrp) self.limbBone0LenInputAttr = ScalarAttribute('bone0Len', value=1.0, parent=limbSettingsAttrGrp) self.limbBone1LenInputAttr = ScalarAttribute('bone1Len', value=1.0, parent=limbSettingsAttrGrp) limbIKBlendInputAttr = ScalarAttribute('ikblend', value=1.0, minValue=0.0, maxValue=1.0, parent=limbSettingsAttrGrp) limbSoftIKInputAttr = BoolAttribute('softIK', value=True, parent=limbSettingsAttrGrp) limbSoftRatioInputAttr = ScalarAttribute('softRatio', value=0.0, minValue=0.0, maxValue=1.0, parent=limbSettingsAttrGrp) limbStretchInputAttr = BoolAttribute('stretch', value=True, parent=limbSettingsAttrGrp) limbStretchBlendInputAttr = ScalarAttribute('stretchBlend', value=0.0, minValue=0.0, maxValue=1.0, parent=limbSettingsAttrGrp) limbSlideInputAttr = ScalarAttribute('slide', value=0.0, minValue=-1.0, maxValue=1.0, parent=limbSettingsAttrGrp) limbPinInputAttr = ScalarAttribute('pin', value=0.0, minValue=0.0, maxValue=1.0, parent=limbSettingsAttrGrp) self.rightSideInputAttr = BoolAttribute('rightSide', value=False, parent=limbSettingsAttrGrp) self.drawDebugInputAttr.connect(limbDrawDebugInputAttr) # UpV (IK Pole Vector) self.limbUpVCtrlSpace = CtrlSpace('UpV', parent=self.ctrlCmpGrp) self.limbUpVCtrl = Control('UpV', parent=self.limbUpVCtrlSpace, shape="triangle") self.limbUpVCtrl.alignOnZAxis() # ========== # Deformers # ========== deformersLayer = self.getOrCreateLayer('deformers') self.defCmpGrp = ComponentGroup(self.getName(), self, parent=deformersLayer) self.addItem('defCmpGrp', self.defCmpGrp) upperDef = Joint('upper', parent=self.defCmpGrp) upperDef.setComponent(self) lowerDef = Joint('lower', parent=self.defCmpGrp) lowerDef.setComponent(self) endDef = Joint('end', parent=self.defCmpGrp) endDef.setComponent(self) # ============== # Constrain I/O # ============== # Constraint inputs self.limbIKCtrlSpaceInputConstraint = PoseConstraint('_'.join([self.limbIKCtrlSpace.getName(), 'To', self.globalSRTInputTgt.getName()])) self.limbIKCtrlSpaceInputConstraint.setMaintainOffset(True) self.limbIKCtrlSpaceInputConstraint.addConstrainer(self.globalSRTInputTgt) self.limbIKCtrlSpace.addConstraint(self.limbIKCtrlSpaceInputConstraint) self.limbUpVCtrlSpaceInputConstraint = PoseConstraint('_'.join([self.limbUpVCtrlSpace.getName(), 'To', self.globalSRTInputTgt.getName()])) self.limbUpVCtrlSpaceInputConstraint.setMaintainOffset(True) self.limbUpVCtrlSpaceInputConstraint.addConstrainer(self.globalSRTInputTgt) self.limbUpVCtrlSpace.addConstraint(self.limbUpVCtrlSpaceInputConstraint) self.limbRootInputConstraint = PoseConstraint('_'.join([self.limbIKCtrl.getName(), 'To', self.limbParentInputTgt.getName()])) self.limbRootInputConstraint.setMaintainOffset(True) self.limbRootInputConstraint.addConstrainer(self.limbParentInputTgt) self.upperFKCtrlSpace.addConstraint(self.limbRootInputConstraint) # =============== # Add Splice Ops # =============== # Add StretchyLimb Splice Op self.limbIKKLOp = KLOperator('limbKLOp', 'TwoBoneStretchyIKSolver', 'Kraken') self.addOperator(self.limbIKKLOp) # Add Att Inputs self.limbIKKLOp.setInput('drawDebug', self.drawDebugInputAttr) self.limbIKKLOp.setInput('rigScale', self.rigScaleInputAttr) self.limbIKKLOp.setInput('bone0Len', self.limbBone0LenInputAttr) self.limbIKKLOp.setInput('bone1Len', self.limbBone1LenInputAttr) self.limbIKKLOp.setInput('ikblend', limbIKBlendInputAttr) self.limbIKKLOp.setInput('softIK', limbSoftIKInputAttr) self.limbIKKLOp.setInput('softRatio', limbSoftRatioInputAttr) self.limbIKKLOp.setInput('stretch', limbStretchInputAttr) self.limbIKKLOp.setInput('stretchBlend', limbStretchBlendInputAttr) self.limbIKKLOp.setInput('slide', limbSlideInputAttr) self.limbIKKLOp.setInput('pin', limbPinInputAttr) self.limbIKKLOp.setInput('rightSide', self.rightSideInputAttr) # Add Xfo Inputs self.limbIKKLOp.setInput('root', self.limbParentInputTgt) self.limbIKKLOp.setInput('bone0FK', self.upperFKCtrl) self.limbIKKLOp.setInput('bone1FK', self.lowerFKCtrl) self.limbIKKLOp.setInput('ikHandle', self.limbIKCtrl) self.limbIKKLOp.setInput('upV', self.limbUpVCtrl) # Add Xfo Outputs self.limbIKKLOp.setOutput('bone0Out', self.limbUpperOutputTgt) self.limbIKKLOp.setOutput('bone1Out', self.limbLowerOutputTgt) self.limbIKKLOp.setOutput('bone2Out', self.limbEndOutputTgt) # ===================== # Connect the deformers # ===================== # Add StretchyLimb Deformer Splice Op self.outputsToDeformersKLOp = KLOperator('limbDeformerKLOp', 'MultiPoseConstraintSolver', 'Kraken') self.addOperator(self.outputsToDeformersKLOp) # Add Att Inputs self.outputsToDeformersKLOp.setInput('drawDebug', self.drawDebugInputAttr) self.outputsToDeformersKLOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Inputs self.outputsToDeformersKLOp.setInput('constrainers', [self.limbUpperOutputTgt, self.limbLowerOutputTgt, self.limbEndOutputTgt]) # Add Xfo Outputs self.outputsToDeformersKLOp.setOutput('constrainees', [upperDef, lowerDef, endDef]) Profiler.getInstance().pop() # ============= # Data Methods # ============= def loadData(self, data=None): """Load a saved guide representation from persisted data. Arguments: data -- object, The JSON data object. Return: True if successful. """ super(StretchyLimbComponentRig, self).loadData(data) upperXfo = data.get('upperXfo') upperLen = data.get('upperLen') lowerXfo = data.get('lowerXfo') lowerLen = data.get('lowerLen') endXfo = data.get('endXfo') upVXfo = data.get('upVXfo') self.upperFKCtrlSpace.xfo = upperXfo self.upperFKCtrl.xfo = upperXfo self.upperFKCtrl.scalePoints(Vec3(upperLen, 1.75, 1.75)) self.limbUpperOutputTgt.xfo = upperXfo self.limbLowerOutputTgt.xfo = lowerXfo self.lowerFKCtrlSpace.xfo = lowerXfo self.lowerFKCtrl.xfo = lowerXfo self.lowerFKCtrl.scalePoints(Vec3(lowerLen, 1.5, 1.5)) self.limbIKCtrlSpace.xfo.tr = endXfo.tr self.limbIKCtrl.xfo.tr = endXfo.tr if self.getLocation() == "R": self.limbIKCtrl.rotatePoints(0, 90, 0) self.limbIKCtrl.translatePoints(Vec3(-1.0, 0.0, 0.0)) else: self.limbIKCtrl.rotatePoints(0, -90, 0) self.limbIKCtrl.translatePoints(Vec3(1.0, 0.0, 0.0)) self.limbUpVCtrlSpace.xfo = upVXfo self.limbUpVCtrl.xfo = upVXfo self.limbBone0LenInputAttr.setMin(0.0) self.limbBone0LenInputAttr.setMax(upperLen * 3.0) self.limbBone0LenInputAttr.setValue(upperLen) self.limbBone1LenInputAttr.setMin(0.0) self.limbBone1LenInputAttr.setMax(lowerLen * 3.0) self.limbBone1LenInputAttr.setValue(lowerLen) self.limbParentInputTgt.xfo = upperXfo # Set Attrs self.rightSideInputAttr.setValue(self.getLocation() is 'R') # Eval Constraints self.limbIKCtrlSpaceInputConstraint.evaluate() self.limbUpVCtrlSpaceInputConstraint.evaluate() self.limbRootInputConstraint.evaluate() # Eval Operators self.limbIKKLOp.evaluate() self.outputsToDeformersKLOp.evaluate()
class HeadComponentRig(HeadComponent): """Head Component Rig""" def __init__(self, name='head', parent=None): Profiler.getInstance().push("Construct Head Rig Component:" + name) super(HeadComponentRig, self).__init__(name, parent) # ========= # Controls # ========= # Head self.headCtrl = Control('head', parent=self.ctrlCmpGrp, shape='circle') self.headCtrl.lockScale(x=True, y=True, z=True) self.headCtrl.lockTranslation(x=True, y=True, z=True) self.headCtrlSpace = self.headCtrl.insertCtrlSpace() self.headCtrl.rotatePoints(0, 0, 90) self.headCtrl.scalePoints(Vec3(3, 3, 3)) self.headCtrl.translatePoints(Vec3(0, 1, 0.25)) # Eye Left self.eyeLeftCtrl = Control('eyeLeft', parent=self.ctrlCmpGrp, shape='sphere') self.eyeLeftCtrl.lockScale(x=True, y=True, z=True) self.eyeLeftCtrl.lockTranslation(x=True, y=True, z=True) self.eyeLeftCtrlSpace = self.eyeLeftCtrl.insertCtrlSpace() self.eyeLeftCtrl.rotatePoints(0, 90, 0) self.eyeLeftCtrl.scalePoints(Vec3(0.5, 0.5, 0.5)) self.eyeLeftCtrl.setColor('blueMedium') # Eye Right self.eyeRightCtrl = Control('eyeRight', parent=self.ctrlCmpGrp, shape='sphere') self.eyeRightCtrl.lockScale(x=True, y=True, z=True) self.eyeRightCtrl.lockTranslation(x=True, y=True, z=True) self.eyeRightCtrlSpace = self.eyeRightCtrl.insertCtrlSpace() self.eyeRightCtrl.rotatePoints(0, 90, 0) self.eyeRightCtrl.scalePoints(Vec3(0.5, 0.5, 0.5)) self.eyeRightCtrl.setColor('blueMedium') # LookAt Control self.lookAtCtrl = Control('lookAt', parent=self.ctrlCmpGrp, shape='square') self.lookAtCtrl.lockScale(x=True, y=True, z=True) self.lookAtCtrl.rotatePoints(90, 0, 0) self.lookAtCtrlSpace = self.lookAtCtrl.insertCtrlSpace() self.eyeLeftBase = Transform('eyeLeftBase', parent=self.headCtrl) self.eyeRightBase = Transform('eyeRightBase', parent=self.headCtrl) self.eyeLeftUpV = Transform('eyeLeftUpV', parent=self.headCtrl) self.eyeRightUpV = Transform('eyeRightUpV', parent=self.headCtrl) self.eyeLeftAtV = Transform('eyeLeftAtV', parent=self.lookAtCtrl) self.eyeRightAtV = Transform('eyeRightAtV', parent=self.lookAtCtrl) # Jaw self.jawCtrl = Control('jaw', parent=self.headCtrl, shape='cube') self.jawCtrlSpace = self.jawCtrl.insertCtrlSpace() self.jawCtrl.lockScale(x=True, y=True, z=True) self.jawCtrl.lockTranslation(x=True, y=True, z=True) self.jawCtrl.alignOnYAxis(negative=True) self.jawCtrl.alignOnZAxis() self.jawCtrl.scalePoints(Vec3(1.45, 0.65, 1.25)) self.jawCtrl.translatePoints(Vec3(0, -0.25, 0)) self.jawCtrl.setColor('orange') # ========== # Deformers # ========== deformersLayer = self.getOrCreateLayer('deformers') self.defCmpGrp = ComponentGroup(self.getName(), self, parent=deformersLayer) self.addItem('defCmpGrp', self.defCmpGrp) headDef = Joint('head', parent=self.defCmpGrp) headDef.setComponent(self) jawDef = Joint('jaw', parent=self.defCmpGrp) jawDef.setComponent(self) eyeLeftDef = Joint('eyeLeft', parent=self.defCmpGrp) eyeLeftDef.setComponent(self) eyeRightDef = Joint('eyeRight', parent=self.defCmpGrp) eyeRightDef.setComponent(self) # ============== # Constrain I/O # ============== # Constraint inputs self.headInputConstraint = PoseConstraint('_'.join([self.headCtrlSpace.getName(), 'To', self.neckRefInputTgt.getName()])) self.headInputConstraint.setMaintainOffset(True) self.headInputConstraint.addConstrainer(self.neckRefInputTgt) self.headCtrlSpace.addConstraint(self.headInputConstraint) # Constraint outputs self.headOutputConstraint = PoseConstraint('_'.join([self.headOutputTgt.getName(), 'To', self.headCtrl.getName()])) self.headOutputConstraint.addConstrainer(self.headCtrl) self.headOutputTgt.addConstraint(self.headOutputConstraint) self.jawOutputConstraint = PoseConstraint('_'.join([self.jawOutputTgt.getName(), 'To', self.jawCtrl.getName()])) self.jawOutputConstraint.addConstrainer(self.jawCtrl) self.jawOutputTgt.addConstraint(self.jawOutputConstraint) self.eyeLOutputConstraint = PoseConstraint('_'.join([self.eyeLOutputTgt.getName(), 'To', self.eyeLeftCtrl.getName()])) self.eyeLOutputConstraint.addConstrainer(self.eyeLeftCtrl) self.eyeLOutputTgt.addConstraint(self.eyeLOutputConstraint) self.eyeROutputConstraint = PoseConstraint('_'.join([self.eyeROutputTgt.getName(), 'To', self.eyeRightCtrl.getName()])) self.eyeROutputConstraint.addConstrainer(self.eyeRightCtrl) self.eyeROutputTgt.addConstraint(self.eyeROutputConstraint) # Add Eye Left Direction KL Op self.eyeLeftDirKLOp = KLOperator('eyeLeftDirKLOp', 'DirectionConstraintSolver', 'Kraken') self.addOperator(self.eyeLeftDirKLOp) # Add Att Inputs self.eyeLeftDirKLOp.setInput('drawDebug', self.drawDebugInputAttr) self.eyeLeftDirKLOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Inputs self.eyeLeftDirKLOp.setInput('position', self.eyeLeftBase) self.eyeLeftDirKLOp.setInput('upVector', self.eyeLeftUpV) self.eyeLeftDirKLOp.setInput('atVector', self.eyeLeftAtV) # Add Xfo Outputs self.eyeLeftDirKLOp.setOutput('constrainee', self.eyeLeftCtrlSpace) # Add Eye Right Direction KL Op self.eyeRightDirKLOp = KLOperator('eyeRightDirKLOp', 'DirectionConstraintSolver', 'Kraken') self.addOperator(self.eyeRightDirKLOp) # Add Att Inputs self.eyeRightDirKLOp.setInput('drawDebug', self.drawDebugInputAttr) self.eyeRightDirKLOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Inputs self.eyeRightDirKLOp.setInput('position', self.eyeRightBase) self.eyeRightDirKLOp.setInput('upVector', self.eyeRightUpV) self.eyeRightDirKLOp.setInput('atVector', self.eyeRightAtV) # Add Xfo Outputs self.eyeRightDirKLOp.setOutput('constrainee', self.eyeRightCtrlSpace) # Add Deformer Joints KL Op self.outputsToDeformersKLOp = KLOperator('headDeformerKLOp', 'MultiPoseConstraintSolver', 'Kraken') self.addOperator(self.outputsToDeformersKLOp) # Add Att Inputs self.outputsToDeformersKLOp.setInput('drawDebug', self.drawDebugInputAttr) self.outputsToDeformersKLOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Inputs self.outputsToDeformersKLOp.setInput('constrainers', [self.headOutputTgt, self.jawOutputTgt, self.eyeROutputTgt, self.eyeLOutputTgt]) # Add Xfo Outputs self.outputsToDeformersKLOp.setOutput('constrainees', [headDef, jawDef, eyeRightDef, eyeLeftDef]) Profiler.getInstance().pop() def loadData(self, data=None): """Load a saved guide representation from persisted data. Arguments: data -- object, The JSON data object. Return: True if successful. """ super(HeadComponentRig, self).loadData(data) headXfo = data.get('headXfo') headCrvData = data.get('headCrvData') eyeLeftXfo = data.get('eyeLeftXfo') eyeLeftCrvData = data.get('eyeLeftCrvData') eyeRightXfo = data.get('eyeRightXfo') eyeRightCrvData = data.get('eyeRightCrvData') jawXfo = data.get('jawXfo') jawCrvData = data.get('jawCrvData') self.headCtrlSpace.xfo = headXfo self.headCtrl.xfo = headXfo self.headCtrl.setCurveData(headCrvData) # self.eyeLeftCtrlSpace.xfo = eyeLeftXfo # self.eyeLeftCtrl.xfo = eyeLeftXfo self.eyeLeftCtrl.setCurveData(eyeLeftCrvData) # self.eyeRightCtrlSpace.xfo = eyeRightXfo # self.eyeRightCtrl.xfo = eyeRightXfo self.eyeRightCtrl.setCurveData(eyeRightCrvData) # LookAt eyeLeftRelXfo = headXfo.inverse() * eyeLeftXfo eyeRightRelXfo = headXfo.inverse() * eyeRightXfo eyeMidRelPos = eyeLeftRelXfo.tr.linearInterpolate(eyeRightRelXfo.tr, 0.5) eyeMidRelPos = eyeMidRelPos + Vec3(0.0, 0.0, 8.0) eyeLen = eyeLeftRelXfo.tr.distanceTo(eyeRightRelXfo.tr) self.eyeLeftBase.xfo = eyeLeftXfo self.eyeRightBase.xfo = eyeRightXfo self.eyeLeftUpV.xfo = eyeLeftXfo * Xfo(Vec3(0, 1, 0)) self.eyeRightUpV.xfo = eyeRightXfo * Xfo(Vec3(0, 1, 0)) self.eyeLeftAtV.xfo.tr = eyeLeftXfo.transformVector(Vec3(8.0, 0.0, 0.0)) self.eyeRightAtV.xfo.tr = eyeRightXfo.transformVector(Vec3(8.0, 0.0, 0.0)) lookAtXfo = headXfo.clone() lookAtXfo.tr = headXfo.transformVector(eyeMidRelPos) self.lookAtCtrl.scalePoints(Vec3(eyeLen * 1.6, eyeLen * 0.65, 1.0)) self.lookAtCtrl.xfo = lookAtXfo self.lookAtCtrlSpace.xfo = lookAtXfo self.jawCtrlSpace.xfo = jawXfo self.jawCtrl.xfo = jawXfo self.jawCtrl.setCurveData(jawCrvData) # ============ # Set IO Xfos # ============ self.neckRefInputTgt.xfo = headXfo self.worldRefInputTgt.xfo = headXfo self.headOutputTgt.xfo = headXfo self.jawOutputTgt.xfo = jawXfo self.eyeLOutputTgt.xfo = eyeLeftXfo self.eyeROutputTgt.xfo = eyeRightXfo # Eval Constraints self.headInputConstraint.evaluate() self.headOutputConstraint.evaluate() self.jawOutputConstraint.evaluate() self.eyeLOutputConstraint.evaluate() self.eyeROutputConstraint.evaluate() # Eval Operators self.eyeLeftDirKLOp.evaluate() self.eyeRightDirKLOp.evaluate() self.outputsToDeformersKLOp.evaluate() # Have to set the eye control xfos to match the evaluated xfos from self.eyeLeftCtrl.xfo = self.eyeLeftCtrlSpace.xfo self.eyeRightCtrl.xfo = self.eyeRightCtrlSpace.xfo
class HandComponentRig(HandComponent): """Hand Component""" def __init__(self, name='Hand', parent=None): Profiler.getInstance().push("Construct Hand Rig Component:" + name) super(HandComponentRig, self).__init__(name, parent) # ========= # Controls # ========= # Hand self.handCtrlSpace = CtrlSpace('hand', parent=self.ctrlCmpGrp) self.handCtrl = Control('hand', parent=self.handCtrlSpace, shape="square") self.handCtrl.rotatePoints(0, 0, 90.0) self.handCtrl.lockScale(True, True, True) self.handCtrl.lockTranslation(True, True, True) # ========== # Deformers # ========== self.deformersLayer = self.getOrCreateLayer('deformers') self.defCmpGrp = ComponentGroup(self.getName(), self, parent=self.deformersLayer) self.addItem('defCmpGrp', self.defCmpGrp) self.handDef = Joint('hand', parent=self.defCmpGrp) self.handDef.setComponent(self) # ============== # Constrain I/O # ============== # Constraint inputs self.armEndInputConstraint = PoseConstraint('_'.join([self.handCtrlSpace.getName(), 'To', self.armEndInputTgt.getName()])) self.armEndInputConstraint.setMaintainOffset(True) self.armEndInputConstraint.addConstrainer(self.armEndInputTgt) self.handCtrlSpace.addConstraint(self.armEndInputConstraint) # Constraint outputs self.handOutputConstraint = PoseConstraint('_'.join([self.handOutputTgt.getName(), 'To', self.handCtrl.getName()])) self.handOutputConstraint.addConstrainer(self.handCtrl) self.handOutputTgt.addConstraint(self.handOutputConstraint) # Constraint deformers self.handDefConstraint = PoseConstraint('_'.join([self.handDef.getName(), 'To', self.handCtrl.getName()])) self.handDefConstraint.addConstrainer(self.handCtrl) self.handDef.addConstraint(self.handDefConstraint) Profiler.getInstance().pop() def addFinger(self, name, data): fingerCtrls = [] fingerJoints = [] parentCtrl = self.handCtrl for i, joint in enumerate(data): if i == 0: jointName = name + 'Meta' else: jointName = name + str(i).zfill(2) jointXfo = joint.get('xfo', Xfo()) jointCrvData = joint.get('curveData') # Create Controls newJointCtrlSpace = CtrlSpace(jointName, parent=parentCtrl) newJointCtrl = Control(jointName, parent=newJointCtrlSpace, shape='square') newJointCtrl.lockScale(True, True, True) newJointCtrl.lockTranslation(True, True, True) if jointCrvData is not None: newJointCtrl.setCurveData(jointCrvData) fingerCtrls.append(newJointCtrl) # Create Deformers jointDef = Joint(jointName, parent=self.defCmpGrp) fingerJoints.append(jointDef) # Create Constraints # Set Xfos newJointCtrlSpace.xfo = jointXfo newJointCtrl.xfo = jointXfo parentCtrl = newJointCtrl # ================= # Create Operators # ================= # Add Deformer KL Op deformersToCtrlsKLOp = KLOperator(name + 'DeformerKLOp', 'MultiPoseConstraintSolver', 'Kraken') self.addOperator(deformersToCtrlsKLOp) # Add Att Inputs deformersToCtrlsKLOp.setInput('drawDebug', self.drawDebugInputAttr) deformersToCtrlsKLOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Inputs deformersToCtrlsKLOp.setInput('constrainers', fingerCtrls) # Add Xfo Outputs deformersToCtrlsKLOp.setOutput('constrainees', fingerJoints) return deformersToCtrlsKLOp def loadData(self, data=None): """Load a saved guide representation from persisted data. Arguments: data -- object, The JSON data object. Return: True if successful. """ super(HandComponentRig, self).loadData(data) # Data fingerData = data.get('fingerData') handXfo = data.get('handXfo', Xfo()) self.handCtrlSpace.xfo = handXfo self.handCtrl.xfo = handXfo fingerOps = [] for finger in fingerData.keys(): fingerOp = self.addFinger(finger, fingerData[finger]) fingerOps.append(fingerOp) # ============ # Set IO Xfos # ============ self.armEndInputTgt.xfo = handXfo self.handOutputTgt.xfo = handXfo # Eval Constraints self.armEndInputConstraint.evaluate() self.handOutputConstraint.evaluate() self.handDefConstraint.evaluate() # Eval Operators for op in fingerOps: op.evaluate()
def __init__(self, name, parent=None, location='M'): super(ClavicleComponent, self).__init__(name, parent, location) # ========= # Controls # ========= # Setup component attributes defaultAttrGroup = self.getAttributeGroupByIndex(0) defaultAttrGroup.addAttribute(BoolAttribute("toggleDebugging", True)) # Default values if location == 'R': ctrlColor = "red" claviclePosition = Vec3(-0.1322, 15.403, -0.5723) clavicleUpV = Vec3() clavicleUpV.copy(claviclePosition) clavicleUpV = clavicleUpV.add(Vec3(0.0, 1.0, 0.0)).unit() clavicleEndPosition = Vec3(-2.27, 15.295, -0.753) else: ctrlColor = "greenBright" claviclePosition = Vec3(0.1322, 15.403, -0.5723) clavicleUpV = Vec3() clavicleUpV.copy(claviclePosition) clavicleUpV = clavicleUpV.add(Vec3(0.0, 1.0, 0.0)).unit() clavicleEndPosition = Vec3(2.27, 15.295, -0.753) # Calculate Clavicle Xfo rootToEnd = clavicleEndPosition.subtract(claviclePosition).unit() rootToUpV = clavicleUpV.subtract(claviclePosition).unit() bone1ZAxis = rootToUpV.cross(rootToEnd).unit() bone1Normal = bone1ZAxis.cross(rootToEnd).unit() clavicleXfo = Xfo() clavicleXfo.setFromVectors(rootToEnd, bone1Normal, bone1ZAxis, claviclePosition) # Add Controls clavicleCtrl = CubeControl('clavicle', parent=self) clavicleCtrl.alignOnXAxis() clavicleLen = claviclePosition.subtract(clavicleEndPosition).length() clavicleCtrl.scalePoints(Vec3(clavicleLen, 0.75, 0.75)) if location == "R": clavicleCtrl.translatePoints(Vec3(0.0, 0.0, -1.0)) else: clavicleCtrl.translatePoints(Vec3(0.0, 0.0, 1.0)) clavicleCtrl.xfo.copy(clavicleXfo) clavicleCtrl.setColor(ctrlColor) clavicleCtrlSrtBuffer = SrtBuffer('clavicle', parent=self) clavicleCtrlSrtBuffer.xfo.copy(clavicleCtrl.xfo) clavicleCtrlSrtBuffer.addChild(clavicleCtrl) # ========== # Deformers # ========== container = self.getParent().getParent() deformersLayer = container.getChildByName('deformers') clavicleDef = Joint('clavicle') clavicleDef.setComponent(self) deformersLayer.addChild(clavicleDef) # ===================== # Create Component I/O # ===================== # Setup Component Xfo I/O's spineEndInput = Locator('spineEnd') spineEndInput.xfo.copy(clavicleXfo) clavicleEndOutput = Locator('clavicleEnd') clavicleEndOutput.xfo.copy(clavicleXfo) clavicleOutput = Locator('clavicle') clavicleOutput.xfo.copy(clavicleXfo) # Setup componnent Attribute I/O's debugInputAttr = BoolAttribute('debug', True) rightSideInputAttr = BoolAttribute('rightSide', location is 'R') armFollowBodyOutputAttr = FloatAttribute('followBody', 0.0, 0.0, 1.0) # ============== # Constrain I/O # ============== # Constraint inputs clavicleInputConstraint = PoseConstraint('_'.join([clavicleCtrl.getName(), 'To', spineEndInput.getName()])) clavicleInputConstraint.setMaintainOffset(True) clavicleInputConstraint.addConstrainer(spineEndInput) clavicleCtrlSrtBuffer.addConstraint(clavicleInputConstraint) # Constraint outputs clavicleConstraint = PoseConstraint('_'.join([clavicleOutput.getName(), 'To', clavicleCtrl.getName()])) clavicleConstraint.addConstrainer(clavicleCtrl) clavicleOutput.addConstraint(clavicleConstraint) clavicleEndConstraint = PoseConstraint('_'.join([clavicleEndOutput.getName(), 'To', clavicleCtrl.getName()])) clavicleEndConstraint.addConstrainer(clavicleCtrl) clavicleEndOutput.addConstraint(clavicleEndConstraint) # ================== # Add Component I/O # ================== # Add Xfo I/O's self.addInput(spineEndInput) self.addOutput(clavicleEndOutput) self.addOutput(clavicleOutput) # Add Attribute I/O's self.addInput(debugInputAttr) self.addInput(rightSideInputAttr) self.addOutput(armFollowBodyOutputAttr)
def __init__(self, name='head', parent=None): Profiler.getInstance().push("Construct Head Rig Component:" + name) super(HeadComponentRig, self).__init__(name, parent) # ========= # Controls # ========= # Head self.headCtrlSpace = CtrlSpace('head', parent=self.ctrlCmpGrp) self.headCtrl = Control('head', parent=self.headCtrlSpace, shape="circle") self.headCtrl.rotatePoints(0, 0, 90) self.headCtrl.scalePoints(Vec3(3, 3, 3)) self.headCtrl.translatePoints(Vec3(0, 1, 0.25)) # Eye Left self.eyeLeftCtrlSpace = CtrlSpace('eyeLeft', parent=self.headCtrl) self.eyeLeftCtrl = Control('eyeLeft', parent=self.eyeLeftCtrlSpace, shape="sphere") self.eyeLeftCtrl.scalePoints(Vec3(0.5, 0.5, 0.5)) self.eyeLeftCtrl.setColor("blueMedium") # Eye Right self.eyeRightCtrlSpace = CtrlSpace('eyeRight', parent=self.headCtrl) self.eyeRightCtrl = Control('eyeRight', parent=self.eyeRightCtrlSpace, shape="sphere") self.eyeRightCtrl.scalePoints(Vec3(0.5, 0.5, 0.5)) self.eyeRightCtrl.setColor("blueMedium") # Jaw self.jawCtrlSpace = CtrlSpace('jawCtrlSpace', parent=self.headCtrl) self.jawCtrl = Control('jaw', parent=self.jawCtrlSpace, shape="cube") self.jawCtrl.alignOnYAxis(negative=True) self.jawCtrl.alignOnZAxis() self.jawCtrl.scalePoints(Vec3(1.45, 0.65, 1.25)) self.jawCtrl.translatePoints(Vec3(0, -0.25, 0)) self.jawCtrl.setColor("orange") # ========== # Deformers # ========== deformersLayer = self.getOrCreateLayer('deformers') defCmpGrp = ComponentGroup(self.getName(), self, parent=deformersLayer) headDef = Joint('head', parent=defCmpGrp) headDef.setComponent(self) jawDef = Joint('jaw', parent=defCmpGrp) jawDef.setComponent(self) eyeLeftDef = Joint('eyeLeft', parent=defCmpGrp) eyeLeftDef.setComponent(self) eyeRightDef = Joint('eyeRight', parent=defCmpGrp) eyeRightDef.setComponent(self) # ============== # Constrain I/O # ============== # Constraint inputs headInputConstraint = PoseConstraint('_'.join([self.headCtrlSpace.getName(), 'To', self.headBaseInputTgt.getName()])) headInputConstraint.setMaintainOffset(True) headInputConstraint.addConstrainer(self.headBaseInputTgt) self.headCtrlSpace.addConstraint(headInputConstraint) # # Constraint outputs headOutputConstraint = PoseConstraint('_'.join([self.headOutputTgt.getName(), 'To', self.headCtrl.getName()])) headOutputConstraint.addConstrainer(self.headCtrl) self.headOutputTgt.addConstraint(headOutputConstraint) jawOutputConstraint = PoseConstraint('_'.join([self.jawOutputTgt.getName(), 'To', self.jawCtrl.getName()])) jawOutputConstraint.addConstrainer(self.jawCtrl) self.jawOutputTgt.addConstraint(jawOutputConstraint) eyeLOutputConstraint = PoseConstraint('_'.join([self.eyeLOutputTgt.getName(), 'To', self.eyeLeftCtrl.getName()])) eyeLOutputConstraint.addConstrainer(self.eyeLeftCtrl) self.eyeLOutputTgt.addConstraint(eyeLOutputConstraint) eyeROutputConstraint = PoseConstraint('_'.join([self.eyeROutputTgt.getName(), 'To', self.eyeRightCtrl.getName()])) eyeROutputConstraint.addConstrainer(self.eyeRightCtrl) self.eyeROutputTgt.addConstraint(eyeROutputConstraint) # ================== # Add Component I/O # ================== # Add Xfo I/O's # self.addInput(self.headBaseInputTgt) # self.addOutput(self.headOutputTgt) # self.addOutput(self.jawOutputTgt) # self.addOutput(self.eyeLOutputTgt) # self.addOutput(self.eyeROutputTgt) # Add Attribute I/O's # self.addInput(self.drawDebugInputAttr) # =============== # Add Splice Ops # =============== # Add Deformer Splice Op # spliceOp = SpliceOperator('headDeformerSpliceOp', 'HeadConstraintSolver', 'KrakenHeadConstraintSolver') # self.addOperator(spliceOp) # # Add Att Inputs # spliceOp.setInput('drawDebug', self.drawDebugInputAttr) # spliceOp.setInput('rigScale', self.rigScaleInputAttr) # # Add Xfo Inputstrl) # spliceOp.setInput('headConstrainer', self.headOutputTgt) # spliceOp.setInput('jawConstrainer', self.jawOutputTgt) # spliceOp.setInput('eyeLeftConstrainer', self.eyeLOutputTgt) # spliceOp.setInput('eyeRightConstrainer', self.eyeROutputTgt) # # Add Xfo Outputs # spliceOp.setOutput('headDeformer', headDef) # spliceOp.setOutput('jawDeformer', jawDef) # spliceOp.setOutput('eyeLeftDeformer', eyeLeftDef) # spliceOp.setOutput('eyeRightDeformer', eyeRightDef) Profiler.getInstance().pop()
def __init__(self, name='limb', parent=None): Profiler.getInstance().push("Construct StretchyLimb Rig Component:" + name) super(StretchyLimbComponentRig, self).__init__(name, parent) # ========= # Controls # ========= # Upper (FK) self.upperFKCtrlSpace = CtrlSpace('upperFK', parent=self.ctrlCmpGrp) self.upperFKCtrl = Control('upperFK', parent=self.upperFKCtrlSpace, shape="cube") self.upperFKCtrl.alignOnXAxis() # Lower (FK) self.lowerFKCtrlSpace = CtrlSpace('lowerFK', parent=self.upperFKCtrl) self.lowerFKCtrl = Control('lowerFK', parent=self.lowerFKCtrlSpace, shape="cube") self.lowerFKCtrl.alignOnXAxis() # End (IK) self.limbIKCtrlSpace = CtrlSpace('IK', parent=self.ctrlCmpGrp) self.limbIKCtrl = Control('IK', parent=self.limbIKCtrlSpace, shape="pin") # Add Component Params to IK control # TODO: Move these separate control limbSettingsAttrGrp = AttributeGroup("DisplayInfo_StretchyLimbSettings", parent=self.limbIKCtrl) limbDrawDebugInputAttr = BoolAttribute('drawDebug', value=False, parent=limbSettingsAttrGrp) self.limbBone0LenInputAttr = ScalarAttribute('bone0Len', value=1.0, parent=limbSettingsAttrGrp) self.limbBone1LenInputAttr = ScalarAttribute('bone1Len', value=1.0, parent=limbSettingsAttrGrp) limbIKBlendInputAttr = ScalarAttribute('ikblend', value=1.0, minValue=0.0, maxValue=1.0, parent=limbSettingsAttrGrp) limbSoftIKInputAttr = BoolAttribute('softIK', value=True, parent=limbSettingsAttrGrp) limbSoftRatioInputAttr = ScalarAttribute('softRatio', value=0.0, minValue=0.0, maxValue=1.0, parent=limbSettingsAttrGrp) limbStretchInputAttr = BoolAttribute('stretch', value=True, parent=limbSettingsAttrGrp) limbStretchBlendInputAttr = ScalarAttribute('stretchBlend', value=0.0, minValue=0.0, maxValue=1.0, parent=limbSettingsAttrGrp) limbSlideInputAttr = ScalarAttribute('slide', value=0.0, minValue=-1.0, maxValue=1.0, parent=limbSettingsAttrGrp) limbPinInputAttr = ScalarAttribute('pin', value=0.0, minValue=0.0, maxValue=1.0, parent=limbSettingsAttrGrp) self.rightSideInputAttr = BoolAttribute('rightSide', value=False, parent=limbSettingsAttrGrp) self.drawDebugInputAttr.connect(limbDrawDebugInputAttr) # UpV (IK Pole Vector) self.limbUpVCtrlSpace = CtrlSpace('UpV', parent=self.ctrlCmpGrp) self.limbUpVCtrl = Control('UpV', parent=self.limbUpVCtrlSpace, shape="triangle") self.limbUpVCtrl.alignOnZAxis() # ========== # Deformers # ========== deformersLayer = self.getOrCreateLayer('deformers') self.defCmpGrp = ComponentGroup(self.getName(), self, parent=deformersLayer) self.addItem('defCmpGrp', self.defCmpGrp) upperDef = Joint('upper', parent=self.defCmpGrp) upperDef.setComponent(self) lowerDef = Joint('lower', parent=self.defCmpGrp) lowerDef.setComponent(self) endDef = Joint('end', parent=self.defCmpGrp) endDef.setComponent(self) # ============== # Constrain I/O # ============== # Constraint inputs self.limbIKCtrlSpaceInputConstraint = PoseConstraint('_'.join([self.limbIKCtrlSpace.getName(), 'To', self.globalSRTInputTgt.getName()])) self.limbIKCtrlSpaceInputConstraint.setMaintainOffset(True) self.limbIKCtrlSpaceInputConstraint.addConstrainer(self.globalSRTInputTgt) self.limbIKCtrlSpace.addConstraint(self.limbIKCtrlSpaceInputConstraint) self.limbUpVCtrlSpaceInputConstraint = PoseConstraint('_'.join([self.limbUpVCtrlSpace.getName(), 'To', self.globalSRTInputTgt.getName()])) self.limbUpVCtrlSpaceInputConstraint.setMaintainOffset(True) self.limbUpVCtrlSpaceInputConstraint.addConstrainer(self.globalSRTInputTgt) self.limbUpVCtrlSpace.addConstraint(self.limbUpVCtrlSpaceInputConstraint) self.limbRootInputConstraint = PoseConstraint('_'.join([self.limbIKCtrl.getName(), 'To', self.limbParentInputTgt.getName()])) self.limbRootInputConstraint.setMaintainOffset(True) self.limbRootInputConstraint.addConstrainer(self.limbParentInputTgt) self.upperFKCtrlSpace.addConstraint(self.limbRootInputConstraint) # =============== # Add Splice Ops # =============== # Add StretchyLimb Splice Op self.limbIKKLOp = KLOperator('limbKLOp', 'TwoBoneStretchyIKSolver', 'Kraken') self.addOperator(self.limbIKKLOp) # Add Att Inputs self.limbIKKLOp.setInput('drawDebug', self.drawDebugInputAttr) self.limbIKKLOp.setInput('rigScale', self.rigScaleInputAttr) self.limbIKKLOp.setInput('bone0Len', self.limbBone0LenInputAttr) self.limbIKKLOp.setInput('bone1Len', self.limbBone1LenInputAttr) self.limbIKKLOp.setInput('ikblend', limbIKBlendInputAttr) self.limbIKKLOp.setInput('softIK', limbSoftIKInputAttr) self.limbIKKLOp.setInput('softRatio', limbSoftRatioInputAttr) self.limbIKKLOp.setInput('stretch', limbStretchInputAttr) self.limbIKKLOp.setInput('stretchBlend', limbStretchBlendInputAttr) self.limbIKKLOp.setInput('slide', limbSlideInputAttr) self.limbIKKLOp.setInput('pin', limbPinInputAttr) self.limbIKKLOp.setInput('rightSide', self.rightSideInputAttr) # Add Xfo Inputs self.limbIKKLOp.setInput('root', self.limbParentInputTgt) self.limbIKKLOp.setInput('bone0FK', self.upperFKCtrl) self.limbIKKLOp.setInput('bone1FK', self.lowerFKCtrl) self.limbIKKLOp.setInput('ikHandle', self.limbIKCtrl) self.limbIKKLOp.setInput('upV', self.limbUpVCtrl) # Add Xfo Outputs self.limbIKKLOp.setOutput('bone0Out', self.limbUpperOutputTgt) self.limbIKKLOp.setOutput('bone1Out', self.limbLowerOutputTgt) self.limbIKKLOp.setOutput('bone2Out', self.limbEndOutputTgt) # ===================== # Connect the deformers # ===================== # Add StretchyLimb Deformer Splice Op self.outputsToDeformersKLOp = KLOperator('limbDeformerKLOp', 'MultiPoseConstraintSolver', 'Kraken') self.addOperator(self.outputsToDeformersKLOp) # Add Att Inputs self.outputsToDeformersKLOp.setInput('drawDebug', self.drawDebugInputAttr) self.outputsToDeformersKLOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Inputs self.outputsToDeformersKLOp.setInput('constrainers', [self.limbUpperOutputTgt, self.limbLowerOutputTgt, self.limbEndOutputTgt]) # Add Xfo Outputs self.outputsToDeformersKLOp.setOutput('constrainees', [upperDef, lowerDef, endDef]) Profiler.getInstance().pop()
def __init__(self, name, parent=None, location='M'): super(NeckComponent, self).__init__(name, parent, location) # Setup component attributes defaultAttrGroup = self.getAttributeGroupByIndex(0) defaultAttrGroup.addAttribute(BoolAttribute("toggleDebugging", True)) # Default values neckPosition = Vec3(0.0, 16.5572, -0.6915) neckUpV = Vec3() neckUpV.copy(neckPosition) neckUpV = neckUpV.add(Vec3(0.0, 0.0, -1.0)).unit() neckEndPosition = Vec3(0.0, 17.4756, -0.421) # Calculate Clavicle Xfo rootToEnd = neckEndPosition.subtract(neckPosition).unit() rootToUpV = neckUpV.subtract(neckPosition).unit() bone1ZAxis = rootToUpV.cross(rootToEnd).unit() bone1Normal = bone1ZAxis.cross(rootToEnd).unit() neckXfo = Xfo() neckXfo.setFromVectors(rootToEnd, bone1Normal, bone1ZAxis, neckPosition) # Add Guide Controls neckCtrlSrtBuffer = SrtBuffer('neck', parent=self) neckCtrlSrtBuffer.xfo.copy(neckXfo) neckCtrl = PinControl('neck', parent=neckCtrlSrtBuffer) neckCtrl.scalePoints(Vec3(1.25, 1.25, 1.25)) neckCtrl.translatePoints(Vec3(0, 0, -0.5)) neckCtrl.rotatePoints(90, 0, 90) neckCtrl.xfo.copy(neckXfo) neckCtrl.setColor("orange") # ========== # Deformers # ========== container = self.getParent().getParent() deformersLayer = container.getChildByName('deformers') neckDef = Joint('neck', parent=deformersLayer) neckDef.setComponent(self) # ===================== # Create Component I/O # ===================== # Setup Component Xfo I/O's neckEndInput = Locator('neckBase') neckEndInput.xfo.copy(neckXfo) neckEndOutput = Locator('neckEnd') neckEndOutput.xfo.copy(neckXfo) neckOutput = Locator('neck') neckOutput.xfo.copy(neckXfo) # Setup componnent Attribute I/O's debugInputAttr = BoolAttribute('debug', True) rightSideInputAttr = BoolAttribute('rightSide', location is 'R') # ============== # Constrain I/O # ============== # Constraint inputs clavicleInputConstraint = PoseConstraint('_'.join([neckCtrl.getName(), 'To', neckEndInput.getName()])) clavicleInputConstraint.setMaintainOffset(True) clavicleInputConstraint.addConstrainer(neckEndInput) neckCtrlSrtBuffer.addConstraint(clavicleInputConstraint) # Constraint outputs neckEndConstraint = PoseConstraint('_'.join([neckEndOutput.getName(), 'To', neckCtrl.getName()])) neckEndConstraint.addConstrainer(neckCtrl) neckEndOutput.addConstraint(neckEndConstraint) # ================== # Add Component I/O # ================== # Add Xfo I/O's self.addInput(neckEndInput) self.addOutput(neckEndOutput) self.addOutput(neckOutput) # Add Attribute I/O's self.addInput(debugInputAttr) self.addInput(rightSideInputAttr)
def __init__(self, name='InsectLeg', parent=None): Profiler.getInstance().push("Construct InsectLeg Rig Component:" + name) super(InsectLegComponentRig, self).__init__(name, parent) # ========= # Controls # ========= # Chain Base self.chainBase = Locator('ChainBase', parent=self.ctrlCmpGrp) self.chainBase.setShapeVisibility(False) # FK self.fkCtrlSpaces = [] self.fkCtrls = [] self.setNumControls(4) # IK Control self.legIKCtrlSpace = CtrlSpace('IK', parent=self.ctrlCmpGrp) self.legIKCtrl = Control('IK', parent=self.legIKCtrlSpace, shape="pin") if self.getLocation() == 'R': self.legIKCtrl.rotatePoints(0, 90, 0) self.legIKCtrl.translatePoints(Vec3(-1.0, 0.0, 0.0)) else: self.legIKCtrl.rotatePoints(0, -90, 0) self.legIKCtrl.translatePoints(Vec3(1.0, 0.0, 0.0)) # Add Component Params to IK control legSettingsAttrGrp = AttributeGroup("DisplayInfo_LegSettings", parent=self.legIKCtrl) legdrawDebugInputAttr = BoolAttribute('drawDebug', value=False, parent=legSettingsAttrGrp) legUseInitPoseInputAttr = BoolAttribute('useInitPose', value=True, parent=legSettingsAttrGrp) self.rootIndexInputAttr = IntegerAttribute('rootIndex', value=0, parent=legSettingsAttrGrp) legFkikInputAttr = ScalarAttribute('fkik', value=1.0, minValue=0.0, maxValue=1.0, parent=legSettingsAttrGrp) # Connect IO to controls self.drawDebugInputAttr.connect(legdrawDebugInputAttr) # UpV self.legUpVCtrlSpace = CtrlSpace('UpV', parent=self.ctrlCmpGrp) self.legUpVCtrl = Control('UpV', parent=self.legUpVCtrlSpace, shape="triangle") self.legUpVCtrl.alignOnZAxis() self.legUpVCtrl.rotatePoints(0, 90, 0) # ========== # Deformers # ========== deformersLayer = self.getOrCreateLayer('deformers') self.defCmpGrp = ComponentGroup(self.getName(), self, parent=deformersLayer) self.deformerJoints = [] self.boneOutputsTgt = [] self.setNumDeformers(4) # ===================== # Create Component I/O # ===================== # Set IO Targets self.boneOutputs.setTarget(self.boneOutputsTgt) # ============== # Constrain I/O # ============== # Constraint inputs legRootInputConstraint = PoseConstraint('_'.join([self.fkCtrlSpaces[0].getName(), 'To', self.rootInputTgt.getName()])) legRootInputConstraint.setMaintainOffset(True) legRootInputConstraint.addConstrainer(self.rootInputTgt) self.fkCtrlSpaces[0].addConstraint(legRootInputConstraint) chainBaseInputConstraint = PoseConstraint('_'.join([self.chainBase.getName(), 'To', self.rootInputTgt.getName()])) chainBaseInputConstraint.setMaintainOffset(True) chainBaseInputConstraint.addConstrainer(self.rootInputTgt) self.chainBase.addConstraint(chainBaseInputConstraint) # =============== # Add Splice Ops # =============== # Add Splice Op self.nBoneSolverSpliceOp = SpliceOperator('legSpliceOp', 'NBoneIKSolver', 'Kraken') self.addOperator(self.nBoneSolverSpliceOp) # # Add Att Inputs self.nBoneSolverSpliceOp.setInput('drawDebug', self.drawDebugInputAttr) self.nBoneSolverSpliceOp.setInput('rigScale', self.rigScaleInputAttr) self.nBoneSolverSpliceOp.setInput('useInitPose', legUseInitPoseInputAttr) self.nBoneSolverSpliceOp.setInput('ikblend', legFkikInputAttr) self.nBoneSolverSpliceOp.setInput('rootIndex', self.rootIndexInputAttr) self.nBoneSolverSpliceOp.setInput('tipBoneLen', self.tipBoneLenInputAttr) # Add Xfo Inputs self.nBoneSolverSpliceOp.setInput('chainBase', self.chainBase) self.nBoneSolverSpliceOp.setInput('ikgoal', self.legIKCtrl) self.nBoneSolverSpliceOp.setInput('upVector', self.legUpVCtrl) self.nBoneSolverSpliceOp.setInput('fkcontrols', self.fkCtrls) # Add Xfo Outputs self.nBoneSolverSpliceOp.setOutput('pose', self.boneOutputsTgt) self.nBoneSolverSpliceOp.setOutput('legEnd', self.legEndPosOutputTgt) # Add Deformer Splice Op self.outputsToDeformersSpliceOp = SpliceOperator('insectLegDeformerSpliceOp', 'MultiPoseConstraintSolver', 'Kraken') self.addOperator(self.outputsToDeformersSpliceOp) # Add Att Inputs self.outputsToDeformersSpliceOp.setInput('drawDebug', self.drawDebugInputAttr) self.outputsToDeformersSpliceOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Inputs self.outputsToDeformersSpliceOp.setInput('constrainers', self.boneOutputsTgt) # Add Xfo Outputs self.outputsToDeformersSpliceOp.setOutput('constrainees', self.deformerJoints) Profiler.getInstance().pop()
class ArmComponentRig(ArmComponent): """Arm Component Rig""" def __init__(self, name="arm", parent=None): Profiler.getInstance().push("Construct Arm Rig Component:" + name) super(ArmComponentRig, self).__init__(name, parent) # ========= # Controls # ========= # Bicep self.bicepFKCtrlSpace = CtrlSpace("bicepFK", parent=self.ctrlCmpGrp) self.bicepFKCtrl = Control("bicepFK", parent=self.bicepFKCtrlSpace, shape="cube") self.bicepFKCtrl.alignOnXAxis() # Forearm self.forearmFKCtrlSpace = CtrlSpace("forearmFK", parent=self.bicepFKCtrl) self.forearmFKCtrl = Control("forearmFK", parent=self.forearmFKCtrlSpace, shape="cube") self.forearmFKCtrl.alignOnXAxis() self.handCtrlSpace = CtrlSpace("hand", parent=self.ctrlCmpGrp) self.handCtrl = Control("hand", parent=self.handCtrlSpace, shape="circle") self.handCtrl.rotatePoints(0, 0, 90) self.handCtrl.scalePoints(Vec3(1.0, 0.75, 0.75)) # Arm IK self.armIKCtrlSpace = CtrlSpace("IK", parent=self.ctrlCmpGrp) self.armIKCtrl = Control("IK", parent=self.armIKCtrlSpace, shape="pin") # Add Params to IK control armSettingsAttrGrp = AttributeGroup("DisplayInfo_ArmSettings", parent=self.armIKCtrl) armDebugInputAttr = BoolAttribute("drawDebug", value=False, parent=armSettingsAttrGrp) self.armBone0LenInputAttr = ScalarAttribute("bone1Len", value=0.0, parent=armSettingsAttrGrp) self.armBone1LenInputAttr = ScalarAttribute("bone2Len", value=0.0, parent=armSettingsAttrGrp) armIKBlendInputAttr = ScalarAttribute("fkik", value=0.0, minValue=0.0, maxValue=1.0, parent=armSettingsAttrGrp) armSoftIKInputAttr = BoolAttribute("softIK", value=True, parent=armSettingsAttrGrp) armSoftDistInputAttr = ScalarAttribute("softDist", value=0.0, minValue=0.0, parent=armSettingsAttrGrp) armStretchInputAttr = BoolAttribute("stretch", value=True, parent=armSettingsAttrGrp) armStretchBlendInputAttr = ScalarAttribute( "stretchBlend", value=0.0, minValue=0.0, maxValue=1.0, parent=armSettingsAttrGrp ) # Hand Params handSettingsAttrGrp = AttributeGroup("DisplayInfo_HandSettings", parent=self.handCtrl) handLinkToWorldInputAttr = ScalarAttribute("linkToWorld", 0.0, maxValue=1.0, parent=handSettingsAttrGrp) self.drawDebugInputAttr.connect(armDebugInputAttr) # UpV self.armUpVCtrlSpace = CtrlSpace("UpV", parent=self.ctrlCmpGrp) self.armUpVCtrl = Control("UpV", parent=self.armUpVCtrlSpace, shape="triangle") self.armUpVCtrl.alignOnZAxis() self.armUpVCtrl.rotatePoints(180, 0, 0) # ========== # Deformers # ========== deformersLayer = self.getOrCreateLayer("deformers") defCmpGrp = ComponentGroup(self.getName(), self, parent=deformersLayer) bicepDef = Joint("bicep", parent=defCmpGrp) bicepDef.setComponent(self) forearmDef = Joint("forearm", parent=defCmpGrp) forearmDef.setComponent(self) wristDef = Joint("wrist", parent=defCmpGrp) wristDef.setComponent(self) handDef = Joint("hand", parent=defCmpGrp) handDef.setComponent(self) # ============== # Constrain I/O # ============== # Constraint inputs self.armIKCtrlSpaceInputConstraint = PoseConstraint( "_".join([self.armIKCtrlSpace.getName(), "To", self.globalSRTInputTgt.getName()]) ) self.armIKCtrlSpaceInputConstraint.setMaintainOffset(True) self.armIKCtrlSpaceInputConstraint.addConstrainer(self.globalSRTInputTgt) self.armIKCtrlSpace.addConstraint(self.armIKCtrlSpaceInputConstraint) self.armUpVCtrlSpaceInputConstraint = PoseConstraint( "_".join([self.armUpVCtrlSpace.getName(), "To", self.globalSRTInputTgt.getName()]) ) self.armUpVCtrlSpaceInputConstraint.setMaintainOffset(True) self.armUpVCtrlSpaceInputConstraint.addConstrainer(self.globalSRTInputTgt) self.armUpVCtrlSpace.addConstraint(self.armUpVCtrlSpaceInputConstraint) self.armRootInputConstraint = PoseConstraint( "_".join([self.bicepFKCtrlSpace.getName(), "To", self.clavicleEndInputTgt.getName()]) ) self.armRootInputConstraint.setMaintainOffset(True) self.armRootInputConstraint.addConstrainer(self.clavicleEndInputTgt) self.bicepFKCtrlSpace.addConstraint(self.armRootInputConstraint) # Constraint outputs self.handConstraint = PoseConstraint("_".join([self.handOutputTgt.getName(), "To", self.handCtrl.getName()])) self.handConstraint.addConstrainer(self.handCtrl) self.handOutputTgt.addConstraint(self.handConstraint) self.handCtrlSpaceConstraint = PoseConstraint( "_".join([self.handCtrlSpace.getName(), "To", self.armEndXfoOutputTgt.getName()]) ) self.handCtrlSpaceConstraint.setMaintainOffset(True) self.handCtrlSpaceConstraint.addConstrainer(self.armEndXfoOutputTgt) self.handCtrlSpace.addConstraint(self.handCtrlSpaceConstraint) # =============== # Add Splice Ops # =============== # Add Splice Op self.spliceOp = SpliceOperator("armSpliceOp", "TwoBoneIKSolver", "Kraken") self.addOperator(self.spliceOp) # Add Att Inputs self.spliceOp.setInput("drawDebug", self.drawDebugInputAttr) self.spliceOp.setInput("rigScale", self.rigScaleInputAttr) self.spliceOp.setInput("bone0Len", self.armBone0LenInputAttr) self.spliceOp.setInput("bone1Len", self.armBone1LenInputAttr) self.spliceOp.setInput("ikblend", armIKBlendInputAttr) self.spliceOp.setInput("softIK", armSoftIKInputAttr) self.spliceOp.setInput("softDist", armSoftDistInputAttr) self.spliceOp.setInput("stretch", armStretchInputAttr) self.spliceOp.setInput("stretchBlend", armStretchBlendInputAttr) self.spliceOp.setInput("rightSide", self.rightSideInputAttr) # Add Xfo Inputs self.spliceOp.setInput("root", self.clavicleEndInputTgt) self.spliceOp.setInput("bone0FK", self.bicepFKCtrl) self.spliceOp.setInput("bone1FK", self.forearmFKCtrl) self.spliceOp.setInput("ikHandle", self.armIKCtrl) self.spliceOp.setInput("upV", self.armUpVCtrl) # Add Xfo Outputs self.spliceOp.setOutput("bone0Out", self.bicepOutputTgt) self.spliceOp.setOutput("bone1Out", self.forearmOutputTgt) self.spliceOp.setOutput("bone2Out", self.armEndXfoOutputTgt) # Add Deformer Splice Op self.outputsToDeformersSpliceOp = SpliceOperator("armDeformerSpliceOp", "MultiPoseConstraintSolver", "Kraken") self.addOperator(self.outputsToDeformersSpliceOp) # Add Att Inputs self.outputsToDeformersSpliceOp.setInput("drawDebug", self.drawDebugInputAttr) self.outputsToDeformersSpliceOp.setInput("rigScale", self.rigScaleInputAttr) # Add Xfo Inputs self.outputsToDeformersSpliceOp.setInput( "constrainers", [self.bicepOutputTgt, self.forearmOutputTgt, self.armEndXfoOutputTgt, self.handOutputTgt] ) # Add Xfo Outputs self.outputsToDeformersSpliceOp.setOutput("constrainees", [bicepDef, forearmDef, wristDef, handDef]) Profiler.getInstance().pop() def loadData(self, data=None): """Load a saved guide representation from persisted data. Arguments: data -- object, The JSON data object. Return: True if successful. """ super(ArmComponentRig, self).loadData(data) self.clavicleEndInputTgt.xfo.tr = data["bicepXfo"].tr self.bicepFKCtrlSpace.xfo = data["bicepXfo"] self.bicepFKCtrl.xfo = data["bicepXfo"] self.bicepFKCtrl.scalePoints(Vec3(data["bicepLen"], data["bicepFKCtrlSize"], data["bicepFKCtrlSize"])) self.bicepOutputTgt.xfo = data["bicepXfo"] self.forearmOutputTgt.xfo = data["forearmXfo"] self.forearmFKCtrlSpace.xfo = data["forearmXfo"] self.forearmFKCtrl.xfo = data["forearmXfo"] self.forearmFKCtrl.scalePoints(Vec3(data["forearmLen"], data["forearmFKCtrlSize"], data["forearmFKCtrlSize"])) self.handCtrlSpace.xfo = data["handXfo"] self.handCtrl.xfo = data["handXfo"] self.armIKCtrlSpace.xfo.tr = data["armEndXfo"].tr self.armIKCtrl.xfo.tr = data["armEndXfo"].tr if self.getLocation() == "R": self.armIKCtrl.rotatePoints(0, 90, 0) else: self.armIKCtrl.rotatePoints(0, -90, 0) self.armUpVCtrlSpace.xfo = data["upVXfo"] self.armUpVCtrl.xfo = data["upVXfo"] self.rightSideInputAttr.setValue(self.getLocation() is "R") self.armBone0LenInputAttr.setMin(0.0) self.armBone0LenInputAttr.setMax(data["bicepLen"] * 3.0) self.armBone0LenInputAttr.setValue(data["bicepLen"]) self.armBone1LenInputAttr.setMin(0.0) self.armBone1LenInputAttr.setMax(data["forearmLen"] * 3.0) self.armBone1LenInputAttr.setValue(data["forearmLen"]) # Outputs self.handOutputTgt.xfo = data["handXfo"] # Eval Constraints self.armIKCtrlSpaceInputConstraint.evaluate() self.armUpVCtrlSpaceInputConstraint.evaluate() self.armRootInputConstraint.evaluate() self.armRootInputConstraint.evaluate() self.handConstraint.evaluate() self.handCtrlSpaceConstraint.evaluate() # Eval Operators self.spliceOp.evaluate() self.outputsToDeformersSpliceOp.evaluate()
from kraken import plugins from kraken.core.objects.locator import Locator from kraken.core.objects.constraints.pose_constraint import PoseConstraint from kraken.core.traverser.traverser import Traverser locA = Locator("locatorA") locB = Locator("locatorB") constraint = PoseConstraint("A to B") constraint.addConstrainer(locB) constraint.setConstrainee(locA) trav = Traverser() trav.addRootItem(locA) def callback(**args): item = args.get('item', None) print 'Visited ' + item.getDecoratedPath() trav.traverse(itemCallback=callback)
def __init__(self, name="spine", parent=None): Profiler.getInstance().push("Construct Spine Rig Component:" + name) super(SpineComponentRig, self).__init__(name, parent) # ========= # Controls # ========= # COG self.cogCtrlSpace = CtrlSpace('cog', parent=self.ctrlCmpGrp) self.cogCtrl = Control('cog', parent=self.cogCtrlSpace, shape="circle") self.cogCtrl.scalePoints(Vec3(6.0, 6.0, 6.0)) self.cogCtrl.setColor("orange") self.cogCtrl.lockScale(True, True, True) # Spine01 self.spine01CtrlSpace = CtrlSpace('spine01', parent=self.cogCtrl) self.spine01Ctrl = Control('spine01', parent=self.spine01CtrlSpace, shape="circle") self.spine01Ctrl.scalePoints(Vec3(4.0, 4.0, 4.0)) self.spine01Ctrl.lockScale(True, True, True) # Spine02 self.spine02CtrlSpace = CtrlSpace('spine02', parent=self.spine01Ctrl) self.spine02Ctrl = Control('spine02', parent=self.spine02CtrlSpace, shape="circle") self.spine02Ctrl.scalePoints(Vec3(4.5, 4.5, 4.5)) self.spine02Ctrl.lockScale(True, True, True) self.spine02Ctrl.setColor("blue") # Spine04 self.spine04CtrlSpace = CtrlSpace('spine04', parent=self.cogCtrl) self.spine04Ctrl = Control('spine04', parent=self.spine04CtrlSpace, shape="circle") self.spine04Ctrl.scalePoints(Vec3(6.0, 6.0, 6.0)) self.spine04Ctrl.lockScale(True, True, True) # Spine03 self.spine03CtrlSpace = CtrlSpace('spine03', parent=self.spine04Ctrl) self.spine03Ctrl = Control('spine03', parent=self.spine03CtrlSpace, shape="circle") self.spine03Ctrl.scalePoints(Vec3(4.5, 4.5, 4.5)) self.spine03Ctrl.lockScale(True, True, True) self.spine03Ctrl.setColor("blue") # Pelvis self.pelvisCtrlSpace = CtrlSpace('pelvis', parent=self.spine01Ctrl) self.pelvisCtrl = Control('pelvis', parent=self.pelvisCtrlSpace, shape="cube") self.pelvisCtrl.alignOnYAxis(negative=True) self.pelvisCtrl.scalePoints(Vec3(4.0, 0.375, 3.75)) self.pelvisCtrl.translatePoints(Vec3(0.0, -0.5, -0.25)) self.pelvisCtrl.lockTranslation(True, True, True) self.pelvisCtrl.lockScale(True, True, True) self.pelvisCtrl.setColor("dodgerblue") # ========== # Deformers # ========== deformersLayer = self.getOrCreateLayer('deformers') self.defCmpGrp = ComponentGroup(self.getName(), self, parent=deformersLayer) self.addItem('defCmpGrp', self.defCmpGrp) self.deformerJoints = [] self.spineOutputs = [] self.setNumDeformers(1) pelvisDef = Joint('pelvis', parent=self.defCmpGrp) pelvisDef.setComponent(self) # ===================== # Create Component I/O # ===================== # Setup component Xfo I/O's self.spineVertebraeOutput.setTarget(self.spineOutputs) # ============== # Constrain I/O # ============== # Constraint inputs self.spineSrtInputConstraint = PoseConstraint('_'.join([self.cogCtrlSpace.getName(), 'To', self.globalSRTInputTgt.getName()])) self.spineSrtInputConstraint.addConstrainer(self.globalSRTInputTgt) self.spineSrtInputConstraint.setMaintainOffset(True) self.cogCtrlSpace.addConstraint(self.spineSrtInputConstraint) # Constraint outputs self.spineCogOutputConstraint = PoseConstraint('_'.join([self.spineCogOutputTgt.getName(), 'To', self.cogCtrl.getName()])) self.spineCogOutputConstraint.addConstrainer(self.cogCtrl) self.spineCogOutputTgt.addConstraint(self.spineCogOutputConstraint) self.spineBaseOutputConstraint = PoseConstraint('_'.join([self.spineBaseOutputTgt.getName(), 'To', 'spineBase'])) self.spineBaseOutputConstraint.addConstrainer(self.spineOutputs[0]) self.spineBaseOutputTgt.addConstraint(self.spineBaseOutputConstraint) self.pelvisOutputConstraint = PoseConstraint('_'.join([self.pelvisOutputTgt.getName(), 'To', self.pelvisCtrl.getName()])) self.pelvisOutputConstraint.addConstrainer(self.pelvisCtrl) self.pelvisOutputTgt.addConstraint(self.pelvisOutputConstraint) self.spineEndOutputConstraint = PoseConstraint('_'.join([self.spineEndOutputTgt.getName(), 'To', 'spineEnd'])) self.spineEndOutputConstraint.addConstrainer(self.spineOutputs[0]) self.spineEndOutputTgt.addConstraint(self.spineEndOutputConstraint) # =============== # Add Canvas Ops # =============== # Add Spine Canvas Op self.bezierSpineKLOp = KLOperator('spine', 'BezierSpineSolver', 'Kraken') self.addOperator(self.bezierSpineKLOp) # Add Att Inputs self.bezierSpineKLOp.setInput('drawDebug', self.drawDebugInputAttr) self.bezierSpineKLOp.setInput('rigScale', self.rigScaleInputAttr) self.bezierSpineKLOp.setInput('length', self.lengthInputAttr) # Add Xfo Inputs self.bezierSpineKLOp.setInput('base', self.spine01Ctrl) self.bezierSpineKLOp.setInput('baseHandle', self.spine02Ctrl) self.bezierSpineKLOp.setInput('tipHandle', self.spine03Ctrl) self.bezierSpineKLOp.setInput('tip', self.spine04Ctrl) # Add Xfo Outputs self.bezierSpineKLOp.setOutput('outputs', self.spineOutputs) # Add Deformer Canvas Op self.deformersToOutputsKLOp = KLOperator('defConstraint', 'MultiPoseConstraintSolver', 'Kraken') self.addOperator(self.deformersToOutputsKLOp) # Add Att Inputs self.deformersToOutputsKLOp.setInput('drawDebug', self.drawDebugInputAttr) self.deformersToOutputsKLOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Outputs self.deformersToOutputsKLOp.setInput('constrainers', self.spineOutputs) # Add Xfo Outputs self.deformersToOutputsKLOp.setOutput('constrainees', self.deformerJoints) # Add Pelvis Canvas Op self.pelvisDefKLOp = KLOperator('pelvisDefConstraint', 'PoseConstraintSolver', 'Kraken') self.addOperator(self.pelvisDefKLOp) # Add Att Inputs self.pelvisDefKLOp.setInput('drawDebug', self.drawDebugInputAttr) self.pelvisDefKLOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Inputs self.pelvisDefKLOp.setInput('constrainer', self.pelvisOutputTgt) # Add Xfo Outputs self.pelvisDefKLOp.setOutput('constrainee', pelvisDef) Profiler.getInstance().pop()
def __init__(self, name='Tentacle', parent=None): Profiler.getInstance().push("Construct Tentacle Rig Component:" + name) super(TentacleComponentRig, self).__init__(name, parent) # ========= # Controls # ========= # Chain Base self.chainBase = Locator('ChainBase', parent=self.ctrlCmpGrp) self.chainBase.setShapeVisibility(False) # FK self.fkCtrlSpaces = [] self.fkCtrls = [] self.setNumControls(2) # IK Control self.tentacleIKCtrlSpace = CtrlSpace('IK', parent=self.ctrlCmpGrp) self.tentacleIKCtrl = Control('IK', parent=self.tentacleIKCtrlSpace, shape="sphere") self.tentacleIKCtrl.scalePoints(Vec3(0.25, 0.25, 0.25)) self.tentacleIKCtrl.lockScale(x=True, y=True, z=True) self.tentacleIKCtrl.lockRotation(x=True, y=True, z=True) # Add Component Params to IK control tentacleSettingsAttrGrp = AttributeGroup("DisplayInfo_LegSettings", parent=self.tentacleIKCtrl) tentacledrawDebugInputAttr = BoolAttribute('drawDebug', value=False, parent=tentacleSettingsAttrGrp) fkikInputAttr = ScalarAttribute('fkik', value=0.0, minValue=0.0, maxValue=1.0, parent=tentacleSettingsAttrGrp) waveLength_YInputAttr = ScalarAttribute('waveLength_Y', value=1.0, minValue=0.0, maxValue=5.0, parent=tentacleSettingsAttrGrp) waveAmplitude_YInputAttr = ScalarAttribute('waveAmplitude_Y', value=0.0, minValue=-3.0, maxValue=3.0, parent=tentacleSettingsAttrGrp) waveFrequency_YInputAttr = ScalarAttribute('waveFrequency_Y', value=2.0, minValue=0.0, maxValue=10.0, parent=tentacleSettingsAttrGrp) waveLength_ZInputAttr = ScalarAttribute('waveLength_Z', value=2.329, minValue=0.0, maxValue=5.0, parent=tentacleSettingsAttrGrp) waveAmplitude_ZInputAttr = ScalarAttribute('waveAmplitude_Z', value=0.0, minValue=-3.0, maxValue=3.0, parent=tentacleSettingsAttrGrp) waveFrequency_ZInputAttr = ScalarAttribute('waveFrequency_Z', value=3.354, minValue=0.0, maxValue=10.0, parent=tentacleSettingsAttrGrp) tipBiasInputAttr = ScalarAttribute('tipBias', value=1.0, minValue=0.0, maxValue=1.0, parent=tentacleSettingsAttrGrp) springStrengthInputAttr = ScalarAttribute('springStrength', value=0.3, minValue=0.0, maxValue=1.0, parent=tentacleSettingsAttrGrp) dampeningInputAttr = ScalarAttribute('dampening', value=0.03, minValue=0.0, maxValue=1.0, parent=tentacleSettingsAttrGrp) simulationWeightInputAttr = ScalarAttribute('simulationWeight', value=1.0, minValue=0.0, maxValue=1.0, parent=tentacleSettingsAttrGrp) softLimitBoundsInputAttr = ScalarAttribute('softLimitBounds', value=5.0, minValue=0.0, maxValue=10.0, parent=tentacleSettingsAttrGrp) # Connect IO to controls self.drawDebugInputAttr.connect(tentacledrawDebugInputAttr) # ========== # Deformers # ========== deformersLayer = self.getOrCreateLayer('deformers') self.defCmpGrp = ComponentGroup(self.getName(), self, parent=deformersLayer) self.deformerJoints = [] self.boneOutputsTgt = [] self.setNumDeformers(4) # ===================== # Create Component I/O # ===================== # Set IO Targets self.boneOutputs.setTarget(self.boneOutputsTgt) # ============== # Constrain I/O # ============== # Constraint inputs tentacleRootInputConstraint = PoseConstraint('_'.join([self.fkCtrlSpaces[0].getName(), 'To', self.rootInputTgt.getName()])) tentacleRootInputConstraint.setMaintainOffset(True) tentacleRootInputConstraint.addConstrainer(self.rootInputTgt) self.fkCtrlSpaces[0].addConstraint(tentacleRootInputConstraint) tentacleRootInputConstraint = PoseConstraint('_'.join([self.tentacleIKCtrlSpace.getName(), 'To', self.rootInputTgt.getName()])) tentacleRootInputConstraint.setMaintainOffset(True) tentacleRootInputConstraint.addConstrainer(self.rootInputTgt) self.tentacleIKCtrlSpace.addConstraint(tentacleRootInputConstraint) chainBaseInputConstraint = PoseConstraint('_'.join([self.chainBase.getName(), 'To', self.rootInputTgt.getName()])) chainBaseInputConstraint.setMaintainOffset(True) chainBaseInputConstraint.addConstrainer(self.rootInputTgt) self.chainBase.addConstraint(chainBaseInputConstraint) # =============== # Add Splice Ops # =============== # Add Splice Op self.tentacleSolverKLOp = KLOperator('tentacleKLOp', 'TentacleSolver', 'Kraken') self.addOperator(self.tentacleSolverKLOp) # # Add Att Inputs self.tentacleSolverKLOp.setInput('drawDebug', self.drawDebugInputAttr) self.tentacleSolverKLOp.setInput('rigScale', self.rigScaleInputAttr) self.tentacleSolverKLOp.setInput('ikblend', fkikInputAttr) self.tentacleSolverKLOp.setInput('waveLength_Y', waveLength_YInputAttr) self.tentacleSolverKLOp.setInput('waveAmplitude_Y', waveAmplitude_YInputAttr) self.tentacleSolverKLOp.setInput('waveFrequency_Y', waveFrequency_YInputAttr) self.tentacleSolverKLOp.setInput('waveLength_Z', waveLength_ZInputAttr) self.tentacleSolverKLOp.setInput('waveAmplitude_Z', waveAmplitude_ZInputAttr) self.tentacleSolverKLOp.setInput('waveFrequency_Z', waveFrequency_ZInputAttr) self.tentacleSolverKLOp.setInput('tipBias', tipBiasInputAttr) self.tentacleSolverKLOp.setInput('springStrength', springStrengthInputAttr) self.tentacleSolverKLOp.setInput('dampening', dampeningInputAttr) self.tentacleSolverKLOp.setInput('simulationWeight', simulationWeightInputAttr) self.tentacleSolverKLOp.setInput('softLimitBounds', softLimitBoundsInputAttr) self.tentacleSolverKLOp.setInput('tipBoneLen', self.tipBoneLenInputAttr) # Add Xfo Inputs self.tentacleSolverKLOp.setInput('chainBase', self.chainBase) self.tentacleSolverKLOp.setInput('ikgoal', self.tentacleIKCtrl) self.tentacleSolverKLOp.setInput('fkcontrols', self.fkCtrls) # Add Xfo Outputs self.tentacleSolverKLOp.setOutput('pose', self.boneOutputsTgt) self.tentacleSolverKLOp.setOutput('tentacleEnd', self.tentacleEndXfoOutputTgt) # Add Deformer Splice Op self.outputsToDeformersKLOp = KLOperator('TentacleDeformerKLOp', 'MultiPoseConstraintSolver', 'Kraken') self.addOperator(self.outputsToDeformersKLOp) # Add Att Inputs self.outputsToDeformersKLOp.setInput('drawDebug', self.drawDebugInputAttr) self.outputsToDeformersKLOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Inputs self.outputsToDeformersKLOp.setInput('constrainers', self.boneOutputsTgt) # Add Xfo Outputs self.outputsToDeformersKLOp.setOutput('constrainees', self.deformerJoints) Profiler.getInstance().pop()
def __init__(self, name="spine", parent=None): Profiler.getInstance().push("Construct Spine Rig Component:" + name) super(FabriceSpineRig, self).__init__(name, parent) # ========= # Controls # ========= # COG self.cogCtrlSpace = CtrlSpace('cog', parent=self.ctrlCmpGrp) self.cogCtrl = Control('cog', parent=self.cogCtrlSpace, shape="circle") self.cogCtrl.rotatePoints(90, 0, 0) self.cogCtrl.scalePoints(Vec3(3.0, 3.0, 3.0)) self.cogCtrl.translatePoints(Vec3(0.0, 0.0, 0.2)) self.cogCtrl.lockScale(x=True, y=True, z=True) self.cogCtrl.setColor("orange") # Spine Base self.spineBaseCtrlSpace = CtrlSpace('spineBase', parent=self.cogCtrl) self.spineBaseCtrl = Control('spineBase', parent=self.spineBaseCtrlSpace, shape="pin") self.spineBaseCtrl.rotatePoints(90, 0, 0) self.spineBaseCtrl.translatePoints(Vec3(0, 1.0, 0)) self.spineBaseCtrl.lockScale(x=True, y=True, z=True) # Spine Base Handle self.spineBaseHandleCtrlSpace = CtrlSpace('spineBaseHandle', parent=self.spineBaseCtrl) self.spineBaseHandleCtrl = Control( 'spineBaseHandle', parent=self.spineBaseHandleCtrlSpace, shape="pin") self.spineBaseHandleCtrl.rotatePoints(90, 0, 0) self.spineBaseHandleCtrl.translatePoints(Vec3(0, 1.0, 0)) self.spineBaseHandleCtrl.lockScale(x=True, y=True, z=True) self.spineBaseHandleCtrl.setColor("orange") # Spine End self.spineEndCtrlSpace = CtrlSpace('spineEnd', parent=self.cogCtrl) self.spineEndCtrl = Control('spineEnd', parent=self.spineEndCtrlSpace, shape="pin") self.spineEndCtrl.rotatePoints(90, 0, 0) self.spineEndCtrl.lockScale(x=True, y=True, z=True) self.spineEndCtrl.translatePoints(Vec3(0, 1.0, 0)) # Spine End Handle self.spineEndHandleCtrlSpace = CtrlSpace('spineEndHandle', parent=self.spineEndCtrl) self.spineEndHandleCtrl = Control('spineEndHandle', parent=self.spineEndHandleCtrlSpace, shape="pin") self.spineEndHandleCtrl.rotatePoints(90, 0, 0) self.spineEndHandleCtrl.translatePoints(Vec3(0, 1.0, 0)) self.spineEndHandleCtrl.lockScale(x=True, y=True, z=True) self.spineEndHandleCtrl.setColor("orange") # ========== # Deformers # ========== deformersLayer = self.getOrCreateLayer('deformers') self.defCmpGrp = ComponentGroup(self.getName(), self, parent=deformersLayer) self.chestDef = Joint('chest', parent=self.defCmpGrp) self.chestDef.setComponent(self) self.deformerJoints = [] self.spineOutputs = [] self.setNumDeformers(1) # ===================== # Create Component I/O # ===================== # Setup component Xfo I/O's self.spineVertebraeOutput.setTarget(self.spineOutputs) # ===================== # Constraint Deformers # ===================== self.chestDefConstraint = PoseConstraint('_'.join( [self.chestDef.getName(), 'To', self.spineBaseOutputTgt.getName()])) self.chestDefConstraint.addConstrainer(self.spineBaseOutputTgt) self.chestDef.addConstraint(self.chestDefConstraint) # ============== # Constrain I/O # ============== # Constraint inputs self.spineSrtInputConstraint = PoseConstraint('_'.join([ self.cogCtrlSpace.getName(), 'To', self.spineMainSrtInputTgt.getName() ])) self.spineSrtInputConstraint.addConstrainer(self.spineMainSrtInputTgt) self.spineSrtInputConstraint.setMaintainOffset(True) self.cogCtrlSpace.addConstraint(self.spineSrtInputConstraint) # Constraint outputs self.spineCogOutputConstraint = PoseConstraint('_'.join( [self.spineCogOutputTgt.getName(), 'To', self.cogCtrl.getName()])) self.spineCogOutputConstraint.addConstrainer(self.cogCtrl) self.spineCogOutputTgt.addConstraint(self.spineCogOutputConstraint) # Spine Base self.spineBaseOutputPosConstraint = PositionConstraint('_'.join([ self.spineBaseOutputTgt.getName(), 'PosTo', self.spineOutputs[0].getName() ])) self.spineBaseOutputPosConstraint.addConstrainer(self.spineOutputs[0]) self.spineBaseOutputTgt.addConstraint( self.spineBaseOutputPosConstraint) self.spineBaseOutputOriConstraint = OrientationConstraint('_'.join([ self.spineBaseOutputTgt.getName(), 'PosTo', self.cogCtrl.getName() ])) self.spineBaseOutputOriConstraint.addConstrainer(self.cogCtrl) self.spineBaseOutputTgt.addConstraint( self.spineBaseOutputOriConstraint) # Spine End self.spineEndOutputConstraint = PoseConstraint('_'.join( [self.spineEndOutputTgt.getName(), 'To', 'spineEnd'])) self.spineEndOutputConstraint.addConstrainer(self.spineOutputs[0]) self.spineEndOutputTgt.addConstraint(self.spineEndOutputConstraint) self.spineEndCtrlOutputConstraint = PoseConstraint('_'.join([ self.spineEndCtrlOutputTgt.getName(), 'To', self.spineEndCtrl.getName() ])) self.spineEndCtrlOutputConstraint.addConstrainer(self.spineEndCtrl) self.spineEndCtrlOutputTgt.addConstraint( self.spineEndCtrlOutputConstraint) # =============== # Add Splice Ops # =============== # Add Spine Splice Op self.bezierSpineSpliceOp = SpliceOperator('spineSpliceOp', 'BezierSpineSolver', 'Kraken') self.addOperator(self.bezierSpineSpliceOp) # Add Att Inputs self.bezierSpineSpliceOp.setInput('drawDebug', self.drawDebugInputAttr) self.bezierSpineSpliceOp.setInput('rigScale', self.rigScaleInputAttr) self.bezierSpineSpliceOp.setInput('length', self.lengthInputAttr) # Add Xfo Inputs self.bezierSpineSpliceOp.setInput('base', self.spineBaseCtrl) self.bezierSpineSpliceOp.setInput('baseHandle', self.spineBaseHandleCtrl) self.bezierSpineSpliceOp.setInput('tipHandle', self.spineEndHandleCtrl) self.bezierSpineSpliceOp.setInput('tip', self.spineEndCtrl) # Add Xfo Outputs self.bezierSpineSpliceOp.setOutput('outputs', self.spineOutputs) # Add Deformer Splice Op self.deformersToOutputsSpliceOp = SpliceOperator( 'spineDeformerSpliceOp', 'MultiPoseConstraintSolver', 'Kraken', alwaysEval=True) self.addOperator(self.deformersToOutputsSpliceOp) # Add Att Inputs self.deformersToOutputsSpliceOp.setInput('drawDebug', self.drawDebugInputAttr) self.deformersToOutputsSpliceOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Outputs self.deformersToOutputsSpliceOp.setInput('constrainers', self.spineOutputs) # Add Xfo Outputs self.deformersToOutputsSpliceOp.setOutput('constrainees', self.deformerJoints) Profiler.getInstance().pop()
def __init__(self, name='Tentacle', parent=None): Profiler.getInstance().push("Construct Tentacle Rig Component:" + name) super(TentacleComponentRig, self).__init__(name, parent) # ========= # Controls # ========= # Chain Base self.chainBase = Locator('ChainBase', parent=self.ctrlCmpGrp) self.chainBase.setShapeVisibility(False) # FK self.fkCtrlSpaces = [] self.fkCtrls = [] self.setNumControls(2) # IK Control self.tentacleIKCtrlSpace = CtrlSpace('IK', parent=self.ctrlCmpGrp) self.tentacleIKCtrl = Control('IK', parent=self.tentacleIKCtrlSpace, shape="sphere") self.tentacleIKCtrl.scalePoints(Vec3(0.25, 0.25, 0.25)) self.tentacleIKCtrl.lockScale(x=True, y=True, z=True) self.tentacleIKCtrl.lockRotation(x=True, y=True, z=True) # Add Component Params to IK control tentacleSettingsAttrGrp = AttributeGroup("DisplayInfo_LegSettings", parent=self.tentacleIKCtrl) tentacledrawDebugInputAttr = BoolAttribute( 'drawDebug', value=False, parent=tentacleSettingsAttrGrp) fkikInputAttr = ScalarAttribute('fkik', value=0.0, minValue=0.0, maxValue=1.0, parent=tentacleSettingsAttrGrp) waveLength_YInputAttr = ScalarAttribute('waveLength_Y', value=1.0, minValue=0.0, maxValue=5.0, parent=tentacleSettingsAttrGrp) waveAmplitude_YInputAttr = ScalarAttribute( 'waveAmplitude_Y', value=0.0, minValue=-3.0, maxValue=3.0, parent=tentacleSettingsAttrGrp) waveFrequency_YInputAttr = ScalarAttribute( 'waveFrequency_Y', value=2.0, minValue=0.0, maxValue=10.0, parent=tentacleSettingsAttrGrp) waveLength_ZInputAttr = ScalarAttribute('waveLength_Z', value=2.329, minValue=0.0, maxValue=5.0, parent=tentacleSettingsAttrGrp) waveAmplitude_ZInputAttr = ScalarAttribute( 'waveAmplitude_Z', value=0.0, minValue=-3.0, maxValue=3.0, parent=tentacleSettingsAttrGrp) waveFrequency_ZInputAttr = ScalarAttribute( 'waveFrequency_Z', value=3.354, minValue=0.0, maxValue=10.0, parent=tentacleSettingsAttrGrp) tipBiasInputAttr = ScalarAttribute('tipBias', value=1.0, minValue=0.0, maxValue=1.0, parent=tentacleSettingsAttrGrp) springStrengthInputAttr = ScalarAttribute( 'springStrength', value=0.3, minValue=0.0, maxValue=1.0, parent=tentacleSettingsAttrGrp) dampeningInputAttr = ScalarAttribute('dampening', value=0.03, minValue=0.0, maxValue=1.0, parent=tentacleSettingsAttrGrp) simulationWeightInputAttr = ScalarAttribute( 'simulationWeight', value=1.0, minValue=0.0, maxValue=1.0, parent=tentacleSettingsAttrGrp) softLimitBoundsInputAttr = ScalarAttribute( 'softLimitBounds', value=5.0, minValue=0.0, maxValue=10.0, parent=tentacleSettingsAttrGrp) # Connect IO to controls self.drawDebugInputAttr.connect(tentacledrawDebugInputAttr) # ========== # Deformers # ========== deformersLayer = self.getOrCreateLayer('deformers') self.defCmpGrp = ComponentGroup(self.getName(), self, parent=deformersLayer) self.deformerJoints = [] self.boneOutputsTgt = [] self.setNumDeformers(4) # ===================== # Create Component I/O # ===================== # Set IO Targets self.boneOutputs.setTarget(self.boneOutputsTgt) # ============== # Constrain I/O # ============== # Constraint inputs tentacleRootInputConstraint = PoseConstraint('_'.join([ self.fkCtrlSpaces[0].getName(), 'To', self.rootInputTgt.getName() ])) tentacleRootInputConstraint.setMaintainOffset(True) tentacleRootInputConstraint.addConstrainer(self.rootInputTgt) self.fkCtrlSpaces[0].addConstraint(tentacleRootInputConstraint) tentacleRootInputConstraint = PoseConstraint('_'.join([ self.tentacleIKCtrlSpace.getName(), 'To', self.rootInputTgt.getName() ])) tentacleRootInputConstraint.setMaintainOffset(True) tentacleRootInputConstraint.addConstrainer(self.rootInputTgt) self.tentacleIKCtrlSpace.addConstraint(tentacleRootInputConstraint) chainBaseInputConstraint = PoseConstraint('_'.join( [self.chainBase.getName(), 'To', self.rootInputTgt.getName()])) chainBaseInputConstraint.setMaintainOffset(True) chainBaseInputConstraint.addConstrainer(self.rootInputTgt) self.chainBase.addConstraint(chainBaseInputConstraint) # =============== # Add Splice Ops # =============== # Add Splice Op self.tentacleSolverKLOp = KLOperator('tentacleKLOp', 'TentacleSolver', 'Kraken') self.addOperator(self.tentacleSolverKLOp) # # Add Att Inputs self.tentacleSolverKLOp.setInput('drawDebug', self.drawDebugInputAttr) self.tentacleSolverKLOp.setInput('rigScale', self.rigScaleInputAttr) self.tentacleSolverKLOp.setInput('ikblend', fkikInputAttr) self.tentacleSolverKLOp.setInput('waveLength_Y', waveLength_YInputAttr) self.tentacleSolverKLOp.setInput('waveAmplitude_Y', waveAmplitude_YInputAttr) self.tentacleSolverKLOp.setInput('waveFrequency_Y', waveFrequency_YInputAttr) self.tentacleSolverKLOp.setInput('waveLength_Z', waveLength_ZInputAttr) self.tentacleSolverKLOp.setInput('waveAmplitude_Z', waveAmplitude_ZInputAttr) self.tentacleSolverKLOp.setInput('waveFrequency_Z', waveFrequency_ZInputAttr) self.tentacleSolverKLOp.setInput('tipBias', tipBiasInputAttr) self.tentacleSolverKLOp.setInput('springStrength', springStrengthInputAttr) self.tentacleSolverKLOp.setInput('dampening', dampeningInputAttr) self.tentacleSolverKLOp.setInput('simulationWeight', simulationWeightInputAttr) self.tentacleSolverKLOp.setInput('softLimitBounds', softLimitBoundsInputAttr) self.tentacleSolverKLOp.setInput('tipBoneLen', self.tipBoneLenInputAttr) # Add Xfo Inputs self.tentacleSolverKLOp.setInput('chainBase', self.chainBase) self.tentacleSolverKLOp.setInput('ikgoal', self.tentacleIKCtrl) self.tentacleSolverKLOp.setInput('fkcontrols', self.fkCtrls) # Add Xfo Outputs self.tentacleSolverKLOp.setOutput('pose', self.boneOutputsTgt) self.tentacleSolverKLOp.setOutput('tentacleEnd', self.tentacleEndXfoOutputTgt) # Add Deformer Splice Op self.outputsToDeformersKLOp = KLOperator('TentacleDeformerKLOp', 'MultiPoseConstraintSolver', 'Kraken') self.addOperator(self.outputsToDeformersKLOp) # Add Att Inputs self.outputsToDeformersKLOp.setInput('drawDebug', self.drawDebugInputAttr) self.outputsToDeformersKLOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Inputs self.outputsToDeformersKLOp.setInput('constrainers', self.boneOutputsTgt) # Add Xfo Outputs self.outputsToDeformersKLOp.setOutput('constrainees', self.deformerJoints) Profiler.getInstance().pop()
from kraken import plugins from kraken.core.objects.locator import Locator from kraken.core.objects.constraints.pose_constraint import PoseConstraint from kraken.core.traverser.traverser import Traverser locA = Locator("locatorA") locB = Locator("locatorB") constraint = PoseConstraint("A to B") constraint.addConstrainer(locB) constraint.setConstrainee(locA) trav = Traverser() trav.addRootItem(locA) def callback(**args): item = args.get('item', None) print 'Visited '+item.getDecoratedPath() trav.traverse(itemCallback = callback)
class HandComponentRig(HandComponent): """Hand Component""" def __init__(self, name='Hand', parent=None): Profiler.getInstance().push("Construct Hand Rig Component:" + name) super(HandComponentRig, self).__init__(name, parent) # ========= # Controls # ========= # Hand self.handCtrlSpace = CtrlSpace('hand', parent=self.ctrlCmpGrp) self.handCtrl = Control('hand', parent=self.handCtrlSpace, shape="square") self.handCtrl.rotatePoints(0, 0, 90.0) self.handCtrl.lockScale(True, True, True) self.handCtrl.lockTranslation(True, True, True) # ========== # Deformers # ========== self.deformersLayer = self.getOrCreateLayer('deformers') self.defCmpGrp = ComponentGroup(self.getName(), self, parent=self.deformersLayer) self.addItem('defCmpGrp', self.defCmpGrp) self.handDef = Joint('hand', parent=self.defCmpGrp) self.handDef.setComponent(self) # ============== # Constrain I/O # ============== # Constraint inputs self.armEndInputConstraint = PoseConstraint('_'.join([ self.handCtrlSpace.getName(), 'To', self.armEndInputTgt.getName() ])) self.armEndInputConstraint.setMaintainOffset(True) self.armEndInputConstraint.addConstrainer(self.armEndInputTgt) self.handCtrlSpace.addConstraint(self.armEndInputConstraint) # Constraint outputs self.handOutputConstraint = PoseConstraint('_'.join( [self.handOutputTgt.getName(), 'To', self.handCtrl.getName()])) self.handOutputConstraint.addConstrainer(self.handCtrl) self.handOutputTgt.addConstraint(self.handOutputConstraint) # Constraint deformers self.handDefConstraint = PoseConstraint('_'.join( [self.handDef.getName(), 'To', self.handCtrl.getName()])) self.handDefConstraint.addConstrainer(self.handCtrl) self.handDef.addConstraint(self.handDefConstraint) Profiler.getInstance().pop() def addFinger(self, name, data): fingerCtrls = [] fingerJoints = [] parentCtrl = self.handCtrl for i, joint in enumerate(data): if i == 0: jointName = name + 'Meta' else: jointName = name + str(i).zfill(2) jointXfo = joint.get('xfo', Xfo()) jointCrvData = joint.get('curveData') # Create Controls newJointCtrlSpace = CtrlSpace(jointName, parent=parentCtrl) newJointCtrl = Control(jointName, parent=newJointCtrlSpace, shape='square') newJointCtrl.lockScale(True, True, True) newJointCtrl.lockTranslation(True, True, True) if jointCrvData is not None: newJointCtrl.setCurveData(jointCrvData) fingerCtrls.append(newJointCtrl) # Create Deformers jointDef = Joint(jointName, parent=self.defCmpGrp) fingerJoints.append(jointDef) # Create Constraints # Set Xfos newJointCtrlSpace.xfo = jointXfo newJointCtrl.xfo = jointXfo parentCtrl = newJointCtrl # ================= # Create Operators # ================= # Add Deformer KL Op deformersToCtrlsKLOp = KLOperator(name + 'DeformerKLOp', 'MultiPoseConstraintSolver', 'Kraken') self.addOperator(deformersToCtrlsKLOp) # Add Att Inputs deformersToCtrlsKLOp.setInput('drawDebug', self.drawDebugInputAttr) deformersToCtrlsKLOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Inputs deformersToCtrlsKLOp.setInput('constrainers', fingerCtrls) # Add Xfo Outputs deformersToCtrlsKLOp.setOutput('constrainees', fingerJoints) return deformersToCtrlsKLOp def loadData(self, data=None): """Load a saved guide representation from persisted data. Arguments: data -- object, The JSON data object. Return: True if successful. """ super(HandComponentRig, self).loadData(data) # Data fingerData = data.get('fingerData') handXfo = data.get('handXfo', Xfo()) self.handCtrlSpace.xfo = handXfo self.handCtrl.xfo = handXfo fingerOps = [] for finger in fingerData.keys(): fingerOp = self.addFinger(finger, fingerData[finger]) fingerOps.append(fingerOp) # ============ # Set IO Xfos # ============ self.armEndInputTgt.xfo = handXfo self.handOutputTgt.xfo = handXfo # Eval Constraints self.armEndInputConstraint.evaluate() self.handOutputConstraint.evaluate() self.handDefConstraint.evaluate() # Eval Operators for op in fingerOps: op.evaluate()
class FabriceTailRig(FabriceTail): """Fabrice Tail Component""" def __init__(self, name="fabriceTail", parent=None): Profiler.getInstance().push("Construct Tail Rig Component:" + name) super(FabriceTailRig, self).__init__(name, parent) # ========= # Controls # ========= # Tail Base # self.tailBaseCtrlSpace = CtrlSpace('tailBase', parent=self.ctrlCmpGrp) # self.tailBaseCtrl = Control('tailBase', parent=self.tailBaseCtrlSpace, shape="circle") # self.tailBaseCtrl.rotatePoints(90, 0, 0) # self.tailBaseCtrl.scalePoints(Vec3(2.0, 2.0, 2.0)) # self.tailBaseCtrl.setColor("greenBlue") # Tail Base Handle self.tailBaseHandleCtrlSpace = CtrlSpace('tailBaseHandle', parent=self.ctrlCmpGrp) self.tailBaseHandleCtrl = Control('tailBaseHandle', parent=self.tailBaseHandleCtrlSpace, shape="pin") self.tailBaseHandleCtrl.lockScale(x=True, y=True, z=True) self.tailBaseHandleCtrl.setColor("turqoise") # Tail End Handle self.tailEndHandleCtrlSpace = CtrlSpace('tailEndHandle', parent=self.ctrlCmpGrp) self.tailEndHandleCtrl = Control('tailEndHandle', parent=self.tailEndHandleCtrlSpace, shape="pin") self.tailEndHandleCtrl.lockScale(x=True, y=True, z=True) self.tailEndHandleCtrl.setColor("turqoise") # Tail End self.tailEndCtrlSpace = CtrlSpace('tailEnd', parent=self.tailEndHandleCtrl) self.tailEndCtrl = Control('tailEnd', parent=self.tailEndCtrlSpace, shape="pin") self.tailEndCtrl.lockScale(x=True, y=True, z=True) self.tailEndCtrl.setColor("greenBlue") # ========== # Deformers # ========== deformersLayer = self.getOrCreateLayer('deformers') self.defCmpGrp = ComponentGroup(self.getName(), self, parent=deformersLayer) self.deformerJoints = [] self.tailOutputs = [] self.setNumDeformers(1) # ===================== # Create Component I/O # ===================== # Setup component Xfo I/O's self.tailVertebraeOutput.setTarget(self.tailOutputs) # ============== # Constrain I/O # ============== # Constraint inputs self.tailBaseHandleInputConstraint = PoseConstraint('_'.join([self.tailBaseHandleCtrlSpace.getName(), 'To', self.spineEndCtrlInputTgt.getName()])) self.tailBaseHandleInputConstraint.addConstrainer(self.spineEndCtrlInputTgt) self.tailBaseHandleInputConstraint.setMaintainOffset(True) self.tailBaseHandleCtrlSpace.addConstraint(self.tailBaseHandleInputConstraint) self.tailEndHandleInputConstraint = PoseConstraint('_'.join([self.tailEndHandleCtrlSpace.getName(), 'To', self.cogInputTgt.getName()])) self.tailEndHandleInputConstraint.addConstrainer(self.cogInputTgt) self.tailEndHandleInputConstraint.setMaintainOffset(True) self.tailEndHandleCtrlSpace.addConstraint(self.tailEndHandleInputConstraint) # Constraint outputs self.tailBaseOutputConstraint = PoseConstraint('_'.join([self.tailBaseOutputTgt.getName(), 'To', 'spineBase'])) self.tailBaseOutputConstraint.addConstrainer(self.tailOutputs[0]) self.tailBaseOutputTgt.addConstraint(self.tailBaseOutputConstraint) self.tailEndOutputConstraint = PoseConstraint('_'.join([self.tailEndOutputTgt.getName(), 'To', 'spineEnd'])) self.tailEndOutputConstraint.addConstrainer(self.tailOutputs[0]) self.tailEndOutputTgt.addConstraint(self.tailEndOutputConstraint) # =============== # Add Splice Ops # =============== # Add Tail Splice Op self.bezierTailKLOp = KLOperator('tailKLOp', 'BezierSpineSolver', 'Kraken') self.addOperator(self.bezierTailKLOp) # Add Att Inputs self.bezierTailKLOp.setInput('drawDebug', self.drawDebugInputAttr) self.bezierTailKLOp.setInput('rigScale', self.rigScaleInputAttr) self.bezierTailKLOp.setInput('length', self.lengthInputAttr) # Add Xfo Inputs self.bezierTailKLOp.setInput('base', self.spineEndInputTgt) self.bezierTailKLOp.setInput('baseHandle', self.tailBaseHandleCtrl) self.bezierTailKLOp.setInput('tipHandle', self.tailEndHandleCtrl) self.bezierTailKLOp.setInput('tip', self.tailEndCtrl) # Add Xfo Outputs self.bezierTailKLOp.setOutput('outputs', self.tailOutputs) # Add Deformer Splice Op self.deformersToOutputsKLOp = KLOperator('tailDeformerKLOp', 'MultiPoseConstraintSolver', 'Kraken') self.addOperator(self.deformersToOutputsKLOp) # Add Att Inputs self.deformersToOutputsKLOp.setInput('drawDebug', self.drawDebugInputAttr) self.deformersToOutputsKLOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Outputs self.deformersToOutputsKLOp.setInput('constrainers', self.tailOutputs) # Add Xfo Outputs self.deformersToOutputsKLOp.setOutput('constrainees', self.deformerJoints) Profiler.getInstance().pop() def setNumDeformers(self, numDeformers): # Add new deformers and outputs for i in xrange(len(self.tailOutputs), numDeformers): name = 'tail' + str(i + 1).zfill(2) tailOutput = ComponentOutput(name, parent=self.outputHrcGrp) self.tailOutputs.append(tailOutput) for i in xrange(len(self.deformerJoints), numDeformers): name = 'tail' + str(i + 1).zfill(2) tailDef = Joint(name, parent=self.defCmpGrp) tailDef.setComponent(self) self.deformerJoints.append(tailDef) return True def loadData(self, data=None): """Load a saved guide representation from persisted data. Arguments: data -- object, The JSON data object. Return: True if successful. """ super(FabriceTailRig, self).loadData( data ) tailBasePos = data['tailBasePos'] tailBaseHandlePos = data['tailBaseHandlePos'] tailBaseHandleCtrlCrvData = data['tailBaseHandleCtrlCrvData'] tailEndHandlePos = data['tailEndHandlePos'] tailEndHandleCtrlCrvData = data['tailEndHandleCtrlCrvData'] tailEndPos = data['tailEndPos'] tailEndCtrlCrvData = data['tailEndCtrlCrvData'] numDeformers = data['numDeformers'] # Set Xfos self.spineEndInputTgt.xfo.tr = tailBasePos self.spineEndCtrlInputTgt.xfo.tr = tailBasePos self.tailBaseHandleCtrlSpace.xfo.tr = tailBaseHandlePos self.tailBaseHandleCtrl.xfo.tr = tailBaseHandlePos self.tailBaseHandleCtrl.setCurveData(tailBaseHandleCtrlCrvData) self.tailEndHandleCtrlSpace.xfo.tr = tailEndHandlePos self.tailEndHandleCtrl.xfo.tr = tailEndHandlePos self.tailEndHandleCtrl.setCurveData(tailEndHandleCtrlCrvData) self.tailEndCtrlSpace.xfo.tr = tailEndPos self.tailEndCtrl.xfo.tr = tailEndPos self.tailEndCtrl.setCurveData(tailEndCtrlCrvData) length = tailBasePos.distanceTo(tailBaseHandlePos) + tailBaseHandlePos.distanceTo(tailEndHandlePos) + tailEndHandlePos.distanceTo(tailEndPos) self.lengthInputAttr.setMax(length * 3.0) self.lengthInputAttr.setValue(length) # Update number of deformers and outputs self.setNumDeformers(numDeformers) # Updating constraint to use the updated last output. self.tailEndOutputConstraint.setConstrainer(self.tailOutputs[-1], index=0) # ============ # Set IO Xfos # ============ # ==================== # Evaluate Splice Ops # ==================== # evaluate the spine op so that all the output transforms are updated. self.bezierTailKLOp.evaluate() # evaluate the constraint op so that all the joint transforms are updated. self.deformersToOutputsKLOp.evaluate() # evaluate the constraints to ensure the outputs are now in the correct location. self.tailBaseHandleInputConstraint.evaluate() self.tailBaseOutputConstraint.evaluate() self.tailEndOutputConstraint.evaluate()
class FabriceHeadRig(FabriceHead): """Fabrice Head Component Rig""" def __init__(self, name='h ead', parent=None): Profiler.getInstance().push("Construct Head Rig Component:" + name) super(FabriceHeadRig, self).__init__(name, parent) # ========= # Controls # ========= # Head Aim self.headAimCtrlSpace = CtrlSpace('headAim', parent=self.ctrlCmpGrp) self.headAimCtrl = Control('headAim', parent=self.headAimCtrlSpace, shape="sphere") self.headAimCtrl.scalePoints(Vec3(0.35, 0.35, 0.35)) self.headAimCtrl.lockScale(x=True, y=True, z=True) self.headAimUpV = Locator('headAimUpV', parent=self.headAimCtrl) self.headAimUpV.setShapeVisibility(False) # Head self.headAim = Locator('headAim', parent=self.ctrlCmpGrp) self.headAim.setShapeVisibility(False) self.headCtrlSpace = CtrlSpace('head', parent=self.ctrlCmpGrp) self.headCtrl = Control('head', parent=self.headCtrlSpace, shape="circle") self.headCtrl.lockTranslation(x=True, y=True, z=True) self.headCtrl.lockScale(x=True, y=True, z=True) # Jaw self.jawCtrlSpace = CtrlSpace('jawCtrlSpace', parent=self.headCtrl) self.jawCtrl = Control('jaw', parent=self.jawCtrlSpace, shape="cube") self.jawCtrl.lockTranslation(x=True, y=True, z=True) self.jawCtrl.lockScale(x=True, y=True, z=True) self.jawCtrl.setColor("orange") # ========== # Deformers # ========== deformersLayer = self.getOrCreateLayer('deformers') defCmpGrp = ComponentGroup(self.getName(), self, parent=deformersLayer) headDef = Joint('head', parent=defCmpGrp) headDef.setComponent(self) jawDef = Joint('jaw', parent=defCmpGrp) jawDef.setComponent(self) # ============== # Constrain I/O # ============== self.headToAimConstraint = PoseConstraint('_'.join( [self.headCtrlSpace.getName(), 'To', self.headAim.getName()])) self.headToAimConstraint.setMaintainOffset(True) self.headToAimConstraint.addConstrainer(self.headAim) self.headCtrlSpace.addConstraint(self.headToAimConstraint) # Constraint inputs self.headAimInputConstraint = PoseConstraint('_'.join([ self.headAimCtrlSpace.getName(), 'To', self.headBaseInputTgt.getName() ])) self.headAimInputConstraint.setMaintainOffset(True) self.headAimInputConstraint.addConstrainer(self.headBaseInputTgt) self.headAimCtrlSpace.addConstraint(self.headAimInputConstraint) # # Constraint outputs self.headOutputConstraint = PoseConstraint('_'.join( [self.headOutputTgt.getName(), 'To', self.headCtrl.getName()])) self.headOutputConstraint.addConstrainer(self.headCtrl) self.headOutputTgt.addConstraint(self.headOutputConstraint) self.jawOutputConstraint = PoseConstraint('_'.join( [self.jawOutputTgt.getName(), 'To', self.jawCtrl.getName()])) self.jawOutputConstraint.addConstrainer(self.jawCtrl) self.jawOutputTgt.addConstraint(self.jawOutputConstraint) # =============== # Add Splice Ops # =============== # Add Aim Splice Op # ================= # self.headAimCanvasOp = KLOperator('headAimCanvasOp', 'DirectionConstraintSolver', 'Kraken') self.headAimCanvasOp = CanvasOperator( 'headAimCanvasOp', 'Kraken.Solvers.DirectionConstraintSolver') self.addOperator(self.headAimCanvasOp) # Add Att Inputs self.headAimCanvasOp.setInput('drawDebug', self.drawDebugInputAttr) self.headAimCanvasOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Inputs self.headAimCanvasOp.setInput('position', self.headBaseInputTgt) self.headAimCanvasOp.setInput('upVector', self.headAimUpV) self.headAimCanvasOp.setInput('atVector', self.headAimCtrl) # Add Xfo Outputs self.headAimCanvasOp.setOutput('constrainee', self.headAim) # Add Deformer Splice Op # ====================== self.deformersToOutputsKLOp = KLOperator('headDeformerKLOp', 'MultiPoseConstraintSolver', 'Kraken') self.addOperator(self.deformersToOutputsKLOp) # Add Att Inputs self.deformersToOutputsKLOp.setInput('drawDebug', self.drawDebugInputAttr) self.deformersToOutputsKLOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Outputs self.deformersToOutputsKLOp.setInput( 'constrainers', [self.headOutputTgt, self.jawOutputTgt]) # Add Xfo Outputs self.deformersToOutputsKLOp.setOutput('constrainees', [headDef, jawDef]) Profiler.getInstance().pop() def loadData(self, data=None): """Load a saved guide representation from persisted data. Arguments: data -- object, The JSON data object. Return: True if successful. """ super(FabriceHeadRig, self).loadData(data) headXfo = data['headXfo'] headCtrlCrvData = data['headCtrlCrvData'] jawPosition = data['jawPosition'] jawCtrlCrvData = data['jawCtrlCrvData'] self.headAimCtrlSpace.xfo.ori = headXfo.ori self.headAimCtrlSpace.xfo.tr = headXfo.tr.add(Vec3(0, 0, 4)) self.headAimCtrl.xfo = self.headAimCtrlSpace.xfo self.headAimUpV.xfo.ori = self.headAimCtrl.xfo.ori self.headAimUpV.xfo.tr = self.headAimCtrl.xfo.tr.add(Vec3(0, 3, 0)) self.headAim.xfo = headXfo self.headCtrlSpace.xfo = headXfo self.headCtrl.xfo = headXfo self.headCtrl.setCurveData(headCtrlCrvData) self.jawCtrlSpace.xfo.tr = jawPosition self.jawCtrl.xfo.tr = jawPosition self.jawCtrl.setCurveData(jawCtrlCrvData) # ============ # Set IO Xfos # ============ self.headBaseInputTgt.xfo = headXfo self.headOutputTgt.xfo = headXfo self.jawOutputTgt.xfo.tr = jawPosition # ==================== # Evaluate Splice Ops # ==================== # evaluate the constraint op so that all the joint transforms are updated. self.headAimCanvasOp.evaluate() self.deformersToOutputsKLOp.evaluate() # evaluate the constraints to ensure the outputs are now in the correct location. self.headToAimConstraint.evaluate() self.headAimInputConstraint.evaluate() self.headOutputConstraint.evaluate() self.jawOutputConstraint.evaluate()
class LegComponentRig(LegComponent): """Leg Component""" def __init__(self, name='leg', parent=None): Profiler.getInstance().push("Construct Leg Rig Component:" + name) super(LegComponentRig, self).__init__(name, parent) # ========= # Controls # ========= # Femur self.femurFKCtrlSpace = CtrlSpace('femurFK', parent=self.ctrlCmpGrp) self.femurFKCtrl = Control('femurFK', parent=self.femurFKCtrlSpace, shape="cube") self.femurFKCtrl.alignOnXAxis() # Shin self.shinFKCtrlSpace = CtrlSpace('shinFK', parent=self.femurFKCtrl) self.shinFKCtrl = Control('shinFK', parent=self.shinFKCtrlSpace, shape="cube") self.shinFKCtrl.alignOnXAxis() # Ankle self.legIKCtrlSpace = CtrlSpace('IK', parent=self.ctrlCmpGrp) self.legIKCtrl = Control('IK', parent=self.legIKCtrlSpace, shape="pin") # FK Foot self.footCtrlSpace = CtrlSpace('foot', parent=self.ctrlCmpGrp) self.footCtrl = Control('foot', parent=self.footCtrlSpace, shape="cube") self.footCtrl.alignOnXAxis() # FK Toe self.toeCtrlSpace = CtrlSpace('toe', parent=self.footCtrl) self.toeCtrl = Control('toe', parent=self.toeCtrlSpace, shape="cube") self.toeCtrl.alignOnXAxis() # Rig Ref objects self.footRefSrt = Locator('footRef', parent=self.ctrlCmpGrp) # Add Component Params to IK control footSettingsAttrGrp = AttributeGroup("DisplayInfo_FootSettings", parent=self.footCtrl) footLinkToWorldInputAttr = ScalarAttribute('linkToWorld', 1.0, maxValue=1.0, parent=footSettingsAttrGrp) # Add Component Params to IK control legSettingsAttrGrp = AttributeGroup("DisplayInfo_LegSettings", parent=self.legIKCtrl) legDrawDebugInputAttr = BoolAttribute('drawDebug', value=False, parent=legSettingsAttrGrp) self.legBone0LenInputAttr = ScalarAttribute('bone0Len', value=1.0, parent=legSettingsAttrGrp) self.legBone1LenInputAttr = ScalarAttribute('bone1Len', value=1.0, parent=legSettingsAttrGrp) legIKBlendInputAttr = ScalarAttribute('ikblend', value=1.0, minValue=0.0, maxValue=1.0, parent=legSettingsAttrGrp) legSoftIKInputAttr = BoolAttribute('softIK', value=True, parent=legSettingsAttrGrp) legSoftDistInputAttr = ScalarAttribute('softDist', value=0.0, minValue=0.0, parent=legSettingsAttrGrp) legStretchInputAttr = BoolAttribute('stretch', value=True, parent=legSettingsAttrGrp) legStretchBlendInputAttr = ScalarAttribute('stretchBlend', value=0.0, minValue=0.0, maxValue=1.0, parent=legSettingsAttrGrp) self.drawDebugInputAttr.connect(legDrawDebugInputAttr) # UpV self.legUpVCtrlSpace = CtrlSpace('UpV', parent=self.ctrlCmpGrp) self.legUpVCtrl = Control('UpV', parent=self.legUpVCtrlSpace, shape="triangle") self.legUpVCtrl.alignOnZAxis() # ========== # Deformers # ========== deformersLayer = self.getOrCreateLayer('deformers') self.defCmpGrp = ComponentGroup(self.getName(), self, parent=deformersLayer) femurDef = Joint('femur', parent=self.defCmpGrp) femurDef.setComponent(self) shinDef = Joint('shin', parent=self.defCmpGrp) shinDef.setComponent(self) ankleDef = Joint('ankle', parent=self.defCmpGrp) ankleDef.setComponent(self) self.footDef = Joint('foot', parent=self.defCmpGrp) self.footDef.setComponent(self) self.toeDef = Joint('toe', parent=self.defCmpGrp) self.toeDef.setComponent(self) # ============== # Constrain I/O # ============== # Constraint inputs self.legIKCtrlSpaceInputConstraint = PoseConstraint('_'.join([self.legIKCtrlSpace.getName(), 'To', self.globalSRTInputTgt.getName()])) self.legIKCtrlSpaceInputConstraint.setMaintainOffset(True) self.legIKCtrlSpaceInputConstraint.addConstrainer(self.globalSRTInputTgt) self.legIKCtrlSpace.addConstraint(self.legIKCtrlSpaceInputConstraint) self.legUpVCtrlSpaceInputConstraint = PoseConstraint('_'.join([self.legUpVCtrlSpace.getName(), 'To', self.globalSRTInputTgt.getName()])) self.legUpVCtrlSpaceInputConstraint.setMaintainOffset(True) self.legUpVCtrlSpaceInputConstraint.addConstrainer(self.globalSRTInputTgt) self.legUpVCtrlSpace.addConstraint(self.legUpVCtrlSpaceInputConstraint) self.legRootInputConstraint = PoseConstraint('_'.join([self.legIKCtrl.getName(), 'To', self.legPelvisInputTgt.getName()])) self.legRootInputConstraint.setMaintainOffset(True) self.legRootInputConstraint.addConstrainer(self.legPelvisInputTgt) self.femurFKCtrlSpace.addConstraint(self.legRootInputConstraint) # Constraint outputs self.footOutputConstraint = PoseConstraint('_'.join([self.footOutputTgt.getName(), 'To', self.footCtrl.getName()])) self.footOutputConstraint.addConstrainer(self.footCtrl) self.footOutputTgt.addConstraint(self.footOutputConstraint) self.footCtrlSpaceConstraint = PoseConstraint('_'.join([self.footCtrlSpace.getName(), 'To', self.legEndXfoOutputTgt.getName()])) self.footCtrlSpaceConstraint.setMaintainOffset(True) self.footCtrlSpaceConstraint.addConstrainer(self.legEndXfoOutputTgt) self.footCtrlSpace.addConstraint(self.footCtrlSpaceConstraint) self.toeOutputConstraint = PoseConstraint('_'.join([self.toeOutputTgt.getName(), 'To', self.toeCtrl.getName()])) self.toeOutputConstraint.addConstrainer(self.toeCtrl) self.toeOutputTgt.addConstraint(self.toeOutputConstraint) # =============== # Add Splice Ops # =============== # Add Leg Splice Op self.legIKKLOp = KLOperator('legKLOp', 'TwoBoneIKSolver', 'Kraken') self.addOperator(self.legIKKLOp) # Add Att Inputs self.legIKKLOp.setInput('drawDebug', self.drawDebugInputAttr) self.legIKKLOp.setInput('rigScale', self.rigScaleInputAttr) self.legIKKLOp.setInput('bone0Len', self.legBone0LenInputAttr) self.legIKKLOp.setInput('bone1Len', self.legBone1LenInputAttr) self.legIKKLOp.setInput('ikblend', legIKBlendInputAttr) self.legIKKLOp.setInput('softIK', legSoftIKInputAttr) self.legIKKLOp.setInput('softDist', legSoftDistInputAttr) self.legIKKLOp.setInput('stretch', legStretchInputAttr) self.legIKKLOp.setInput('stretchBlend', legStretchBlendInputAttr) self.legIKKLOp.setInput('rightSide', self.rightSideInputAttr) # Add Xfo Inputs self.legIKKLOp.setInput('root', self.legPelvisInputTgt) self.legIKKLOp.setInput('bone0FK', self.femurFKCtrl) self.legIKKLOp.setInput('bone1FK', self.shinFKCtrl) self.legIKKLOp.setInput('ikHandle', self.legIKCtrl) self.legIKKLOp.setInput('upV', self.legUpVCtrl) # Add Xfo Outputs self.legIKKLOp.setOutput('bone0Out', self.femurOutputTgt) self.legIKKLOp.setOutput('bone1Out', self.shinOutputTgt) self.legIKKLOp.setOutput('bone2Out', self.legEndXfoOutputTgt) # Add Leg Deformer Splice Op self.outputsToDeformersKLOp = KLOperator('legDeformerKLOp', 'MultiPoseConstraintSolver', 'Kraken') self.addOperator(self.outputsToDeformersKLOp) # Add Att Inputs self.outputsToDeformersKLOp.setInput('drawDebug', self.drawDebugInputAttr) self.outputsToDeformersKLOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Inputs self.outputsToDeformersKLOp.setInput('constrainers', [self.femurOutputTgt, self.shinOutputTgt, self.legEndXfoOutputTgt]) # Add Xfo Outputs self.outputsToDeformersKLOp.setOutput('constrainees', [femurDef, shinDef, ankleDef]) # Add Foot Deformer Splice Op self.footDefKLOp = KLOperator('footDeformerKLOp', 'PoseConstraintSolver', 'Kraken') self.addOperator(self.footDefKLOp) # Add Att Inputs self.footDefKLOp.setInput('drawDebug', self.drawDebugInputAttr) self.footDefKLOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Inputs) self.footDefKLOp.setInput('constrainer', self.footOutputTgt) # Add Xfo Outputs self.footDefKLOp.setOutput('constrainee', self.footDef) # Add Toe Deformer Splice Op self.toeDefKLOp = KLOperator('toeDeformerKLOp', 'PoseConstraintSolver', 'Kraken') self.addOperator(self.toeDefKLOp) # Add Att Inputs self.toeDefKLOp.setInput('drawDebug', self.drawDebugInputAttr) self.toeDefKLOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Inputs self.toeDefKLOp.setInput('constrainer', self.toeOutputTgt) # Add Xfo Outputs self.toeDefKLOp.setOutput('constrainee', self.toeDef) Profiler.getInstance().pop() # ============= # Data Methods # ============= def loadData(self, data=None): """Load a saved guide representation from persisted data. Arguments: data -- object, The JSON data object. Return: True if successful. """ super(LegComponentRig, self).loadData( data ) self.femurFKCtrlSpace.xfo = data['femurXfo'] self.femurFKCtrl.xfo = data['femurXfo'] self.femurFKCtrl.scalePoints(Vec3(data['femurLen'], 1.75, 1.75)) self.femurOutputTgt.xfo = data['femurXfo'] self.shinOutputTgt.xfo = data['kneeXfo'] self.shinFKCtrlSpace.xfo = data['kneeXfo'] self.shinFKCtrl.xfo = data['kneeXfo'] self.shinFKCtrl.scalePoints(Vec3(data['shinLen'], 1.5, 1.5)) self.footCtrlSpace.xfo.tr = data['ankleXfo'].tr self.footCtrl.xfo.tr = data['ankleXfo'].tr self.toeCtrlSpace.xfo = data['toeXfo'] self.toeCtrl.xfo = data['toeXfo'] self.legIKCtrlSpace.xfo.tr = data['ankleXfo'].tr self.legIKCtrl.xfo.tr = data['ankleXfo'].tr if self.getLocation() == "R": self.legIKCtrl.rotatePoints(0, 90, 0) self.legIKCtrl.translatePoints(Vec3(-1.0, 0.0, 0.0)) else: self.legIKCtrl.rotatePoints(0, -90, 0) self.legIKCtrl.translatePoints(Vec3(1.0, 0.0, 0.0)) self.legUpVCtrlSpace.xfo = data['upVXfo'] self.legUpVCtrl.xfo = data['upVXfo'] self.rightSideInputAttr.setValue(self.getLocation() is 'R') self.legBone0LenInputAttr.setMin(0.0) self.legBone0LenInputAttr.setMax(data['femurLen'] * 3.0) self.legBone0LenInputAttr.setValue(data['femurLen']) self.legBone1LenInputAttr.setMin(0.0) self.legBone1LenInputAttr.setMax(data['shinLen'] * 3.0) self.legBone1LenInputAttr.setValue(data['shinLen']) self.legPelvisInputTgt.xfo = data['femurXfo'] # Eval Constraints self.legIKCtrlSpaceInputConstraint.evaluate() self.legUpVCtrlSpaceInputConstraint.evaluate() self.legRootInputConstraint.evaluate() self.footOutputConstraint.evaluate() self.toeOutputConstraint.evaluate() # Eval Operators self.legIKKLOp.evaluate() self.outputsToDeformersKLOp.evaluate() self.footDefKLOp.evaluate()
def __init__(self, name='h ead', parent=None): Profiler.getInstance().push("Construct Head Rig Component:" + name) super(FabriceHeadRig, self).__init__(name, parent) # ========= # Controls # ========= # Head Aim self.headAimCtrlSpace = CtrlSpace('headAim', parent=self.ctrlCmpGrp) self.headAimCtrl = Control('headAim', parent=self.headAimCtrlSpace, shape="sphere") self.headAimCtrl.scalePoints(Vec3(0.35, 0.35, 0.35)) self.headAimCtrl.lockScale(x=True, y=True, z=True) self.headAimUpV = Locator('headAimUpV', parent=self.headAimCtrl) self.headAimUpV.setShapeVisibility(False) # Head self.headAim = Locator('headAim', parent=self.ctrlCmpGrp) self.headAim.setShapeVisibility(False) self.headCtrlSpace = CtrlSpace('head', parent=self.ctrlCmpGrp) self.headCtrl = Control('head', parent=self.headCtrlSpace, shape="circle") self.headCtrl.lockTranslation(x=True, y=True, z=True) self.headCtrl.lockScale(x=True, y=True, z=True) # Jaw self.jawCtrlSpace = CtrlSpace('jawCtrlSpace', parent=self.headCtrl) self.jawCtrl = Control('jaw', parent=self.jawCtrlSpace, shape="cube") self.jawCtrl.lockTranslation(x=True, y=True, z=True) self.jawCtrl.lockScale(x=True, y=True, z=True) self.jawCtrl.setColor("orange") # ========== # Deformers # ========== deformersLayer = self.getOrCreateLayer('deformers') defCmpGrp = ComponentGroup(self.getName(), self, parent=deformersLayer) headDef = Joint('head', parent=defCmpGrp) headDef.setComponent(self) jawDef = Joint('jaw', parent=defCmpGrp) jawDef.setComponent(self) # ============== # Constrain I/O # ============== self.headToAimConstraint = PoseConstraint('_'.join( [self.headCtrlSpace.getName(), 'To', self.headAim.getName()])) self.headToAimConstraint.setMaintainOffset(True) self.headToAimConstraint.addConstrainer(self.headAim) self.headCtrlSpace.addConstraint(self.headToAimConstraint) # Constraint inputs self.headAimInputConstraint = PoseConstraint('_'.join([ self.headAimCtrlSpace.getName(), 'To', self.headBaseInputTgt.getName() ])) self.headAimInputConstraint.setMaintainOffset(True) self.headAimInputConstraint.addConstrainer(self.headBaseInputTgt) self.headAimCtrlSpace.addConstraint(self.headAimInputConstraint) # # Constraint outputs self.headOutputConstraint = PoseConstraint('_'.join( [self.headOutputTgt.getName(), 'To', self.headCtrl.getName()])) self.headOutputConstraint.addConstrainer(self.headCtrl) self.headOutputTgt.addConstraint(self.headOutputConstraint) self.jawOutputConstraint = PoseConstraint('_'.join( [self.jawOutputTgt.getName(), 'To', self.jawCtrl.getName()])) self.jawOutputConstraint.addConstrainer(self.jawCtrl) self.jawOutputTgt.addConstraint(self.jawOutputConstraint) # =============== # Add Splice Ops # =============== # Add Aim Splice Op # ================= # self.headAimCanvasOp = KLOperator('headAimCanvasOp', 'DirectionConstraintSolver', 'Kraken') self.headAimCanvasOp = CanvasOperator( 'headAimCanvasOp', 'Kraken.Solvers.DirectionConstraintSolver') self.addOperator(self.headAimCanvasOp) # Add Att Inputs self.headAimCanvasOp.setInput('drawDebug', self.drawDebugInputAttr) self.headAimCanvasOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Inputs self.headAimCanvasOp.setInput('position', self.headBaseInputTgt) self.headAimCanvasOp.setInput('upVector', self.headAimUpV) self.headAimCanvasOp.setInput('atVector', self.headAimCtrl) # Add Xfo Outputs self.headAimCanvasOp.setOutput('constrainee', self.headAim) # Add Deformer Splice Op # ====================== self.deformersToOutputsKLOp = KLOperator('headDeformerKLOp', 'MultiPoseConstraintSolver', 'Kraken') self.addOperator(self.deformersToOutputsKLOp) # Add Att Inputs self.deformersToOutputsKLOp.setInput('drawDebug', self.drawDebugInputAttr) self.deformersToOutputsKLOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Outputs self.deformersToOutputsKLOp.setInput( 'constrainers', [self.headOutputTgt, self.jawOutputTgt]) # Add Xfo Outputs self.deformersToOutputsKLOp.setOutput('constrainees', [headDef, jawDef]) Profiler.getInstance().pop()
class FKCollisionComponentRig(FKCollisionComponent): """FK Collision Rig""" def __init__(self, name='FKCollision', parent=None): Profiler.getInstance().push("Construct FK Collision Rig Component:" + name) super(FKCollisionComponentRig, self).__init__(name, parent) # ========= # Controls # ========= # Ground self.groundCtrl = Control('ground', parent=self.ctrlCmpGrp, shape='square') self.groundCtrl.insertCtrlSpace() groundSettingsAttrGrp = AttributeGroup("DisplayInfo_ChainSettings", parent=self.groundCtrl) self.groundOffsetYInputAttr = ScalarAttribute( 'ground_offsetY', 0.0, minValue=0.0, maxValue=10.0, parent=groundSettingsAttrGrp) # FK self.fkCtrlSpaces = [] self.fkCtrls = [] self.transforms = [] self.setNumControls(4) self.setNumTransforms(4) # Add Component Params to FK control chainSettingsAttrGrp = AttributeGroup("DisplayInfo_ChainSettings", parent=self.fkCtrls[0]) chainDrawDebugInputAttr = BoolAttribute('drawDebug', value=False, parent=chainSettingsAttrGrp) # Connect IO to controls self.drawDebugInputAttr.connect(chainDrawDebugInputAttr) # ========== # Deformers # ========== deformersLayer = self.getOrCreateLayer('deformers') self.defCmpGrp = ComponentGroup(self.getName(), self, parent=deformersLayer) self.addItem('defCmpGrp', self.defCmpGrp) self.deformerJoints = [] self.boneOutputsTgt = [] self.setNumDeformers(4) # ===================== # Create Component I/O # ===================== # Set IO Targets self.boneOutputs.setTarget(self.boneOutputsTgt) # ============== # Constrain I/O # ============== # Constrain inputs self.rootInputConstraint = PoseConstraint('_'.join([ self.fkCtrlSpaces[0].getName(), 'To', self.rootInputTgt.getName() ])) self.rootInputConstraint.setMaintainOffset(True) self.rootInputConstraint.addConstrainer(self.rootInputTgt) self.fkCtrlSpaces[0].addConstraint(self.rootInputConstraint) # =============== # Add Canvas Ops # =============== # Add Output Canvas Op self.collisionCanvasOp = CanvasOperator( 'collisionCanvasOp', 'Kraken.Solvers.CollideChainSolver') self.addOperator(self.collisionCanvasOp) # Add Att Inputs self.collisionCanvasOp.setInput('drawDebug', self.drawDebugInputAttr) self.collisionCanvasOp.setInput('rigScale', self.rigScaleInputAttr) self.collisionCanvasOp.setInput('ground_offsetY', self.groundOffsetYInputAttr) # Add Xfo Inputs self.collisionCanvasOp.setInput('ground', self.groundCtrl) self.collisionCanvasOp.setInput('joints', self.transforms) # Add Xfo Outputs self.collisionCanvasOp.setOutput('outputs', self.boneOutputsTgt) # Add Deformer Canvas Op self.deformersToOutputsKLOp = KLOperator('fkChainDeformerKLOp', 'MultiPoseConstraintSolver', 'Kraken') self.addOperator(self.deformersToOutputsKLOp) # Add Att Inputs self.deformersToOutputsKLOp.setInput('drawDebug', False) self.deformersToOutputsKLOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Inputs self.deformersToOutputsKLOp.setInput('constrainers', self.boneOutputsTgt) # Add Xfo Outputs self.deformersToOutputsKLOp.setOutput('constrainees', self.deformerJoints) Profiler.getInstance().pop() def setNumControls(self, numControls): # Add more controls if numControls > len(self.fkCtrlSpaces): for i in xrange(len(self.fkCtrlSpaces), numControls): if i == 0: parent = self.ctrlCmpGrp else: parent = self.fkCtrls[i - 1] boneName = 'bone' + str(i + 1).zfill(2) + 'FK' boneFKCtrlSpace = CtrlSpace(boneName, parent=parent) boneFKCtrl = Control(boneName, parent=boneFKCtrlSpace, shape="cube") boneFKCtrl.alignOnXAxis() self.fkCtrlSpaces.append(boneFKCtrlSpace) self.fkCtrls.append(boneFKCtrl) # Remove extra ctrls elif numControls < len(self.fkCtrlSpaces): numExtraCtrls = len(self.fkCtrls) - numControls for i in xrange(numExtraCtrls): extraCtrlSpace = self.fkCtrlSpaces.pop() extraCtrl = self.fkCtrls.pop() extraCtrlSpace.getParent().removeChild(extraCtrlSpace) extraCtrl.getParent().removeChild(extraCtrl) def setNumTransforms(self, numTransforms): numTransforms += 1 # Add more transforms if numTransforms > len(self.transforms): for i in xrange(len(self.transforms), numTransforms): name = 'transform' + str(i + 1).zfill(2) transform = Transform(name, parent=self.outputHrcGrp) self.transforms.append(transform) # Remove extra transforms elif numTransforms < len(self.transforms): numExtraTransforms = len(self.transforms) - numTransforms for i in xrange(numExtraTransforms): extraTransform = self.transforms.pop() extraTransform.getParent().removeChild(extraTransform) return True def setNumDeformers(self, numDeformers): # Add more deformers and outputs if numDeformers > len(self.boneOutputsTgt): for i in xrange(len(self.boneOutputsTgt), numDeformers): name = 'bone' + str(i + 1).zfill(2) defOutput = ComponentOutput(name, parent=self.outputHrcGrp) self.boneOutputsTgt.append(defOutput) boneDef = Joint(name, parent=self.defCmpGrp) boneDef.setComponent(self) self.deformerJoints.append(boneDef) # Remove extra deformers and outputs elif numDeformers < len(self.boneOutputsTgt): numExtraOutputs = len(self.boneOutputsTgt) - numDeformers numExtraDefs = len(self.deformerJoints) - numDeformers for i in xrange(numExtraOutputs): extraOutput = self.boneOutputsTgt.pop() extraDef = self.deformerJoints.pop() extraOutput.getParent().removeChild(extraOutput) extraDef.getParent().removeChild(extraDef) return True def loadData(self, data=None): """Load a saved guide representation from persisted data. Arguments: data -- object, The JSON data object. Return: True if successful. """ super(FKCollisionComponentRig, self).loadData(data) jointXfos = data['jointXfos'] boneXfos = data['boneXfos'] boneLengths = data['boneLengths'] numJoints = data['numJoints'] # Add extra controls and outputs self.setNumControls(numJoints) self.setNumTransforms(numJoints) self.setNumDeformers(numJoints) for i in xrange(numJoints): self.fkCtrlSpaces[i].xfo = boneXfos[i] self.fkCtrls[i].xfo = boneXfos[i] self.fkCtrls[i].scalePoints( Vec3(boneLengths[i], boneLengths[i] * 0.45, boneLengths[i] * 0.45)) for i in xrange(len(self.transforms)): self.transforms[i].xfo = jointXfos[i] # ========================== # Create Output Constraints # ========================== # This needs to be done here since the 'numJoints' attribute resizes the # number of controls and outputs self.chainEndXfoOutputConstraint = PoseConstraint('_'.join([ self.chainEndXfoOutputTgt.getName(), 'To', self.boneOutputsTgt[-1].getName() ])) self.chainEndXfoOutputConstraint.setMaintainOffset(True) self.chainEndXfoOutputConstraint.addConstrainer( self.boneOutputsTgt[-1]) self.chainEndXfoOutputTgt.addConstraint( self.chainEndXfoOutputConstraint) self.chainEndPosOutputConstraint = PositionConstraint('_'.join([ self.chainEndPosOutputTgt.getName(), 'To', self.boneOutputsTgt[-1].getName() ])) self.chainEndPosOutputConstraint.setMaintainOffset(True) self.chainEndPosOutputConstraint.addConstrainer( self.boneOutputsTgt[-1]) self.chainEndPosOutputTgt.addConstraint( self.chainEndPosOutputConstraint) self.transformConstraints = [] for i in xrange(len(self.transforms)): if i == len(self.transforms) - 1: constrainer = self.fkCtrls[i - 1] else: constrainer = self.fkCtrls[i] transformConstraint = PoseConstraint('_'.join( [self.transforms[i].getName(), 'To', constrainer.getName()])) transformConstraint.setMaintainOffset(True) transformConstraint.addConstrainer(constrainer) self.transforms[i].addConstraint(transformConstraint) self.transformConstraints.append(transformConstraint) # ============ # Set IO Xfos # ============ self.rootInputTgt.xfo = boneXfos[0] for i in xrange(numJoints): self.boneOutputsTgt[i].xfo = boneXfos[i] self.chainEndXfoOutputTgt.xfo = data['endXfo'] self.chainEndPosOutputTgt.xfo = data['endXfo'] # ============= # Set IO Attrs # ============= # ==================== # Evaluate Canvas Ops # ==================== # Eval Collision Op to evaulate with new outputs and controls self.collisionCanvasOp.evaluate() # evaluate the output splice op to evaluate with new outputs and deformers self.deformersToOutputsKLOp.evaluate() # evaluate the constraints to ensure the outputs are now in the correct location. for constraint in self.transformConstraints: constraint.evaluate() self.rootInputConstraint.evaluate() self.chainEndXfoOutputConstraint.evaluate()
class SpineComponentRig(SpineComponent): """Spine Component""" def __init__(self, name="spine", parent=None): Profiler.getInstance().push("Construct Spine Rig Component:" + name) super(SpineComponentRig, self).__init__(name, parent) # ========= # Controls # ========= # COG self.cogCtrlSpace = CtrlSpace('cog', parent=self.ctrlCmpGrp) self.cogCtrl = Control('cog', parent=self.cogCtrlSpace, shape="circle") self.cogCtrl.scalePoints(Vec3(6.0, 6.0, 6.0)) self.cogCtrl.setColor("orange") self.cogCtrl.lockScale(True, True, True) # Spine01 self.spine01CtrlSpace = CtrlSpace('spine01', parent=self.cogCtrl) self.spine01Ctrl = Control('spine01', parent=self.spine01CtrlSpace, shape="circle") self.spine01Ctrl.scalePoints(Vec3(4.0, 4.0, 4.0)) self.spine01Ctrl.lockScale(True, True, True) # Spine02 self.spine02CtrlSpace = CtrlSpace('spine02', parent=self.spine01Ctrl) self.spine02Ctrl = Control('spine02', parent=self.spine02CtrlSpace, shape="circle") self.spine02Ctrl.scalePoints(Vec3(4.5, 4.5, 4.5)) self.spine02Ctrl.lockScale(True, True, True) self.spine02Ctrl.setColor("blue") # Spine04 self.spine04CtrlSpace = CtrlSpace('spine04', parent=self.cogCtrl) self.spine04Ctrl = Control('spine04', parent=self.spine04CtrlSpace, shape="circle") self.spine04Ctrl.scalePoints(Vec3(6.0, 6.0, 6.0)) self.spine04Ctrl.lockScale(True, True, True) # Spine03 self.spine03CtrlSpace = CtrlSpace('spine03', parent=self.spine04Ctrl) self.spine03Ctrl = Control('spine03', parent=self.spine03CtrlSpace, shape="circle") self.spine03Ctrl.scalePoints(Vec3(4.5, 4.5, 4.5)) self.spine03Ctrl.lockScale(True, True, True) self.spine03Ctrl.setColor("blue") # Pelvis self.pelvisCtrlSpace = CtrlSpace('pelvis', parent=self.spine01Ctrl) self.pelvisCtrl = Control('pelvis', parent=self.pelvisCtrlSpace, shape="cube") self.pelvisCtrl.alignOnYAxis(negative=True) self.pelvisCtrl.scalePoints(Vec3(4.0, 0.375, 3.75)) self.pelvisCtrl.translatePoints(Vec3(0.0, -0.5, -0.25)) self.pelvisCtrl.lockTranslation(True, True, True) self.pelvisCtrl.lockScale(True, True, True) self.pelvisCtrl.setColor("blueLightMuted") # ========== # Deformers # ========== deformersLayer = self.getOrCreateLayer('deformers') self.defCmpGrp = ComponentGroup(self.getName(), self, parent=deformersLayer) self.addItem('defCmpGrp', self.defCmpGrp) self.deformerJoints = [] self.spineOutputs = [] self.setNumDeformers(1) pelvisDef = Joint('pelvis', parent=self.defCmpGrp) pelvisDef.setComponent(self) # ===================== # Create Component I/O # ===================== # Setup component Xfo I/O's self.spineVertebraeOutput.setTarget(self.spineOutputs) # ============== # Constrain I/O # ============== # Constraint inputs self.spineSrtInputConstraint = PoseConstraint('_'.join([self.cogCtrlSpace.getName(), 'To', self.globalSRTInputTgt.getName()])) self.spineSrtInputConstraint.addConstrainer(self.globalSRTInputTgt) self.spineSrtInputConstraint.setMaintainOffset(True) self.cogCtrlSpace.addConstraint(self.spineSrtInputConstraint) # Constraint outputs self.spineCogOutputConstraint = PoseConstraint('_'.join([self.spineCogOutputTgt.getName(), 'To', self.cogCtrl.getName()])) self.spineCogOutputConstraint.addConstrainer(self.cogCtrl) self.spineCogOutputTgt.addConstraint(self.spineCogOutputConstraint) self.spineBaseOutputConstraint = PoseConstraint('_'.join([self.spineBaseOutputTgt.getName(), 'To', 'spineBase'])) self.spineBaseOutputConstraint.addConstrainer(self.spineOutputs[0]) self.spineBaseOutputTgt.addConstraint(self.spineBaseOutputConstraint) self.pelvisOutputConstraint = PoseConstraint('_'.join([self.pelvisOutputTgt.getName(), 'To', self.pelvisCtrl.getName()])) self.pelvisOutputConstraint.addConstrainer(self.pelvisCtrl) self.pelvisOutputTgt.addConstraint(self.pelvisOutputConstraint) self.spineEndOutputConstraint = PoseConstraint('_'.join([self.spineEndOutputTgt.getName(), 'To', 'spineEnd'])) self.spineEndOutputConstraint.addConstrainer(self.spineOutputs[0]) self.spineEndOutputTgt.addConstraint(self.spineEndOutputConstraint) # =============== # Add Splice Ops # =============== # Add Spine Splice Op self.bezierSpineKLOp = KLOperator('spineKLOp', 'BezierSpineSolver', 'Kraken') self.addOperator(self.bezierSpineKLOp) # Add Att Inputs self.bezierSpineKLOp.setInput('drawDebug', self.drawDebugInputAttr) self.bezierSpineKLOp.setInput('rigScale', self.rigScaleInputAttr) self.bezierSpineKLOp.setInput('length', self.lengthInputAttr) # Add Xfo Inputs self.bezierSpineKLOp.setInput('base', self.spine01Ctrl) self.bezierSpineKLOp.setInput('baseHandle', self.spine02Ctrl) self.bezierSpineKLOp.setInput('tipHandle', self.spine03Ctrl) self.bezierSpineKLOp.setInput('tip', self.spine04Ctrl) # Add Xfo Outputs self.bezierSpineKLOp.setOutput('outputs', self.spineOutputs) # Add Deformer Splice Op self.deformersToOutputsKLOp = KLOperator('spineDeformerKLOp', 'MultiPoseConstraintSolver', 'Kraken') self.addOperator(self.deformersToOutputsKLOp) # Add Att Inputs self.deformersToOutputsKLOp.setInput('drawDebug', self.drawDebugInputAttr) self.deformersToOutputsKLOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Outputs self.deformersToOutputsKLOp.setInput('constrainers', self.spineOutputs) # Add Xfo Outputs self.deformersToOutputsKLOp.setOutput('constrainees', self.deformerJoints) # Add Pelvis Splice Op self.pelvisDefKLOp = KLOperator('pelvisDeformerKLOp', 'PoseConstraintSolver', 'Kraken') self.addOperator(self.pelvisDefKLOp) # Add Att Inputs self.pelvisDefKLOp.setInput('drawDebug', self.drawDebugInputAttr) self.pelvisDefKLOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Inputs self.pelvisDefKLOp.setInput('constrainer', self.pelvisOutputTgt) # Add Xfo Outputs self.pelvisDefKLOp.setOutput('constrainee', pelvisDef) Profiler.getInstance().pop() def setNumDeformers(self, numDeformers): # Add new deformers and outputs for i in xrange(len(self.spineOutputs), numDeformers): name = 'spine' + str(i + 1).zfill(2) spineOutput = ComponentOutput(name, parent=self.outputHrcGrp) self.spineOutputs.append(spineOutput) for i in xrange(len(self.deformerJoints), numDeformers): name = 'spine' + str(i + 1).zfill(2) spineDef = Joint(name, parent=self.defCmpGrp) spineDef.setComponent(self) self.deformerJoints.append(spineDef) return True def loadData(self, data=None): """Load a saved guide representation from persisted data. Arguments: data -- object, The JSON data object. Return: True if successful. """ super(SpineComponentRig, self).loadData( data ) cogPosition = data['cogPosition'] spine01Position = data['spine01Position'] spine02Position = data['spine02Position'] spine03Position = data['spine03Position'] spine04Position = data['spine04Position'] numDeformers = data['numDeformers'] self.cogCtrlSpace.xfo.tr = cogPosition self.cogCtrl.xfo.tr = cogPosition self.pelvisCtrlSpace.xfo.tr = cogPosition self.pelvisCtrl.xfo.tr = cogPosition self.spine01CtrlSpace.xfo.tr = spine01Position self.spine01Ctrl.xfo.tr = spine01Position self.spine02CtrlSpace.xfo.tr = spine02Position self.spine02Ctrl.xfo.tr = spine02Position self.spine03CtrlSpace.xfo.tr = spine03Position self.spine03Ctrl.xfo.tr = spine03Position self.spine04CtrlSpace.xfo.tr = spine04Position self.spine04Ctrl.xfo.tr = spine04Position length = spine01Position.distanceTo(spine02Position) + spine02Position.distanceTo(spine03Position) + spine03Position.distanceTo(spine04Position) self.lengthInputAttr.setMax(length * 3.0) self.lengthInputAttr.setValue(length) # Update number of deformers and outputs self.setNumDeformers(numDeformers) # Updating constraint to use the updated last output. self.spineEndOutputConstraint.setConstrainer(self.spineOutputs[-1], index=0) # ============ # Set IO Xfos # ============ # ==================== # Evaluate Splice Ops # ==================== # evaluate the spine op so that all the output transforms are updated. self.bezierSpineKLOp.evaluate() # evaluate the constraint op so that all the joint transforms are updated. self.deformersToOutputsKLOp.evaluate() self.pelvisDefKLOp.evaluate() # evaluate the constraints to ensure the outputs are now in the correct location. self.spineCogOutputConstraint.evaluate() self.spineBaseOutputConstraint.evaluate() self.pelvisOutputConstraint.evaluate() self.spineEndOutputConstraint.evaluate()
def loadData(self, data=None): """Load a saved guide representation from persisted data. Arguments: data -- object, The JSON data object. Return: True if successful. """ super(FKCollisionComponentRig, self).loadData(data) jointXfos = data['jointXfos'] boneXfos = data['boneXfos'] boneLengths = data['boneLengths'] numJoints = data['numJoints'] # Add extra controls and outputs self.setNumControls(numJoints) self.setNumTransforms(numJoints) self.setNumDeformers(numJoints) for i in xrange(numJoints): self.fkCtrlSpaces[i].xfo = boneXfos[i] self.fkCtrls[i].xfo = boneXfos[i] self.fkCtrls[i].scalePoints( Vec3(boneLengths[i], boneLengths[i] * 0.45, boneLengths[i] * 0.45)) for i in xrange(len(self.transforms)): self.transforms[i].xfo = jointXfos[i] # ========================== # Create Output Constraints # ========================== # This needs to be done here since the 'numJoints' attribute resizes the # number of controls and outputs self.chainEndXfoOutputConstraint = PoseConstraint('_'.join([ self.chainEndXfoOutputTgt.getName(), 'To', self.boneOutputsTgt[-1].getName() ])) self.chainEndXfoOutputConstraint.setMaintainOffset(True) self.chainEndXfoOutputConstraint.addConstrainer( self.boneOutputsTgt[-1]) self.chainEndXfoOutputTgt.addConstraint( self.chainEndXfoOutputConstraint) self.chainEndPosOutputConstraint = PositionConstraint('_'.join([ self.chainEndPosOutputTgt.getName(), 'To', self.boneOutputsTgt[-1].getName() ])) self.chainEndPosOutputConstraint.setMaintainOffset(True) self.chainEndPosOutputConstraint.addConstrainer( self.boneOutputsTgt[-1]) self.chainEndPosOutputTgt.addConstraint( self.chainEndPosOutputConstraint) self.transformConstraints = [] for i in xrange(len(self.transforms)): if i == len(self.transforms) - 1: constrainer = self.fkCtrls[i - 1] else: constrainer = self.fkCtrls[i] transformConstraint = PoseConstraint('_'.join( [self.transforms[i].getName(), 'To', constrainer.getName()])) transformConstraint.setMaintainOffset(True) transformConstraint.addConstrainer(constrainer) self.transforms[i].addConstraint(transformConstraint) self.transformConstraints.append(transformConstraint) # ============ # Set IO Xfos # ============ self.rootInputTgt.xfo = boneXfos[0] for i in xrange(numJoints): self.boneOutputsTgt[i].xfo = boneXfos[i] self.chainEndXfoOutputTgt.xfo = data['endXfo'] self.chainEndPosOutputTgt.xfo = data['endXfo'] # ============= # Set IO Attrs # ============= # ==================== # Evaluate Canvas Ops # ==================== # Eval Collision Op to evaulate with new outputs and controls self.collisionCanvasOp.evaluate() # evaluate the output splice op to evaluate with new outputs and deformers self.deformersToOutputsKLOp.evaluate() # evaluate the constraints to ensure the outputs are now in the correct location. for constraint in self.transformConstraints: constraint.evaluate() self.rootInputConstraint.evaluate() self.chainEndXfoOutputConstraint.evaluate()
def __init__(self, name="spine", parent=None): Profiler.getInstance().push("Construct Spine Rig Component:" + name) super(SpineComponentRig, self).__init__(name, parent) # ========= # Controls # ========= # COG self.cogCtrlSpace = CtrlSpace('cog', parent=self.ctrlCmpGrp) self.cogCtrl = Control('cog', parent=self.cogCtrlSpace, shape="circle") self.cogCtrl.scalePoints(Vec3(6.0, 6.0, 6.0)) self.cogCtrl.setColor("orange") self.cogCtrl.lockScale(True, True, True) # Spine01 self.spine01CtrlSpace = CtrlSpace('spine01', parent=self.cogCtrl) self.spine01Ctrl = Control('spine01', parent=self.spine01CtrlSpace, shape="circle") self.spine01Ctrl.scalePoints(Vec3(4.0, 4.0, 4.0)) self.spine01Ctrl.lockScale(True, True, True) # Spine02 self.spine02CtrlSpace = CtrlSpace('spine02', parent=self.spine01Ctrl) self.spine02Ctrl = Control('spine02', parent=self.spine02CtrlSpace, shape="circle") self.spine02Ctrl.scalePoints(Vec3(4.5, 4.5, 4.5)) self.spine02Ctrl.lockScale(True, True, True) self.spine02Ctrl.setColor("blue") # Spine04 self.spine04CtrlSpace = CtrlSpace('spine04', parent=self.cogCtrl) self.spine04Ctrl = Control('spine04', parent=self.spine04CtrlSpace, shape="circle") self.spine04Ctrl.scalePoints(Vec3(6.0, 6.0, 6.0)) self.spine04Ctrl.lockScale(True, True, True) # Spine03 self.spine03CtrlSpace = CtrlSpace('spine03', parent=self.spine04Ctrl) self.spine03Ctrl = Control('spine03', parent=self.spine03CtrlSpace, shape="circle") self.spine03Ctrl.scalePoints(Vec3(4.5, 4.5, 4.5)) self.spine03Ctrl.lockScale(True, True, True) self.spine03Ctrl.setColor("blue") # Pelvis self.pelvisCtrlSpace = CtrlSpace('pelvis', parent=self.spine01Ctrl) self.pelvisCtrl = Control('pelvis', parent=self.pelvisCtrlSpace, shape="cube") self.pelvisCtrl.alignOnYAxis(negative=True) self.pelvisCtrl.scalePoints(Vec3(4.0, 0.375, 3.75)) self.pelvisCtrl.translatePoints(Vec3(0.0, -0.5, -0.25)) self.pelvisCtrl.lockTranslation(True, True, True) self.pelvisCtrl.lockScale(True, True, True) self.pelvisCtrl.setColor("blueLightMuted") # ========== # Deformers # ========== deformersLayer = self.getOrCreateLayer('deformers') self.defCmpGrp = ComponentGroup(self.getName(), self, parent=deformersLayer) self.addItem('defCmpGrp', self.defCmpGrp) self.deformerJoints = [] self.spineOutputs = [] self.setNumDeformers(1) pelvisDef = Joint('pelvis', parent=self.defCmpGrp) pelvisDef.setComponent(self) # ===================== # Create Component I/O # ===================== # Setup component Xfo I/O's self.spineVertebraeOutput.setTarget(self.spineOutputs) # ============== # Constrain I/O # ============== # Constraint inputs self.spineSrtInputConstraint = PoseConstraint('_'.join([self.cogCtrlSpace.getName(), 'To', self.globalSRTInputTgt.getName()])) self.spineSrtInputConstraint.addConstrainer(self.globalSRTInputTgt) self.spineSrtInputConstraint.setMaintainOffset(True) self.cogCtrlSpace.addConstraint(self.spineSrtInputConstraint) # Constraint outputs self.spineCogOutputConstraint = PoseConstraint('_'.join([self.spineCogOutputTgt.getName(), 'To', self.cogCtrl.getName()])) self.spineCogOutputConstraint.addConstrainer(self.cogCtrl) self.spineCogOutputTgt.addConstraint(self.spineCogOutputConstraint) self.spineBaseOutputConstraint = PoseConstraint('_'.join([self.spineBaseOutputTgt.getName(), 'To', 'spineBase'])) self.spineBaseOutputConstraint.addConstrainer(self.spineOutputs[0]) self.spineBaseOutputTgt.addConstraint(self.spineBaseOutputConstraint) self.pelvisOutputConstraint = PoseConstraint('_'.join([self.pelvisOutputTgt.getName(), 'To', self.pelvisCtrl.getName()])) self.pelvisOutputConstraint.addConstrainer(self.pelvisCtrl) self.pelvisOutputTgt.addConstraint(self.pelvisOutputConstraint) self.spineEndOutputConstraint = PoseConstraint('_'.join([self.spineEndOutputTgt.getName(), 'To', 'spineEnd'])) self.spineEndOutputConstraint.addConstrainer(self.spineOutputs[0]) self.spineEndOutputTgt.addConstraint(self.spineEndOutputConstraint) # =============== # Add Splice Ops # =============== # Add Spine Splice Op self.bezierSpineKLOp = KLOperator('spineKLOp', 'BezierSpineSolver', 'Kraken') self.addOperator(self.bezierSpineKLOp) # Add Att Inputs self.bezierSpineKLOp.setInput('drawDebug', self.drawDebugInputAttr) self.bezierSpineKLOp.setInput('rigScale', self.rigScaleInputAttr) self.bezierSpineKLOp.setInput('length', self.lengthInputAttr) # Add Xfo Inputs self.bezierSpineKLOp.setInput('base', self.spine01Ctrl) self.bezierSpineKLOp.setInput('baseHandle', self.spine02Ctrl) self.bezierSpineKLOp.setInput('tipHandle', self.spine03Ctrl) self.bezierSpineKLOp.setInput('tip', self.spine04Ctrl) # Add Xfo Outputs self.bezierSpineKLOp.setOutput('outputs', self.spineOutputs) # Add Deformer Splice Op self.deformersToOutputsKLOp = KLOperator('spineDeformerKLOp', 'MultiPoseConstraintSolver', 'Kraken') self.addOperator(self.deformersToOutputsKLOp) # Add Att Inputs self.deformersToOutputsKLOp.setInput('drawDebug', self.drawDebugInputAttr) self.deformersToOutputsKLOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Outputs self.deformersToOutputsKLOp.setInput('constrainers', self.spineOutputs) # Add Xfo Outputs self.deformersToOutputsKLOp.setOutput('constrainees', self.deformerJoints) # Add Pelvis Splice Op self.pelvisDefKLOp = KLOperator('pelvisDeformerKLOp', 'PoseConstraintSolver', 'Kraken') self.addOperator(self.pelvisDefKLOp) # Add Att Inputs self.pelvisDefKLOp.setInput('drawDebug', self.drawDebugInputAttr) self.pelvisDefKLOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Inputs self.pelvisDefKLOp.setInput('constrainer', self.pelvisOutputTgt) # Add Xfo Outputs self.pelvisDefKLOp.setOutput('constrainee', pelvisDef) Profiler.getInstance().pop()
def __init__(self, name='head', parent=None): Profiler.getInstance().push("Construct Head Rig Component:" + name) super(HeadComponentRig, self).__init__(name, parent) # ========= # Controls # ========= # Head self.headCtrl = Control('head', parent=self.ctrlCmpGrp, shape='circle') self.headCtrl.lockScale(x=True, y=True, z=True) self.headCtrl.lockTranslation(x=True, y=True, z=True) self.headCtrlSpace = self.headCtrl.insertCtrlSpace() self.headCtrl.rotatePoints(0, 0, 90) self.headCtrl.scalePoints(Vec3(3, 3, 3)) self.headCtrl.translatePoints(Vec3(0, 1, 0.25)) # Eye Left self.eyeLeftCtrl = Control('eyeLeft', parent=self.ctrlCmpGrp, shape='sphere') self.eyeLeftCtrl.lockScale(x=True, y=True, z=True) self.eyeLeftCtrl.lockTranslation(x=True, y=True, z=True) self.eyeLeftCtrlSpace = self.eyeLeftCtrl.insertCtrlSpace() self.eyeLeftCtrl.rotatePoints(0, 90, 0) self.eyeLeftCtrl.scalePoints(Vec3(0.5, 0.5, 0.5)) self.eyeLeftCtrl.setColor('blueMedium') # Eye Right self.eyeRightCtrl = Control('eyeRight', parent=self.ctrlCmpGrp, shape='sphere') self.eyeRightCtrl.lockScale(x=True, y=True, z=True) self.eyeRightCtrl.lockTranslation(x=True, y=True, z=True) self.eyeRightCtrlSpace = self.eyeRightCtrl.insertCtrlSpace() self.eyeRightCtrl.rotatePoints(0, 90, 0) self.eyeRightCtrl.scalePoints(Vec3(0.5, 0.5, 0.5)) self.eyeRightCtrl.setColor('blueMedium') # LookAt Control self.lookAtCtrl = Control('lookAt', parent=self.ctrlCmpGrp, shape='square') self.lookAtCtrl.lockScale(x=True, y=True, z=True) self.lookAtCtrl.rotatePoints(90, 0, 0) self.lookAtCtrlSpace = self.lookAtCtrl.insertCtrlSpace() self.eyeLeftBase = Transform('eyeLeftBase', parent=self.headCtrl) self.eyeRightBase = Transform('eyeRightBase', parent=self.headCtrl) self.eyeLeftUpV = Transform('eyeLeftUpV', parent=self.headCtrl) self.eyeRightUpV = Transform('eyeRightUpV', parent=self.headCtrl) self.eyeLeftAtV = Transform('eyeLeftAtV', parent=self.lookAtCtrl) self.eyeRightAtV = Transform('eyeRightAtV', parent=self.lookAtCtrl) # Jaw self.jawCtrl = Control('jaw', parent=self.headCtrl, shape='cube') self.jawCtrlSpace = self.jawCtrl.insertCtrlSpace() self.jawCtrl.lockScale(x=True, y=True, z=True) self.jawCtrl.lockTranslation(x=True, y=True, z=True) self.jawCtrl.alignOnYAxis(negative=True) self.jawCtrl.alignOnZAxis() self.jawCtrl.scalePoints(Vec3(1.45, 0.65, 1.25)) self.jawCtrl.translatePoints(Vec3(0, -0.25, 0)) self.jawCtrl.setColor('orange') # ========== # Deformers # ========== deformersLayer = self.getOrCreateLayer('deformers') self.defCmpGrp = ComponentGroup(self.getName(), self, parent=deformersLayer) self.addItem('defCmpGrp', self.defCmpGrp) headDef = Joint('head', parent=self.defCmpGrp) headDef.setComponent(self) jawDef = Joint('jaw', parent=self.defCmpGrp) jawDef.setComponent(self) eyeLeftDef = Joint('eyeLeft', parent=self.defCmpGrp) eyeLeftDef.setComponent(self) eyeRightDef = Joint('eyeRight', parent=self.defCmpGrp) eyeRightDef.setComponent(self) # ============== # Constrain I/O # ============== # Constraint inputs self.headInputConstraint = PoseConstraint('_'.join([self.headCtrlSpace.getName(), 'To', self.neckRefInputTgt.getName()])) self.headInputConstraint.setMaintainOffset(True) self.headInputConstraint.addConstrainer(self.neckRefInputTgt) self.headCtrlSpace.addConstraint(self.headInputConstraint) # Constraint outputs self.headOutputConstraint = PoseConstraint('_'.join([self.headOutputTgt.getName(), 'To', self.headCtrl.getName()])) self.headOutputConstraint.addConstrainer(self.headCtrl) self.headOutputTgt.addConstraint(self.headOutputConstraint) self.jawOutputConstraint = PoseConstraint('_'.join([self.jawOutputTgt.getName(), 'To', self.jawCtrl.getName()])) self.jawOutputConstraint.addConstrainer(self.jawCtrl) self.jawOutputTgt.addConstraint(self.jawOutputConstraint) self.eyeLOutputConstraint = PoseConstraint('_'.join([self.eyeLOutputTgt.getName(), 'To', self.eyeLeftCtrl.getName()])) self.eyeLOutputConstraint.addConstrainer(self.eyeLeftCtrl) self.eyeLOutputTgt.addConstraint(self.eyeLOutputConstraint) self.eyeROutputConstraint = PoseConstraint('_'.join([self.eyeROutputTgt.getName(), 'To', self.eyeRightCtrl.getName()])) self.eyeROutputConstraint.addConstrainer(self.eyeRightCtrl) self.eyeROutputTgt.addConstraint(self.eyeROutputConstraint) # Add Eye Left Direction KL Op self.eyeLeftDirKLOp = KLOperator('eyeLeftDirKLOp', 'DirectionConstraintSolver', 'Kraken') self.addOperator(self.eyeLeftDirKLOp) # Add Att Inputs self.eyeLeftDirKLOp.setInput('drawDebug', self.drawDebugInputAttr) self.eyeLeftDirKLOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Inputs self.eyeLeftDirKLOp.setInput('position', self.eyeLeftBase) self.eyeLeftDirKLOp.setInput('upVector', self.eyeLeftUpV) self.eyeLeftDirKLOp.setInput('atVector', self.eyeLeftAtV) # Add Xfo Outputs self.eyeLeftDirKLOp.setOutput('constrainee', self.eyeLeftCtrlSpace) # Add Eye Right Direction KL Op self.eyeRightDirKLOp = KLOperator('eyeRightDirKLOp', 'DirectionConstraintSolver', 'Kraken') self.addOperator(self.eyeRightDirKLOp) # Add Att Inputs self.eyeRightDirKLOp.setInput('drawDebug', self.drawDebugInputAttr) self.eyeRightDirKLOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Inputs self.eyeRightDirKLOp.setInput('position', self.eyeRightBase) self.eyeRightDirKLOp.setInput('upVector', self.eyeRightUpV) self.eyeRightDirKLOp.setInput('atVector', self.eyeRightAtV) # Add Xfo Outputs self.eyeRightDirKLOp.setOutput('constrainee', self.eyeRightCtrlSpace) # Add Deformer Joints KL Op self.outputsToDeformersKLOp = KLOperator('headDeformerKLOp', 'MultiPoseConstraintSolver', 'Kraken') self.addOperator(self.outputsToDeformersKLOp) # Add Att Inputs self.outputsToDeformersKLOp.setInput('drawDebug', self.drawDebugInputAttr) self.outputsToDeformersKLOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Inputs self.outputsToDeformersKLOp.setInput('constrainers', [self.headOutputTgt, self.jawOutputTgt, self.eyeROutputTgt, self.eyeLOutputTgt]) # Add Xfo Outputs self.outputsToDeformersKLOp.setOutput('constrainees', [headDef, jawDef, eyeRightDef, eyeLeftDef]) Profiler.getInstance().pop()
def __init__(self, name='FKChain', parent=None): Profiler.getInstance().push("Construct FK Chain Rig Component:" + name) super(FKChainComponentRig, self).__init__(name, parent) # ========= # Controls # ========= # FK self.fkCtrlSpaces = [] self.fkCtrls = [] self.setNumControls(4) # Add Component Params to FK control chainSettingsAttrGrp = AttributeGroup("DisplayInfo_ChainSettings", parent=self.fkCtrls[0]) chainDrawDebugInputAttr = BoolAttribute('drawDebug', value=False, parent=chainSettingsAttrGrp) # Connect IO to controls self.drawDebugInputAttr.connect(chainDrawDebugInputAttr) # ========== # Deformers # ========== deformersLayer = self.getOrCreateLayer('deformers') self.defCmpGrp = ComponentGroup(self.getName(), self, parent=deformersLayer) self.addItem('defCmpGrp', self.defCmpGrp) self.deformerJoints = [] self.boneOutputsTgt = [] self.setNumDeformers(4) # ===================== # Create Component I/O # ===================== # Set IO Targets self.boneOutputs.setTarget(self.boneOutputsTgt) # ============== # Constrain I/O # ============== # Constraint inputs self.rootInputConstraint = PoseConstraint('_'.join([ self.fkCtrlSpaces[0].getName(), 'To', self.rootInputTgt.getName() ])) self.rootInputConstraint.setMaintainOffset(True) self.rootInputConstraint.addConstrainer(self.rootInputTgt) self.fkCtrlSpaces[0].addConstraint(self.rootInputConstraint) # =============== # Add Canvas Ops # =============== # Add Output Canvas Op self.outputsToControlsKLOp = KLOperator('outputConstraint', 'MultiPoseConstraintSolver', 'Kraken') self.addOperator(self.outputsToControlsKLOp) # Add Att Inputs self.outputsToControlsKLOp.setInput('drawDebug', self.drawDebugInputAttr) self.outputsToControlsKLOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Inputs self.outputsToControlsKLOp.setInput('constrainers', self.fkCtrls) # Add Xfo Outputs self.outputsToControlsKLOp.setOutput('constrainees', self.boneOutputsTgt) # Add Deformer Canvas Op self.deformersToOutputsKLOp = KLOperator('defConstraint', 'MultiPoseConstraintSolver', 'Kraken') self.addOperator(self.deformersToOutputsKLOp) # Add Att Inputs self.deformersToOutputsKLOp.setInput('drawDebug', self.drawDebugInputAttr) self.deformersToOutputsKLOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Inputs self.deformersToOutputsKLOp.setInput('constrainers', self.boneOutputsTgt) # Add Xfo Outputs self.deformersToOutputsKLOp.setOutput('constrainees', self.deformerJoints) Profiler.getInstance().pop()
def __init__(self, name, parent=None, location='M'): super(FootComponent, self).__init__(name, parent, location) # ========= # Controls # ========= # Setup component attributes defaultAttrGroup = self.getAttributeGroupByIndex(0) defaultAttrGroup.addAttribute(BoolAttribute("toggleDebugging", True)) # Default values if location == 'R': ctrlColor = "red" footPosition = Vec3(-7.1886, 12.2819, 0.4906) footUpV = Vec3(-1.7454, 0.1922, -1.7397) footEndPosition = Vec3(-2.0939, 0.4288, 0.0944) else: ctrlColor = "greenBright" footPosition = Vec3(7.1886, 12.2819, 0.4906) footUpV = Vec3(1.7454, 0.1922, -1.7397) footEndPosition = Vec3(2.0939, 0.4288, 0.0944) # Calculate Clavicle Xfo rootToEnd = footEndPosition.subtract(footPosition).unit() rootToUpV = footUpV.subtract(footPosition).unit() bone1ZAxis = rootToEnd.cross(rootToUpV).unit() bone1Normal = rootToEnd.cross(bone1ZAxis).unit() footXfo = Xfo() if location == "R": footQuat = Quat(Vec3(0.5695, -0.6377, 0.4190), 0.3053) footPos = Vec3(-1.841, 1.1516, -1.237) else: footQuat = Quat(Vec3(0.6377, -0.5695, 0.3053), 0.4190) footPos = Vec3(1.841, 1.1516, -1.237) footXfo.rot = footQuat.clone() footXfo.tr.copy(footPos) # Add Controls footCtrlSrtBuffer = SrtBuffer('foot', parent=self) footCtrlSrtBuffer.xfo.copy(footXfo) footCtrl = CubeControl('foot', parent=footCtrlSrtBuffer) footCtrl.alignOnXAxis() footCtrl.scalePoints(Vec3(2.5, 1.5, 0.75)) footCtrl.xfo.copy(footCtrlSrtBuffer.xfo) footCtrl.setColor(ctrlColor) # Rig Ref objects footRefSrt = Locator('footRef', parent=self) footRefSrt.xfo.copy(footCtrlSrtBuffer.xfo) # Add Component Params to IK control footDebugInputAttr = BoolAttribute('debug', True) footLinkToWorldInputAttr = FloatAttribute('linkToWorld', 1.0, 0.0, 1.0) footSettingsAttrGrp = AttributeGroup("DisplayInfo_HandSettings") footCtrl.addAttributeGroup(footSettingsAttrGrp) footSettingsAttrGrp.addAttribute(footDebugInputAttr) footSettingsAttrGrp.addAttribute(footLinkToWorldInputAttr) # ========== # Deformers # ========== container = self.getParent().getParent() deformersLayer = container.getChildByName('deformers') footDef = Joint('foot') footDef.setComponent(self) deformersLayer.addChild(footDef) # ===================== # Create Component I/O # ===================== # Setup Component Xfo I/O's legEndXfoInput = Locator('legEndXfo') legEndXfoInput.xfo.copy(footCtrlSrtBuffer.xfo) legEndPosInput = Locator('legEndPos') legEndPosInput.xfo.copy(footCtrlSrtBuffer.xfo) footEndOutput = Locator('handEnd') footEndOutput.xfo.copy(footCtrlSrtBuffer.xfo) footOutput = Locator('hand') footOutput.xfo.copy(footCtrlSrtBuffer.xfo) # Setup componnent Attribute I/O's debugInputAttr = BoolAttribute('debug', True) rightSideInputAttr = BoolAttribute('rightSide', location is 'R') linkToWorldInputAttr = FloatAttribute('linkToWorld', 0.0, 0.0, 1.0) # Connect attrs to control attrs debugInputAttr.connect(footDebugInputAttr) linkToWorldInputAttr.connect(footLinkToWorldInputAttr) # ============== # Constrain I/O # ============== # Constraint inputs # Constraint outputs handConstraint = PoseConstraint('_'.join([footOutput.getName(), 'To', footCtrl.getName()])) handConstraint.addConstrainer(footCtrl) footOutput.addConstraint(handConstraint) handEndConstraint = PoseConstraint('_'.join([footEndOutput.getName(), 'To', footCtrl.getName()])) handEndConstraint.addConstrainer(footCtrl) footEndOutput.addConstraint(handEndConstraint) # ================== # Add Component I/O # ================== # Add Xfo I/O's self.addInput(legEndXfoInput) self.addInput(legEndPosInput) self.addOutput(footOutput) self.addOutput(footEndOutput) # Add Attribute I/O's self.addInput(debugInputAttr) self.addInput(rightSideInputAttr) self.addInput(linkToWorldInputAttr)
class MainSrtComponentRig(MainSrtComponent): """MainSrt Component Rig""" def __init__(self, name='mainSrt', parent=None): Profiler.getInstance().push("Construct MainSrt Rig Component:" + name) super(MainSrtComponentRig, self).__init__(name, parent) # ========= # Controls # ========= # Add Controls self.mainSRTCtrlSpace = CtrlSpace('SRT', parent=self.ctrlCmpGrp) self.mainSRTCtrl = Control('SRT', shape='circle', parent=self.mainSRTCtrlSpace) self.mainSRTCtrl.lockScale(x=True, y=True, z=True) self.offsetCtrlSpace = CtrlSpace('Offset', parent=self.mainSRTCtrl) self.offsetCtrl = Control('Offset', shape='circle', parent=self.offsetCtrlSpace) self.offsetCtrl.setColor("orange") self.offsetCtrl.lockScale(x=True, y=True, z=True) # Add Component Params to Main control mainSrtSettingsAttrGrp = AttributeGroup('DisplayInfo_MainSrtSettings', parent=self.mainSRTCtrl) self.rigScaleAttr = ScalarAttribute('rigScale', value=1.0, parent=mainSrtSettingsAttrGrp, minValue=0.1, maxValue=100.0) self.rigScaleOutputAttr.connect(self.rigScaleAttr) # ========== # Deformers # ========== # ============== # Constrain I/O # ============== # Constrain inputs # Constrain outputs self.srtOutputToSrtCtrlConstraint = PoseConstraint('_'.join( [self.srtOutputTgt.getName(), 'To', self.mainSRTCtrl.getName()])) self.srtOutputToSrtCtrlConstraint.addConstrainer(self.mainSRTCtrl) self.srtOutputTgt.addConstraint(self.srtOutputToSrtCtrlConstraint) self.offsetToSrtCtrlConstraint = PoseConstraint('_'.join( [self.offsetOutputTgt.getName(), 'To', self.mainSRTCtrl.getName()])) self.offsetToSrtCtrlConstraint.addConstrainer(self.offsetCtrl) self.offsetOutputTgt.addConstraint(self.offsetToSrtCtrlConstraint) # =============== # Add Canvas Ops # =============== # Add Rig Scale Canvas Op self.rigScaleOp = KLOperator('rigScale', 'RigScaleSolver', 'Kraken') self.addOperator(self.rigScaleOp) # Add Att Inputs self.rigScaleOp.setInput('drawDebug', self.drawDebugInputAttr) self.rigScaleOp.setInput('rigScale', self.rigScaleOutputAttr) # Add Xfo Inputs # Add Xfo Outputs self.rigScaleOp.setOutput('target', self.mainSRTCtrlSpace) Profiler.getInstance().pop() def loadData(self, data=None): """Load a saved guide representation from persisted data. Arguments: data -- object, The JSON data object. Return: True if successful. """ super(MainSrtComponentRig, self).loadData(data) # ================ # Resize Controls # ================ self.mainSRTCtrl.scalePoints( Vec3(data["mainSrtSize"], 1.0, data["mainSrtSize"])) self.offsetCtrl.scalePoints( Vec3(data["mainSrtSize"] - 0.5, 1.0, data["mainSrtSize"] - 0.5)) # ======================= # Set Control Transforms # ======================= self.mainSRTCtrlSpace.xfo = data["mainSrtXfo"] self.mainSRTCtrl.xfo = data["mainSrtXfo"] self.offsetCtrlSpace.xfo = data["mainSrtXfo"] self.offsetCtrl.xfo = data["mainSrtXfo"] # ============ # Set IO Xfos # ============ self.srtOutputTgt = data["mainSrtXfo"] self.offsetOutputTgt = data["mainSrtXfo"] # Evaluate Constraints self.srtOutputToSrtCtrlConstraint.evaluate() self.offsetToSrtCtrlConstraint.evaluate() # Evaluate Operators self.rigScaleOp.evaluate()
def __init__(self, name="neck", parent=None): Profiler.getInstance().push("Construct Neck Rig Component:" + name) super(NeckComponentRig, self).__init__(name, parent) # ========= # Controls # ========= # Neck self.neckCtrlSpace = CtrlSpace('neck', parent=self.ctrlCmpGrp) self.neckCtrl = Control('neck', parent=self.neckCtrlSpace, shape="pin") self.neckCtrl.scalePoints(Vec3(1.25, 1.25, 1.25)) self.neckCtrl.translatePoints(Vec3(0, 0, -0.5)) self.neckCtrl.rotatePoints(90, 0, 90) self.neckCtrl.setColor("orange") # ========== # Deformers # ========== deformersLayer = self.getOrCreateLayer('deformers') defCmpGrp = ComponentGroup(self.getName(), self, parent=deformersLayer) neckDef = Joint('neck', parent=defCmpGrp) neckDef.setComponent(self) # ============== # Constrain I/O # ============== # Constraint inputs clavicleInputConstraint = PoseConstraint('_'.join([self.neckCtrlSpace.getName(), 'To', self.neckBaseInputTgt.getName()])) clavicleInputConstraint.setMaintainOffset(True) clavicleInputConstraint.addConstrainer(self.neckBaseInputTgt) self.neckCtrlSpace.addConstraint(clavicleInputConstraint) # Constraint outputs neckOutputConstraint = PoseConstraint('_'.join([self.neckOutputTgt.getName(), 'To', self.neckCtrl.getName()])) neckOutputConstraint.addConstrainer(self.neckCtrl) self.neckOutputTgt.addConstraint(neckOutputConstraint) neckEndConstraint = PoseConstraint('_'.join([self.neckEndOutputTgt.getName(), 'To', self.neckCtrl.getName()])) neckEndConstraint.addConstrainer(self.neckCtrl) self.neckEndOutputTgt.addConstraint(neckEndConstraint) # =============== # Add Splice Ops # =============== #Add Deformer Splice Op spliceOp = KLOperator('neckDeformerKLOp', 'PoseConstraintSolver', 'Kraken') self.addOperator(spliceOp) # Add Att Inputs spliceOp.setInput('drawDebug', self.drawDebugInputAttr) spliceOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Inputstrl) spliceOp.setInput('constrainer', self.neckEndOutputTgt) # Add Xfo Outputs spliceOp.setOutput('constrainee', neckDef) Profiler.getInstance().pop()
class HeadComponentRig(HeadComponent): """Head Component Rig""" def __init__(self, name='head', parent=None): Profiler.getInstance().push("Construct Head Rig Component:" + name) super(HeadComponentRig, self).__init__(name, parent) # ========= # Controls # ========= # Head self.headCtrl = Control('head', parent=self.ctrlCmpGrp, shape='circle') self.headCtrl.lockScale(x=True, y=True, z=True) self.headCtrl.lockTranslation(x=True, y=True, z=True) self.headCtrlSpace = self.headCtrl.insertCtrlSpace() self.headCtrl.rotatePoints(0, 0, 90) self.headCtrl.scalePoints(Vec3(3, 3, 3)) self.headCtrl.translatePoints(Vec3(0, 1, 0.25)) # Eye Left self.eyeLeftCtrl = Control('eyeLeft', parent=self.ctrlCmpGrp, shape='sphere') self.eyeLeftCtrl.lockScale(x=True, y=True, z=True) self.eyeLeftCtrl.lockTranslation(x=True, y=True, z=True) self.eyeLeftCtrlSpace = self.eyeLeftCtrl.insertCtrlSpace() self.eyeLeftCtrl.rotatePoints(0, 90, 0) self.eyeLeftCtrl.scalePoints(Vec3(0.5, 0.5, 0.5)) self.eyeLeftCtrl.setColor('mediumblue') # Eye Right self.eyeRightCtrl = Control('eyeRight', parent=self.ctrlCmpGrp, shape='sphere') self.eyeRightCtrl.lockScale(x=True, y=True, z=True) self.eyeRightCtrl.lockTranslation(x=True, y=True, z=True) self.eyeRightCtrlSpace = self.eyeRightCtrl.insertCtrlSpace() self.eyeRightCtrl.rotatePoints(0, 90, 0) self.eyeRightCtrl.scalePoints(Vec3(0.5, 0.5, 0.5)) self.eyeRightCtrl.setColor('mediumblue') # LookAt Control self.lookAtCtrl = Control('lookAt', parent=self.ctrlCmpGrp, shape='square') self.lookAtCtrl.lockScale(x=True, y=True, z=True) self.lookAtCtrl.rotatePoints(90, 0, 0) self.lookAtCtrlSpace = self.lookAtCtrl.insertCtrlSpace() self.eyeLeftBase = Transform('eyeLeftBase', parent=self.headCtrl) self.eyeRightBase = Transform('eyeRightBase', parent=self.headCtrl) self.eyeLeftUpV = Transform('eyeLeftUpV', parent=self.headCtrl) self.eyeRightUpV = Transform('eyeRightUpV', parent=self.headCtrl) self.eyeLeftAtV = Transform('eyeLeftAtV', parent=self.lookAtCtrl) self.eyeRightAtV = Transform('eyeRightAtV', parent=self.lookAtCtrl) # Jaw self.jawCtrl = Control('jaw', parent=self.headCtrl, shape='cube') self.jawCtrlSpace = self.jawCtrl.insertCtrlSpace() self.jawCtrl.lockScale(x=True, y=True, z=True) self.jawCtrl.lockTranslation(x=True, y=True, z=True) self.jawCtrl.alignOnYAxis(negative=True) self.jawCtrl.alignOnZAxis() self.jawCtrl.scalePoints(Vec3(1.45, 0.65, 1.25)) self.jawCtrl.translatePoints(Vec3(0, -0.25, 0)) self.jawCtrl.setColor('orange') # ========== # Deformers # ========== deformersLayer = self.getOrCreateLayer('deformers') self.defCmpGrp = ComponentGroup(self.getName(), self, parent=deformersLayer) self.addItem('defCmpGrp', self.defCmpGrp) headDef = Joint('head', parent=self.defCmpGrp) headDef.setComponent(self) jawDef = Joint('jaw', parent=self.defCmpGrp) jawDef.setComponent(self) eyeLeftDef = Joint('eyeLeft', parent=self.defCmpGrp) eyeLeftDef.setComponent(self) eyeRightDef = Joint('eyeRight', parent=self.defCmpGrp) eyeRightDef.setComponent(self) # ============== # Constrain I/O # ============== # Constraint inputs self.headInputConstraint = PoseConstraint('_'.join([self.headCtrlSpace.getName(), 'To', self.neckRefInputTgt.getName()])) self.headInputConstraint.setMaintainOffset(True) self.headInputConstraint.addConstrainer(self.neckRefInputTgt) self.headCtrlSpace.addConstraint(self.headInputConstraint) # Constraint outputs self.headOutputConstraint = PoseConstraint('_'.join([self.headOutputTgt.getName(), 'To', self.headCtrl.getName()])) self.headOutputConstraint.addConstrainer(self.headCtrl) self.headOutputTgt.addConstraint(self.headOutputConstraint) self.jawOutputConstraint = PoseConstraint('_'.join([self.jawOutputTgt.getName(), 'To', self.jawCtrl.getName()])) self.jawOutputConstraint.addConstrainer(self.jawCtrl) self.jawOutputTgt.addConstraint(self.jawOutputConstraint) self.eyeLOutputConstraint = PoseConstraint('_'.join([self.eyeLOutputTgt.getName(), 'To', self.eyeLeftCtrl.getName()])) self.eyeLOutputConstraint.addConstrainer(self.eyeLeftCtrl) self.eyeLOutputTgt.addConstraint(self.eyeLOutputConstraint) self.eyeROutputConstraint = PoseConstraint('_'.join([self.eyeROutputTgt.getName(), 'To', self.eyeRightCtrl.getName()])) self.eyeROutputConstraint.addConstrainer(self.eyeRightCtrl) self.eyeROutputTgt.addConstraint(self.eyeROutputConstraint) # Add Eye Left Direction KL Op self.eyeLeftDirKLOp = KLOperator('eyeLeftDir', 'DirectionConstraintSolver', 'Kraken') self.addOperator(self.eyeLeftDirKLOp) # Add Att Inputs self.eyeLeftDirKLOp.setInput('drawDebug', self.drawDebugInputAttr) self.eyeLeftDirKLOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Inputs self.eyeLeftDirKLOp.setInput('position', self.eyeLeftBase) self.eyeLeftDirKLOp.setInput('upVector', self.eyeLeftUpV) self.eyeLeftDirKLOp.setInput('atVector', self.eyeLeftAtV) # Add Xfo Outputs self.eyeLeftDirKLOp.setOutput('constrainee', self.eyeLeftCtrlSpace) # Add Eye Right Direction KL Op self.eyeRightDirKLOp = KLOperator('eyeRightDir', 'DirectionConstraintSolver', 'Kraken') self.addOperator(self.eyeRightDirKLOp) # Add Att Inputs self.eyeRightDirKLOp.setInput('drawDebug', self.drawDebugInputAttr) self.eyeRightDirKLOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Inputs self.eyeRightDirKLOp.setInput('position', self.eyeRightBase) self.eyeRightDirKLOp.setInput('upVector', self.eyeRightUpV) self.eyeRightDirKLOp.setInput('atVector', self.eyeRightAtV) # Add Xfo Outputs self.eyeRightDirKLOp.setOutput('constrainee', self.eyeRightCtrlSpace) # Add Deformer Joints KL Op self.outputsToDeformersKLOp = KLOperator('defConstraint', 'MultiPoseConstraintSolver', 'Kraken') self.addOperator(self.outputsToDeformersKLOp) # Add Att Inputs self.outputsToDeformersKLOp.setInput('drawDebug', self.drawDebugInputAttr) self.outputsToDeformersKLOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Inputs self.outputsToDeformersKLOp.setInput('constrainers', [self.headOutputTgt, self.jawOutputTgt, self.eyeROutputTgt, self.eyeLOutputTgt]) # Add Xfo Outputs self.outputsToDeformersKLOp.setOutput('constrainees', [headDef, jawDef, eyeRightDef, eyeLeftDef]) Profiler.getInstance().pop() def loadData(self, data=None): """Load a saved guide representation from persisted data. Arguments: data -- object, The JSON data object. Return: True if successful. """ super(HeadComponentRig, self).loadData(data) headXfo = data.get('headXfo') headCrvData = data.get('headCrvData') eyeLeftXfo = data.get('eyeLeftXfo') eyeLeftCrvData = data.get('eyeLeftCrvData') eyeRightXfo = data.get('eyeRightXfo') eyeRightCrvData = data.get('eyeRightCrvData') jawXfo = data.get('jawXfo') jawCrvData = data.get('jawCrvData') self.headCtrlSpace.xfo = headXfo self.headCtrl.xfo = headXfo self.headCtrl.setCurveData(headCrvData) # self.eyeLeftCtrlSpace.xfo = eyeLeftXfo # self.eyeLeftCtrl.xfo = eyeLeftXfo self.eyeLeftCtrl.setCurveData(eyeLeftCrvData) # self.eyeRightCtrlSpace.xfo = eyeRightXfo # self.eyeRightCtrl.xfo = eyeRightXfo self.eyeRightCtrl.setCurveData(eyeRightCrvData) # LookAt eyeLeftRelXfo = headXfo.inverse() * eyeLeftXfo eyeRightRelXfo = headXfo.inverse() * eyeRightXfo eyeMidRelPos = eyeLeftRelXfo.tr.linearInterpolate(eyeRightRelXfo.tr, 0.5) eyeMidRelPos = eyeMidRelPos + Vec3(0.0, 0.0, 8.0) eyeLen = eyeLeftRelXfo.tr.distanceTo(eyeRightRelXfo.tr) self.eyeLeftBase.xfo = eyeLeftXfo self.eyeRightBase.xfo = eyeRightXfo self.eyeLeftUpV.xfo = eyeLeftXfo * Xfo(Vec3(0, 1, 0)) self.eyeRightUpV.xfo = eyeRightXfo * Xfo(Vec3(0, 1, 0)) self.eyeLeftAtV.xfo.tr = eyeLeftXfo.transformVector(Vec3(8.0, 0.0, 0.0)) self.eyeRightAtV.xfo.tr = eyeRightXfo.transformVector(Vec3(8.0, 0.0, 0.0)) lookAtXfo = headXfo.clone() lookAtXfo.tr = headXfo.transformVector(eyeMidRelPos) self.lookAtCtrl.scalePoints(Vec3(eyeLen * 1.6, eyeLen * 0.65, 1.0)) self.lookAtCtrl.xfo = lookAtXfo self.lookAtCtrlSpace.xfo = lookAtXfo self.jawCtrlSpace.xfo = jawXfo self.jawCtrl.xfo = jawXfo self.jawCtrl.setCurveData(jawCrvData) # ============ # Set IO Xfos # ============ self.neckRefInputTgt.xfo = headXfo self.worldRefInputTgt.xfo = headXfo self.headOutputTgt.xfo = headXfo self.jawOutputTgt.xfo = jawXfo self.eyeLOutputTgt.xfo = eyeLeftXfo self.eyeROutputTgt.xfo = eyeRightXfo # Eval Constraints self.headInputConstraint.evaluate() self.headOutputConstraint.evaluate() self.jawOutputConstraint.evaluate() self.eyeLOutputConstraint.evaluate() self.eyeROutputConstraint.evaluate() # Eval Operators self.eyeLeftDirKLOp.evaluate() self.eyeRightDirKLOp.evaluate() self.outputsToDeformersKLOp.evaluate() # Have to set the eye control xfos to match the evaluated xfos from self.eyeLeftCtrl.xfo = self.eyeLeftCtrlSpace.xfo self.eyeRightCtrl.xfo = self.eyeRightCtrlSpace.xfo
def __init__(self, name="arm", parent=None): Profiler.getInstance().push("Construct Arm Rig Component:" + name) super(ArmComponentRig, self).__init__(name, parent) # ========= # Controls # ========= # Bicep self.bicepFKCtrlSpace = CtrlSpace("bicepFK", parent=self.ctrlCmpGrp) self.bicepFKCtrl = Control("bicepFK", parent=self.bicepFKCtrlSpace, shape="cube") self.bicepFKCtrl.alignOnXAxis() # Forearm self.forearmFKCtrlSpace = CtrlSpace("forearmFK", parent=self.bicepFKCtrl) self.forearmFKCtrl = Control("forearmFK", parent=self.forearmFKCtrlSpace, shape="cube") self.forearmFKCtrl.alignOnXAxis() self.handCtrlSpace = CtrlSpace("hand", parent=self.ctrlCmpGrp) self.handCtrl = Control("hand", parent=self.handCtrlSpace, shape="circle") self.handCtrl.rotatePoints(0, 0, 90) self.handCtrl.scalePoints(Vec3(1.0, 0.75, 0.75)) # Arm IK self.armIKCtrlSpace = CtrlSpace("IK", parent=self.ctrlCmpGrp) self.armIKCtrl = Control("IK", parent=self.armIKCtrlSpace, shape="pin") # Add Params to IK control armSettingsAttrGrp = AttributeGroup("DisplayInfo_ArmSettings", parent=self.armIKCtrl) armDebugInputAttr = BoolAttribute("drawDebug", value=False, parent=armSettingsAttrGrp) self.armBone0LenInputAttr = ScalarAttribute("bone1Len", value=0.0, parent=armSettingsAttrGrp) self.armBone1LenInputAttr = ScalarAttribute("bone2Len", value=0.0, parent=armSettingsAttrGrp) armIKBlendInputAttr = ScalarAttribute("fkik", value=0.0, minValue=0.0, maxValue=1.0, parent=armSettingsAttrGrp) armSoftIKInputAttr = BoolAttribute("softIK", value=True, parent=armSettingsAttrGrp) armSoftDistInputAttr = ScalarAttribute("softDist", value=0.0, minValue=0.0, parent=armSettingsAttrGrp) armStretchInputAttr = BoolAttribute("stretch", value=True, parent=armSettingsAttrGrp) armStretchBlendInputAttr = ScalarAttribute( "stretchBlend", value=0.0, minValue=0.0, maxValue=1.0, parent=armSettingsAttrGrp ) # Hand Params handSettingsAttrGrp = AttributeGroup("DisplayInfo_HandSettings", parent=self.handCtrl) handLinkToWorldInputAttr = ScalarAttribute("linkToWorld", 0.0, maxValue=1.0, parent=handSettingsAttrGrp) self.drawDebugInputAttr.connect(armDebugInputAttr) # UpV self.armUpVCtrlSpace = CtrlSpace("UpV", parent=self.ctrlCmpGrp) self.armUpVCtrl = Control("UpV", parent=self.armUpVCtrlSpace, shape="triangle") self.armUpVCtrl.alignOnZAxis() self.armUpVCtrl.rotatePoints(180, 0, 0) # ========== # Deformers # ========== deformersLayer = self.getOrCreateLayer("deformers") defCmpGrp = ComponentGroup(self.getName(), self, parent=deformersLayer) bicepDef = Joint("bicep", parent=defCmpGrp) bicepDef.setComponent(self) forearmDef = Joint("forearm", parent=defCmpGrp) forearmDef.setComponent(self) wristDef = Joint("wrist", parent=defCmpGrp) wristDef.setComponent(self) handDef = Joint("hand", parent=defCmpGrp) handDef.setComponent(self) # ============== # Constrain I/O # ============== # Constraint inputs self.armIKCtrlSpaceInputConstraint = PoseConstraint( "_".join([self.armIKCtrlSpace.getName(), "To", self.globalSRTInputTgt.getName()]) ) self.armIKCtrlSpaceInputConstraint.setMaintainOffset(True) self.armIKCtrlSpaceInputConstraint.addConstrainer(self.globalSRTInputTgt) self.armIKCtrlSpace.addConstraint(self.armIKCtrlSpaceInputConstraint) self.armUpVCtrlSpaceInputConstraint = PoseConstraint( "_".join([self.armUpVCtrlSpace.getName(), "To", self.globalSRTInputTgt.getName()]) ) self.armUpVCtrlSpaceInputConstraint.setMaintainOffset(True) self.armUpVCtrlSpaceInputConstraint.addConstrainer(self.globalSRTInputTgt) self.armUpVCtrlSpace.addConstraint(self.armUpVCtrlSpaceInputConstraint) self.armRootInputConstraint = PoseConstraint( "_".join([self.bicepFKCtrlSpace.getName(), "To", self.clavicleEndInputTgt.getName()]) ) self.armRootInputConstraint.setMaintainOffset(True) self.armRootInputConstraint.addConstrainer(self.clavicleEndInputTgt) self.bicepFKCtrlSpace.addConstraint(self.armRootInputConstraint) # Constraint outputs self.handConstraint = PoseConstraint("_".join([self.handOutputTgt.getName(), "To", self.handCtrl.getName()])) self.handConstraint.addConstrainer(self.handCtrl) self.handOutputTgt.addConstraint(self.handConstraint) self.handCtrlSpaceConstraint = PoseConstraint( "_".join([self.handCtrlSpace.getName(), "To", self.armEndXfoOutputTgt.getName()]) ) self.handCtrlSpaceConstraint.setMaintainOffset(True) self.handCtrlSpaceConstraint.addConstrainer(self.armEndXfoOutputTgt) self.handCtrlSpace.addConstraint(self.handCtrlSpaceConstraint) # =============== # Add Splice Ops # =============== # Add Splice Op self.spliceOp = SpliceOperator("armSpliceOp", "TwoBoneIKSolver", "Kraken") self.addOperator(self.spliceOp) # Add Att Inputs self.spliceOp.setInput("drawDebug", self.drawDebugInputAttr) self.spliceOp.setInput("rigScale", self.rigScaleInputAttr) self.spliceOp.setInput("bone0Len", self.armBone0LenInputAttr) self.spliceOp.setInput("bone1Len", self.armBone1LenInputAttr) self.spliceOp.setInput("ikblend", armIKBlendInputAttr) self.spliceOp.setInput("softIK", armSoftIKInputAttr) self.spliceOp.setInput("softDist", armSoftDistInputAttr) self.spliceOp.setInput("stretch", armStretchInputAttr) self.spliceOp.setInput("stretchBlend", armStretchBlendInputAttr) self.spliceOp.setInput("rightSide", self.rightSideInputAttr) # Add Xfo Inputs self.spliceOp.setInput("root", self.clavicleEndInputTgt) self.spliceOp.setInput("bone0FK", self.bicepFKCtrl) self.spliceOp.setInput("bone1FK", self.forearmFKCtrl) self.spliceOp.setInput("ikHandle", self.armIKCtrl) self.spliceOp.setInput("upV", self.armUpVCtrl) # Add Xfo Outputs self.spliceOp.setOutput("bone0Out", self.bicepOutputTgt) self.spliceOp.setOutput("bone1Out", self.forearmOutputTgt) self.spliceOp.setOutput("bone2Out", self.armEndXfoOutputTgt) # Add Deformer Splice Op self.outputsToDeformersSpliceOp = SpliceOperator("armDeformerSpliceOp", "MultiPoseConstraintSolver", "Kraken") self.addOperator(self.outputsToDeformersSpliceOp) # Add Att Inputs self.outputsToDeformersSpliceOp.setInput("drawDebug", self.drawDebugInputAttr) self.outputsToDeformersSpliceOp.setInput("rigScale", self.rigScaleInputAttr) # Add Xfo Inputs self.outputsToDeformersSpliceOp.setInput( "constrainers", [self.bicepOutputTgt, self.forearmOutputTgt, self.armEndXfoOutputTgt, self.handOutputTgt] ) # Add Xfo Outputs self.outputsToDeformersSpliceOp.setOutput("constrainees", [bicepDef, forearmDef, wristDef, handDef]) Profiler.getInstance().pop()
def __init__(self, name='head', parent=None): Profiler.getInstance().push("Construct Head Rig Component:" + name) super(HeadComponentRig, self).__init__(name, parent) # ========= # Controls # ========= # Head self.headCtrl = Control('head', parent=self.ctrlCmpGrp, shape='circle') self.headCtrl.lockScale(x=True, y=True, z=True) self.headCtrl.lockTranslation(x=True, y=True, z=True) self.headCtrlSpace = self.headCtrl.insertCtrlSpace() self.headCtrl.rotatePoints(0, 0, 90) self.headCtrl.scalePoints(Vec3(3, 3, 3)) self.headCtrl.translatePoints(Vec3(0, 1, 0.25)) # Eye Left self.eyeLeftCtrl = Control('eyeLeft', parent=self.ctrlCmpGrp, shape='sphere') self.eyeLeftCtrl.lockScale(x=True, y=True, z=True) self.eyeLeftCtrl.lockTranslation(x=True, y=True, z=True) self.eyeLeftCtrlSpace = self.eyeLeftCtrl.insertCtrlSpace() self.eyeLeftCtrl.rotatePoints(0, 90, 0) self.eyeLeftCtrl.scalePoints(Vec3(0.5, 0.5, 0.5)) self.eyeLeftCtrl.setColor('mediumblue') # Eye Right self.eyeRightCtrl = Control('eyeRight', parent=self.ctrlCmpGrp, shape='sphere') self.eyeRightCtrl.lockScale(x=True, y=True, z=True) self.eyeRightCtrl.lockTranslation(x=True, y=True, z=True) self.eyeRightCtrlSpace = self.eyeRightCtrl.insertCtrlSpace() self.eyeRightCtrl.rotatePoints(0, 90, 0) self.eyeRightCtrl.scalePoints(Vec3(0.5, 0.5, 0.5)) self.eyeRightCtrl.setColor('mediumblue') # LookAt Control self.lookAtCtrl = Control('lookAt', parent=self.ctrlCmpGrp, shape='square') self.lookAtCtrl.lockScale(x=True, y=True, z=True) self.lookAtCtrl.rotatePoints(90, 0, 0) self.lookAtCtrlSpace = self.lookAtCtrl.insertCtrlSpace() self.eyeLeftBase = Transform('eyeLeftBase', parent=self.headCtrl) self.eyeRightBase = Transform('eyeRightBase', parent=self.headCtrl) self.eyeLeftUpV = Transform('eyeLeftUpV', parent=self.headCtrl) self.eyeRightUpV = Transform('eyeRightUpV', parent=self.headCtrl) self.eyeLeftAtV = Transform('eyeLeftAtV', parent=self.lookAtCtrl) self.eyeRightAtV = Transform('eyeRightAtV', parent=self.lookAtCtrl) # Jaw self.jawCtrl = Control('jaw', parent=self.headCtrl, shape='cube') self.jawCtrlSpace = self.jawCtrl.insertCtrlSpace() self.jawCtrl.lockScale(x=True, y=True, z=True) self.jawCtrl.lockTranslation(x=True, y=True, z=True) self.jawCtrl.alignOnYAxis(negative=True) self.jawCtrl.alignOnZAxis() self.jawCtrl.scalePoints(Vec3(1.45, 0.65, 1.25)) self.jawCtrl.translatePoints(Vec3(0, -0.25, 0)) self.jawCtrl.setColor('orange') # ========== # Deformers # ========== deformersLayer = self.getOrCreateLayer('deformers') self.defCmpGrp = ComponentGroup(self.getName(), self, parent=deformersLayer) self.addItem('defCmpGrp', self.defCmpGrp) headDef = Joint('head', parent=self.defCmpGrp) headDef.setComponent(self) jawDef = Joint('jaw', parent=self.defCmpGrp) jawDef.setComponent(self) eyeLeftDef = Joint('eyeLeft', parent=self.defCmpGrp) eyeLeftDef.setComponent(self) eyeRightDef = Joint('eyeRight', parent=self.defCmpGrp) eyeRightDef.setComponent(self) # ============== # Constrain I/O # ============== # Constraint inputs self.headInputConstraint = PoseConstraint('_'.join([self.headCtrlSpace.getName(), 'To', self.neckRefInputTgt.getName()])) self.headInputConstraint.setMaintainOffset(True) self.headInputConstraint.addConstrainer(self.neckRefInputTgt) self.headCtrlSpace.addConstraint(self.headInputConstraint) # Constraint outputs self.headOutputConstraint = PoseConstraint('_'.join([self.headOutputTgt.getName(), 'To', self.headCtrl.getName()])) self.headOutputConstraint.addConstrainer(self.headCtrl) self.headOutputTgt.addConstraint(self.headOutputConstraint) self.jawOutputConstraint = PoseConstraint('_'.join([self.jawOutputTgt.getName(), 'To', self.jawCtrl.getName()])) self.jawOutputConstraint.addConstrainer(self.jawCtrl) self.jawOutputTgt.addConstraint(self.jawOutputConstraint) self.eyeLOutputConstraint = PoseConstraint('_'.join([self.eyeLOutputTgt.getName(), 'To', self.eyeLeftCtrl.getName()])) self.eyeLOutputConstraint.addConstrainer(self.eyeLeftCtrl) self.eyeLOutputTgt.addConstraint(self.eyeLOutputConstraint) self.eyeROutputConstraint = PoseConstraint('_'.join([self.eyeROutputTgt.getName(), 'To', self.eyeRightCtrl.getName()])) self.eyeROutputConstraint.addConstrainer(self.eyeRightCtrl) self.eyeROutputTgt.addConstraint(self.eyeROutputConstraint) # Add Eye Left Direction KL Op self.eyeLeftDirKLOp = KLOperator('eyeLeftDir', 'DirectionConstraintSolver', 'Kraken') self.addOperator(self.eyeLeftDirKLOp) # Add Att Inputs self.eyeLeftDirKLOp.setInput('drawDebug', self.drawDebugInputAttr) self.eyeLeftDirKLOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Inputs self.eyeLeftDirKLOp.setInput('position', self.eyeLeftBase) self.eyeLeftDirKLOp.setInput('upVector', self.eyeLeftUpV) self.eyeLeftDirKLOp.setInput('atVector', self.eyeLeftAtV) # Add Xfo Outputs self.eyeLeftDirKLOp.setOutput('constrainee', self.eyeLeftCtrlSpace) # Add Eye Right Direction KL Op self.eyeRightDirKLOp = KLOperator('eyeRightDir', 'DirectionConstraintSolver', 'Kraken') self.addOperator(self.eyeRightDirKLOp) # Add Att Inputs self.eyeRightDirKLOp.setInput('drawDebug', self.drawDebugInputAttr) self.eyeRightDirKLOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Inputs self.eyeRightDirKLOp.setInput('position', self.eyeRightBase) self.eyeRightDirKLOp.setInput('upVector', self.eyeRightUpV) self.eyeRightDirKLOp.setInput('atVector', self.eyeRightAtV) # Add Xfo Outputs self.eyeRightDirKLOp.setOutput('constrainee', self.eyeRightCtrlSpace) # Add Deformer Joints KL Op self.outputsToDeformersKLOp = KLOperator('defConstraint', 'MultiPoseConstraintSolver', 'Kraken') self.addOperator(self.outputsToDeformersKLOp) # Add Att Inputs self.outputsToDeformersKLOp.setInput('drawDebug', self.drawDebugInputAttr) self.outputsToDeformersKLOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Inputs self.outputsToDeformersKLOp.setInput('constrainers', [self.headOutputTgt, self.jawOutputTgt, self.eyeROutputTgt, self.eyeLOutputTgt]) # Add Xfo Outputs self.outputsToDeformersKLOp.setOutput('constrainees', [headDef, jawDef, eyeRightDef, eyeLeftDef]) Profiler.getInstance().pop()
class SpineComponentRig(SpineComponent): """Spine Component""" def __init__(self, name="spine", parent=None): Profiler.getInstance().push("Construct Spine Rig Component:" + name) super(SpineComponentRig, self).__init__(name, parent) # ========= # Controls # ========= # COG self.cogCtrlSpace = CtrlSpace('cog', parent=self.ctrlCmpGrp) self.cogCtrl = Control('cog', parent=self.cogCtrlSpace, shape="circle") self.cogCtrl.scalePoints(Vec3(6.0, 6.0, 6.0)) self.cogCtrl.setColor("orange") self.cogCtrl.lockScale(True, True, True) # Spine01 self.spine01CtrlSpace = CtrlSpace('spine01', parent=self.cogCtrl) self.spine01Ctrl = Control('spine01', parent=self.spine01CtrlSpace, shape="circle") self.spine01Ctrl.scalePoints(Vec3(4.0, 4.0, 4.0)) self.spine01Ctrl.lockScale(True, True, True) # Spine02 self.spine02CtrlSpace = CtrlSpace('spine02', parent=self.spine01Ctrl) self.spine02Ctrl = Control('spine02', parent=self.spine02CtrlSpace, shape="circle") self.spine02Ctrl.scalePoints(Vec3(4.5, 4.5, 4.5)) self.spine02Ctrl.lockScale(True, True, True) self.spine02Ctrl.setColor("blue") # Spine04 self.spine04CtrlSpace = CtrlSpace('spine04', parent=self.cogCtrl) self.spine04Ctrl = Control('spine04', parent=self.spine04CtrlSpace, shape="circle") self.spine04Ctrl.scalePoints(Vec3(6.0, 6.0, 6.0)) self.spine04Ctrl.lockScale(True, True, True) # Spine03 self.spine03CtrlSpace = CtrlSpace('spine03', parent=self.spine04Ctrl) self.spine03Ctrl = Control('spine03', parent=self.spine03CtrlSpace, shape="circle") self.spine03Ctrl.scalePoints(Vec3(4.5, 4.5, 4.5)) self.spine03Ctrl.lockScale(True, True, True) self.spine03Ctrl.setColor("blue") # Pelvis self.pelvisCtrlSpace = CtrlSpace('pelvis', parent=self.spine01Ctrl) self.pelvisCtrl = Control('pelvis', parent=self.pelvisCtrlSpace, shape="cube") self.pelvisCtrl.alignOnYAxis(negative=True) self.pelvisCtrl.scalePoints(Vec3(4.0, 0.375, 3.75)) self.pelvisCtrl.translatePoints(Vec3(0.0, -0.5, -0.25)) self.pelvisCtrl.lockTranslation(True, True, True) self.pelvisCtrl.lockScale(True, True, True) self.pelvisCtrl.setColor("dodgerblue") # ========== # Deformers # ========== deformersLayer = self.getOrCreateLayer('deformers') self.defCmpGrp = ComponentGroup(self.getName(), self, parent=deformersLayer) self.addItem('defCmpGrp', self.defCmpGrp) self.deformerJoints = [] self.spineOutputs = [] self.setNumDeformers(1) pelvisDef = Joint('pelvis', parent=self.defCmpGrp) pelvisDef.setComponent(self) # ===================== # Create Component I/O # ===================== # Setup component Xfo I/O's self.spineVertebraeOutput.setTarget(self.spineOutputs) # ============== # Constrain I/O # ============== # Constraint inputs self.spineSrtInputConstraint = PoseConstraint('_'.join([self.cogCtrlSpace.getName(), 'To', self.globalSRTInputTgt.getName()])) self.spineSrtInputConstraint.addConstrainer(self.globalSRTInputTgt) self.spineSrtInputConstraint.setMaintainOffset(True) self.cogCtrlSpace.addConstraint(self.spineSrtInputConstraint) # Constraint outputs self.spineCogOutputConstraint = PoseConstraint('_'.join([self.spineCogOutputTgt.getName(), 'To', self.cogCtrl.getName()])) self.spineCogOutputConstraint.addConstrainer(self.cogCtrl) self.spineCogOutputTgt.addConstraint(self.spineCogOutputConstraint) self.spineBaseOutputConstraint = PoseConstraint('_'.join([self.spineBaseOutputTgt.getName(), 'To', 'spineBase'])) self.spineBaseOutputConstraint.addConstrainer(self.spineOutputs[0]) self.spineBaseOutputTgt.addConstraint(self.spineBaseOutputConstraint) self.pelvisOutputConstraint = PoseConstraint('_'.join([self.pelvisOutputTgt.getName(), 'To', self.pelvisCtrl.getName()])) self.pelvisOutputConstraint.addConstrainer(self.pelvisCtrl) self.pelvisOutputTgt.addConstraint(self.pelvisOutputConstraint) self.spineEndOutputConstraint = PoseConstraint('_'.join([self.spineEndOutputTgt.getName(), 'To', 'spineEnd'])) self.spineEndOutputConstraint.addConstrainer(self.spineOutputs[0]) self.spineEndOutputTgt.addConstraint(self.spineEndOutputConstraint) # =============== # Add Canvas Ops # =============== # Add Spine Canvas Op self.bezierSpineKLOp = KLOperator('spine', 'BezierSpineSolver', 'Kraken') self.addOperator(self.bezierSpineKLOp) # Add Att Inputs self.bezierSpineKLOp.setInput('drawDebug', self.drawDebugInputAttr) self.bezierSpineKLOp.setInput('rigScale', self.rigScaleInputAttr) self.bezierSpineKLOp.setInput('length', self.lengthInputAttr) # Add Xfo Inputs self.bezierSpineKLOp.setInput('base', self.spine01Ctrl) self.bezierSpineKLOp.setInput('baseHandle', self.spine02Ctrl) self.bezierSpineKLOp.setInput('tipHandle', self.spine03Ctrl) self.bezierSpineKLOp.setInput('tip', self.spine04Ctrl) # Add Xfo Outputs self.bezierSpineKLOp.setOutput('outputs', self.spineOutputs) # Add Deformer Canvas Op self.deformersToOutputsKLOp = KLOperator('defConstraint', 'MultiPoseConstraintSolver', 'Kraken') self.addOperator(self.deformersToOutputsKLOp) # Add Att Inputs self.deformersToOutputsKLOp.setInput('drawDebug', self.drawDebugInputAttr) self.deformersToOutputsKLOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Outputs self.deformersToOutputsKLOp.setInput('constrainers', self.spineOutputs) # Add Xfo Outputs self.deformersToOutputsKLOp.setOutput('constrainees', self.deformerJoints) # Add Pelvis Canvas Op self.pelvisDefKLOp = KLOperator('pelvisDefConstraint', 'PoseConstraintSolver', 'Kraken') self.addOperator(self.pelvisDefKLOp) # Add Att Inputs self.pelvisDefKLOp.setInput('drawDebug', self.drawDebugInputAttr) self.pelvisDefKLOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Inputs self.pelvisDefKLOp.setInput('constrainer', self.pelvisOutputTgt) # Add Xfo Outputs self.pelvisDefKLOp.setOutput('constrainee', pelvisDef) Profiler.getInstance().pop() def setNumDeformers(self, numDeformers): # Add new deformers and outputs for i in xrange(len(self.spineOutputs), numDeformers): name = 'spine' + str(i + 1).zfill(2) spineOutput = ComponentOutput(name, parent=self.outputHrcGrp) self.spineOutputs.append(spineOutput) for i in xrange(len(self.deformerJoints), numDeformers): name = 'spine' + str(i + 1).zfill(2) spineDef = Joint(name, parent=self.defCmpGrp) spineDef.setComponent(self) self.deformerJoints.append(spineDef) return True def loadData(self, data=None): """Load a saved guide representation from persisted data. Arguments: data -- object, The JSON data object. Return: True if successful. """ super(SpineComponentRig, self).loadData( data ) cogPosition = data['cogPosition'] spine01Position = data['spine01Position'] spine02Position = data['spine02Position'] spine03Position = data['spine03Position'] spine04Position = data['spine04Position'] numDeformers = data['numDeformers'] self.cogCtrlSpace.xfo.tr = cogPosition self.cogCtrl.xfo.tr = cogPosition self.pelvisCtrlSpace.xfo.tr = cogPosition self.pelvisCtrl.xfo.tr = cogPosition self.spine01CtrlSpace.xfo.tr = spine01Position self.spine01Ctrl.xfo.tr = spine01Position self.spine02CtrlSpace.xfo.tr = spine02Position self.spine02Ctrl.xfo.tr = spine02Position self.spine03CtrlSpace.xfo.tr = spine03Position self.spine03Ctrl.xfo.tr = spine03Position self.spine04CtrlSpace.xfo.tr = spine04Position self.spine04Ctrl.xfo.tr = spine04Position length = spine01Position.distanceTo(spine02Position) + spine02Position.distanceTo(spine03Position) + spine03Position.distanceTo(spine04Position) self.lengthInputAttr.setMax(length * 3.0) self.lengthInputAttr.setValue(length) # Update number of deformers and outputs self.setNumDeformers(numDeformers) # Updating constraint to use the updated last output. self.spineEndOutputConstraint.setConstrainer(self.spineOutputs[-1], index=0) # ============ # Set IO Xfos # ============ # Evaluate Constraints self.spineSrtInputConstraint.evaluate() self.spineCogOutputConstraint.evaluate() self.spineBaseOutputConstraint.evaluate() self.pelvisOutputConstraint.evaluate() self.spineEndOutputConstraint.evaluate() # Evaluate Operators self.bezierSpineKLOp.evaluate() self.deformersToOutputsKLOp.evaluate() self.pelvisDefKLOp.evaluate()
class FabriceHeadRig(FabriceHead): """Fabrice Head Component Rig""" def __init__(self, name='head', parent=None): Profiler.getInstance().push("Construct Head Rig Component:" + name) super(FabriceHeadRig, self).__init__(name, parent) # ========= # Controls # ========= # Head Aim self.headAimCtrlSpace = CtrlSpace('headAim', parent=self.ctrlCmpGrp) self.headAimCtrl = Control('headAim', parent=self.headAimCtrlSpace, shape="sphere") self.headAimCtrl.scalePoints(Vec3(0.35, 0.35, 0.35)) self.headAimCtrl.lockScale(x=True, y=True, z=True) self.headAimUpV = Locator('headAimUpV', parent=self.headAimCtrl) self.headAimUpV.setShapeVisibility(False) # Head self.headAim = Locator('headAim', parent=self.ctrlCmpGrp) self.headAim.setShapeVisibility(False) self.headCtrlSpace = CtrlSpace('head', parent=self.ctrlCmpGrp) self.headCtrl = Control('head', parent=self.headCtrlSpace, shape="circle") self.headCtrl.lockTranslation(x=True, y=True, z=True) self.headCtrl.lockScale(x=True, y=True, z=True) # Jaw self.jawCtrlSpace = CtrlSpace('jawCtrlSpace', parent=self.headCtrl) self.jawCtrl = Control('jaw', parent=self.jawCtrlSpace, shape="cube") self.jawCtrl.lockTranslation(x=True, y=True, z=True) self.jawCtrl.lockScale(x=True, y=True, z=True) self.jawCtrl.setColor("orange") # ========== # Deformers # ========== deformersLayer = self.getOrCreateLayer('deformers') defCmpGrp = ComponentGroup(self.getName(), self, parent=deformersLayer) self.addItem('defCmpGrp', self.defCmpGrp) headDef = Joint('head', parent=defCmpGrp) headDef.setComponent(self) jawDef = Joint('jaw', parent=defCmpGrp) jawDef.setComponent(self) # ============== # Constrain I/O # ============== self.headToAimConstraint = PoseConstraint('_'.join([self.headCtrlSpace.getName(), 'To', self.headAim.getName()])) self.headToAimConstraint.setMaintainOffset(True) self.headToAimConstraint.addConstrainer(self.headAim) self.headCtrlSpace.addConstraint(self.headToAimConstraint) # Constraint inputs self.headAimInputConstraint = PoseConstraint('_'.join([self.headAimCtrlSpace.getName(), 'To', self.headBaseInputTgt.getName()])) self.headAimInputConstraint.setMaintainOffset(True) self.headAimInputConstraint.addConstrainer(self.headBaseInputTgt) self.headAimCtrlSpace.addConstraint(self.headAimInputConstraint) # # Constraint outputs self.headOutputConstraint = PoseConstraint('_'.join([self.headOutputTgt.getName(), 'To', self.headCtrl.getName()])) self.headOutputConstraint.addConstrainer(self.headCtrl) self.headOutputTgt.addConstraint(self.headOutputConstraint) self.jawOutputConstraint = PoseConstraint('_'.join([self.jawOutputTgt.getName(), 'To', self.jawCtrl.getName()])) self.jawOutputConstraint.addConstrainer(self.jawCtrl) self.jawOutputTgt.addConstraint(self.jawOutputConstraint) # ============== # Add Operators # ============== # Add Aim Canvas Op # ================= self.headAimCanvasOp = CanvasOperator('headAimCanvasOp', 'Kraken.Solvers.DirectionConstraintSolver') self.addOperator(self.headAimCanvasOp) # Add Att Inputs self.headAimCanvasOp.setInput('drawDebug', self.drawDebugInputAttr) self.headAimCanvasOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Inputs self.headAimCanvasOp.setInput('position', self.headBaseInputTgt) self.headAimCanvasOp.setInput('upVector', self.headAimUpV) self.headAimCanvasOp.setInput('atVector', self.headAimCtrl) # Add Xfo Outputs self.headAimCanvasOp.setOutput('constrainee', self.headAim) # Add Deformer KL Op # ================== self.deformersToOutputsKLOp = KLOperator('headDeformerKLOp', 'MultiPoseConstraintSolver', 'Kraken') self.addOperator(self.deformersToOutputsKLOp) # Add Att Inputs self.deformersToOutputsKLOp.setInput('drawDebug', self.drawDebugInputAttr) self.deformersToOutputsKLOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Outputs self.deformersToOutputsKLOp.setInput('constrainers', [self.headOutputTgt, self.jawOutputTgt]) # Add Xfo Outputs self.deformersToOutputsKLOp.setOutput('constrainees', [headDef, jawDef]) Profiler.getInstance().pop() def loadData(self, data=None): """Load a saved guide representation from persisted data. Arguments: data -- object, The JSON data object. Return: True if successful. """ super(FabriceHeadRig, self).loadData( data ) headXfo = data['headXfo'] headCtrlCrvData = data['headCtrlCrvData'] jawPosition = data['jawPosition'] jawCtrlCrvData = data['jawCtrlCrvData'] self.headAimCtrlSpace.xfo.ori = headXfo.ori self.headAimCtrlSpace.xfo.tr = headXfo.tr.add(Vec3(0, 0, 4)) self.headAimCtrl.xfo = self.headAimCtrlSpace.xfo self.headAimUpV.xfo.ori = self.headAimCtrl.xfo.ori self.headAimUpV.xfo.tr = self.headAimCtrl.xfo.tr.add(Vec3(0, 3, 0)) self.headAim.xfo = headXfo self.headCtrlSpace.xfo = headXfo self.headCtrl.xfo = headXfo self.headCtrl.setCurveData(headCtrlCrvData) self.jawCtrlSpace.xfo.tr = jawPosition self.jawCtrl.xfo.tr = jawPosition self.jawCtrl.setCurveData(jawCtrlCrvData) # ============ # Set IO Xfos # ============ self.headBaseInputTgt.xfo = headXfo self.headOutputTgt.xfo = headXfo self.jawOutputTgt.xfo.tr = jawPosition # ==================== # Evaluate Splice Ops # ==================== # evaluate the constraint op so that all the joint transforms are updated. self.headAimCanvasOp.evaluate() self.deformersToOutputsKLOp.evaluate() # evaluate the constraints to ensure the outputs are now in the correct location. self.headToAimConstraint.evaluate() self.headAimInputConstraint.evaluate() self.headOutputConstraint.evaluate() self.jawOutputConstraint.evaluate()
class ClavicleComponentRig(ClavicleComponent): """Clavicle Component""" def __init__(self, name='Clavicle', parent=None): Profiler.getInstance().push("Construct Clavicle Rig Component:" + name) super(ClavicleComponentRig, self).__init__(name, parent) # ========= # Controls # ========= # Clavicle self.clavicleCtrlSpace = CtrlSpace('clavicle', parent=self.ctrlCmpGrp) self.clavicleCtrl = Control('clavicle', parent=self.clavicleCtrlSpace, shape="cube") self.clavicleCtrl.alignOnXAxis() self.clavicleCtrl.lockTranslation(True, True, True) self.clavicleCtrl.lockScale(True, True, True) # ========== # Deformers # ========== self.deformersLayer = self.getOrCreateLayer('deformers') self.defCmpGrp = ComponentGroup(self.getName(), self, parent=self.deformersLayer) self.addItem('defCmpGrp', self.defCmpGrp) self.clavicleDef = Joint('clavicle', parent=self.defCmpGrp) self.clavicleDef.setComponent(self) # ============== # Constrain I/O # ============== # Constraint inputs self.clavicleInputConstraint = PoseConstraint('_'.join([self.clavicleCtrl.getName(), 'To', self.spineEndInputTgt.getName()])) self.clavicleInputConstraint.setMaintainOffset(True) self.clavicleInputConstraint.addConstrainer(self.spineEndInputTgt) self.clavicleCtrlSpace.addConstraint(self.clavicleInputConstraint) # Constraint outputs self.clavicleConstraint = PoseConstraint('_'.join([self.clavicleOutputTgt.getName(), 'To', self.clavicleCtrl.getName()])) self.clavicleConstraint.addConstrainer(self.clavicleCtrl) self.clavicleOutputTgt.addConstraint(self.clavicleConstraint) self.clavicleEndConstraint = PoseConstraint('_'.join([self.clavicleEndOutputTgt.getName(), 'To', self.clavicleCtrl.getName()])) self.clavicleEndConstraint.setMaintainOffset(True) self.clavicleEndConstraint.addConstrainer(self.clavicleCtrl) self.clavicleEndOutputTgt.addConstraint(self.clavicleEndConstraint) # =============== # Add Canavs Ops # =============== # Add Deformer Canvas Op self.clavicleDefOp = KLOperator('defConstraint', 'PoseConstraintSolver', 'Kraken') self.addOperator(self.clavicleDefOp) # Add Att Inputs self.clavicleDefOp.setInput('drawDebug', self.drawDebugInputAttr) self.clavicleDefOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Inputs self.clavicleDefOp.setInput('constrainer', self.clavicleOutputTgt) # Add Xfo Outputs self.clavicleDefOp.setOutput('constrainee', self.clavicleDef) Profiler.getInstance().pop() def loadData(self, data=None): """Load a saved guide representation from persisted data. Arguments: data -- object, The JSON data object. Return: True if successful. """ super(ClavicleComponentRig, self).loadData( data ) clavicleXfo = data.get('clavicleXfo') clavicleLen = data.get('clavicleLen') clavicleLenVec = Vec3(clavicleLen, 0.75, 0.75) self.clavicleCtrlSpace.xfo = clavicleXfo self.clavicleCtrl.xfo = clavicleXfo self.clavicleCtrl.scalePoints(clavicleLenVec) if data['location'] == "R": self.clavicleCtrl.translatePoints(Vec3(0.0, 0.0, -1.0)) else: self.clavicleCtrl.translatePoints(Vec3(0.0, 0.0, 1.0)) # Set IO Xfos self.spineEndInputTgt.xfo = clavicleXfo self.clavicleEndOutputTgt.xfo = clavicleXfo self.clavicleEndOutputTgt.xfo.tr = clavicleXfo.transformVector(Vec3(clavicleLen, 0.0, 0.0)) self.clavicleOutputTgt.xfo = clavicleXfo # Eval Constraints self.clavicleInputConstraint.evaluate() self.clavicleConstraint.evaluate() self.clavicleEndConstraint.evaluate() # Eval Operators self.clavicleDefOp.evaluate()
def __init__(self, name='head', parent=None): Profiler.getInstance().push("Construct Head Rig Component:" + name) super(FabriceHeadRig, self).__init__(name, parent) # ========= # Controls # ========= # Head Aim self.headAimCtrlSpace = CtrlSpace('headAim', parent=self.ctrlCmpGrp) self.headAimCtrl = Control('headAim', parent=self.headAimCtrlSpace, shape="sphere") self.headAimCtrl.scalePoints(Vec3(0.35, 0.35, 0.35)) self.headAimCtrl.lockScale(x=True, y=True, z=True) self.headAimUpV = Locator('headAimUpV', parent=self.headAimCtrl) self.headAimUpV.setShapeVisibility(False) # Head self.headAim = Locator('headAim', parent=self.ctrlCmpGrp) self.headAim.setShapeVisibility(False) self.headCtrlSpace = CtrlSpace('head', parent=self.ctrlCmpGrp) self.headCtrl = Control('head', parent=self.headCtrlSpace, shape="circle") self.headCtrl.lockTranslation(x=True, y=True, z=True) self.headCtrl.lockScale(x=True, y=True, z=True) # Jaw self.jawCtrlSpace = CtrlSpace('jawCtrlSpace', parent=self.headCtrl) self.jawCtrl = Control('jaw', parent=self.jawCtrlSpace, shape="cube") self.jawCtrl.lockTranslation(x=True, y=True, z=True) self.jawCtrl.lockScale(x=True, y=True, z=True) self.jawCtrl.setColor("orange") # ========== # Deformers # ========== deformersLayer = self.getOrCreateLayer('deformers') defCmpGrp = ComponentGroup(self.getName(), self, parent=deformersLayer) self.addItem('defCmpGrp', self.defCmpGrp) headDef = Joint('head', parent=defCmpGrp) headDef.setComponent(self) jawDef = Joint('jaw', parent=defCmpGrp) jawDef.setComponent(self) # ============== # Constrain I/O # ============== self.headToAimConstraint = PoseConstraint('_'.join([self.headCtrlSpace.getName(), 'To', self.headAim.getName()])) self.headToAimConstraint.setMaintainOffset(True) self.headToAimConstraint.addConstrainer(self.headAim) self.headCtrlSpace.addConstraint(self.headToAimConstraint) # Constraint inputs self.headAimInputConstraint = PoseConstraint('_'.join([self.headAimCtrlSpace.getName(), 'To', self.headBaseInputTgt.getName()])) self.headAimInputConstraint.setMaintainOffset(True) self.headAimInputConstraint.addConstrainer(self.headBaseInputTgt) self.headAimCtrlSpace.addConstraint(self.headAimInputConstraint) # # Constraint outputs self.headOutputConstraint = PoseConstraint('_'.join([self.headOutputTgt.getName(), 'To', self.headCtrl.getName()])) self.headOutputConstraint.addConstrainer(self.headCtrl) self.headOutputTgt.addConstraint(self.headOutputConstraint) self.jawOutputConstraint = PoseConstraint('_'.join([self.jawOutputTgt.getName(), 'To', self.jawCtrl.getName()])) self.jawOutputConstraint.addConstrainer(self.jawCtrl) self.jawOutputTgt.addConstraint(self.jawOutputConstraint) # ============== # Add Operators # ============== # Add Aim Canvas Op # ================= self.headAimCanvasOp = CanvasOperator('headAimCanvasOp', 'Kraken.Solvers.DirectionConstraintSolver') self.addOperator(self.headAimCanvasOp) # Add Att Inputs self.headAimCanvasOp.setInput('drawDebug', self.drawDebugInputAttr) self.headAimCanvasOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Inputs self.headAimCanvasOp.setInput('position', self.headBaseInputTgt) self.headAimCanvasOp.setInput('upVector', self.headAimUpV) self.headAimCanvasOp.setInput('atVector', self.headAimCtrl) # Add Xfo Outputs self.headAimCanvasOp.setOutput('constrainee', self.headAim) # Add Deformer KL Op # ================== self.deformersToOutputsKLOp = KLOperator('headDeformerKLOp', 'MultiPoseConstraintSolver', 'Kraken') self.addOperator(self.deformersToOutputsKLOp) # Add Att Inputs self.deformersToOutputsKLOp.setInput('drawDebug', self.drawDebugInputAttr) self.deformersToOutputsKLOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Outputs self.deformersToOutputsKLOp.setInput('constrainers', [self.headOutputTgt, self.jawOutputTgt]) # Add Xfo Outputs self.deformersToOutputsKLOp.setOutput('constrainees', [headDef, jawDef]) Profiler.getInstance().pop()
class FabriceSpineRig(FabriceSpine): """Fabrice Spine Component""" def __init__(self, name="spine", parent=None): Profiler.getInstance().push("Construct Spine Rig Component:" + name) super(FabriceSpineRig, self).__init__(name, parent) # ========= # Controls # ========= # COG self.cogCtrlSpace = CtrlSpace('cog', parent=self.ctrlCmpGrp) self.cogCtrl = Control('cog', parent=self.cogCtrlSpace, shape="circle") self.cogCtrl.rotatePoints(90, 0, 0) self.cogCtrl.scalePoints(Vec3(3.0, 3.0, 3.0)) self.cogCtrl.translatePoints(Vec3(0.0, 0.0, 0.2)) self.cogCtrl.lockScale(x=True, y=True, z=True) self.cogCtrl.setColor("orange") # Spine Base self.spineBaseCtrlSpace = CtrlSpace('spineBase', parent=self.cogCtrl) self.spineBaseCtrl = Control('spineBase', parent=self.spineBaseCtrlSpace, shape="pin") self.spineBaseCtrl.rotatePoints(90, 0, 0) self.spineBaseCtrl.translatePoints(Vec3(0, 1.0, 0)) self.spineBaseCtrl.lockScale(x=True, y=True, z=True) # Spine Base Handle self.spineBaseHandleCtrlSpace = CtrlSpace('spineBaseHandle', parent=self.spineBaseCtrl) self.spineBaseHandleCtrl = Control( 'spineBaseHandle', parent=self.spineBaseHandleCtrlSpace, shape="pin") self.spineBaseHandleCtrl.rotatePoints(90, 0, 0) self.spineBaseHandleCtrl.translatePoints(Vec3(0, 1.0, 0)) self.spineBaseHandleCtrl.lockScale(x=True, y=True, z=True) self.spineBaseHandleCtrl.setColor("orange") # Spine End self.spineEndCtrlSpace = CtrlSpace('spineEnd', parent=self.cogCtrl) self.spineEndCtrl = Control('spineEnd', parent=self.spineEndCtrlSpace, shape="pin") self.spineEndCtrl.rotatePoints(90, 0, 0) self.spineEndCtrl.lockScale(x=True, y=True, z=True) self.spineEndCtrl.translatePoints(Vec3(0, 1.0, 0)) # Spine End Handle self.spineEndHandleCtrlSpace = CtrlSpace('spineEndHandle', parent=self.spineEndCtrl) self.spineEndHandleCtrl = Control('spineEndHandle', parent=self.spineEndHandleCtrlSpace, shape="pin") self.spineEndHandleCtrl.rotatePoints(90, 0, 0) self.spineEndHandleCtrl.translatePoints(Vec3(0, 1.0, 0)) self.spineEndHandleCtrl.lockScale(x=True, y=True, z=True) self.spineEndHandleCtrl.setColor("orange") # ========== # Deformers # ========== deformersLayer = self.getOrCreateLayer('deformers') self.defCmpGrp = ComponentGroup(self.getName(), self, parent=deformersLayer) self.chestDef = Joint('chest', parent=self.defCmpGrp) self.chestDef.setComponent(self) self.deformerJoints = [] self.spineOutputs = [] self.setNumDeformers(1) # ===================== # Create Component I/O # ===================== # Setup component Xfo I/O's self.spineVertebraeOutput.setTarget(self.spineOutputs) # ===================== # Constraint Deformers # ===================== self.chestDefConstraint = PoseConstraint('_'.join( [self.chestDef.getName(), 'To', self.spineBaseOutputTgt.getName()])) self.chestDefConstraint.addConstrainer(self.spineBaseOutputTgt) self.chestDef.addConstraint(self.chestDefConstraint) # ============== # Constrain I/O # ============== # Constraint inputs self.spineSrtInputConstraint = PoseConstraint('_'.join([ self.cogCtrlSpace.getName(), 'To', self.spineMainSrtInputTgt.getName() ])) self.spineSrtInputConstraint.addConstrainer(self.spineMainSrtInputTgt) self.spineSrtInputConstraint.setMaintainOffset(True) self.cogCtrlSpace.addConstraint(self.spineSrtInputConstraint) # Constraint outputs self.spineCogOutputConstraint = PoseConstraint('_'.join( [self.spineCogOutputTgt.getName(), 'To', self.cogCtrl.getName()])) self.spineCogOutputConstraint.addConstrainer(self.cogCtrl) self.spineCogOutputTgt.addConstraint(self.spineCogOutputConstraint) # Spine Base self.spineBaseOutputPosConstraint = PositionConstraint('_'.join([ self.spineBaseOutputTgt.getName(), 'PosTo', self.spineOutputs[0].getName() ])) self.spineBaseOutputPosConstraint.addConstrainer(self.spineOutputs[0]) self.spineBaseOutputTgt.addConstraint( self.spineBaseOutputPosConstraint) self.spineBaseOutputOriConstraint = OrientationConstraint('_'.join([ self.spineBaseOutputTgt.getName(), 'PosTo', self.cogCtrl.getName() ])) self.spineBaseOutputOriConstraint.addConstrainer(self.cogCtrl) self.spineBaseOutputTgt.addConstraint( self.spineBaseOutputOriConstraint) # Spine End self.spineEndOutputConstraint = PoseConstraint('_'.join( [self.spineEndOutputTgt.getName(), 'To', 'spineEnd'])) self.spineEndOutputConstraint.addConstrainer(self.spineOutputs[0]) self.spineEndOutputTgt.addConstraint(self.spineEndOutputConstraint) self.spineEndCtrlOutputConstraint = PoseConstraint('_'.join([ self.spineEndCtrlOutputTgt.getName(), 'To', self.spineEndCtrl.getName() ])) self.spineEndCtrlOutputConstraint.addConstrainer(self.spineEndCtrl) self.spineEndCtrlOutputTgt.addConstraint( self.spineEndCtrlOutputConstraint) # =============== # Add Splice Ops # =============== # Add Spine Splice Op self.bezierSpineSpliceOp = SpliceOperator('spineSpliceOp', 'BezierSpineSolver', 'Kraken') self.addOperator(self.bezierSpineSpliceOp) # Add Att Inputs self.bezierSpineSpliceOp.setInput('drawDebug', self.drawDebugInputAttr) self.bezierSpineSpliceOp.setInput('rigScale', self.rigScaleInputAttr) self.bezierSpineSpliceOp.setInput('length', self.lengthInputAttr) # Add Xfo Inputs self.bezierSpineSpliceOp.setInput('base', self.spineBaseCtrl) self.bezierSpineSpliceOp.setInput('baseHandle', self.spineBaseHandleCtrl) self.bezierSpineSpliceOp.setInput('tipHandle', self.spineEndHandleCtrl) self.bezierSpineSpliceOp.setInput('tip', self.spineEndCtrl) # Add Xfo Outputs self.bezierSpineSpliceOp.setOutput('outputs', self.spineOutputs) # Add Deformer Splice Op self.deformersToOutputsSpliceOp = SpliceOperator( 'spineDeformerSpliceOp', 'MultiPoseConstraintSolver', 'Kraken', alwaysEval=True) self.addOperator(self.deformersToOutputsSpliceOp) # Add Att Inputs self.deformersToOutputsSpliceOp.setInput('drawDebug', self.drawDebugInputAttr) self.deformersToOutputsSpliceOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Outputs self.deformersToOutputsSpliceOp.setInput('constrainers', self.spineOutputs) # Add Xfo Outputs self.deformersToOutputsSpliceOp.setOutput('constrainees', self.deformerJoints) Profiler.getInstance().pop() def setNumDeformers(self, numDeformers): # Add new deformers and outputs for i in xrange(len(self.spineOutputs), numDeformers): name = 'spine' + str(i + 1).zfill(2) spineOutput = ComponentOutput(name, parent=self.outputHrcGrp) self.spineOutputs.append(spineOutput) for i in xrange(len(self.deformerJoints), numDeformers): name = 'spine' + str(i + 1).zfill(2) spineDef = Joint(name, parent=self.defCmpGrp) spineDef.setComponent(self) self.deformerJoints.append(spineDef) return True def loadData(self, data=None): """Load a saved guide representation from persisted data. Arguments: data -- object, The JSON data object. Return: True if successful. """ super(FabriceSpineRig, self).loadData(data) # Get Data cogPos = data['cogPos'] cogCtrlCrvData = data['cogCtrlCrvData'] spineBasePos = data['spineBasePos'] spineBaseCtrlCrvData = data['spineBaseCtrlCrvData'] spineBaseHandlePos = data['spineBaseHandlePos'] spineBaseHandleCtrlCrvData = data['spineBaseHandleCtrlCrvData'] spineEndHandlePos = data['spineEndHandlePos'] spineEndHandleCtrlCrvData = data['spineEndHandleCtrlCrvData'] spineEndPos = data['spineEndPos'] spineEndCtrlCrvData = data['spineEndCtrlCrvData'] numDeformers = data['numDeformers'] # Set Xfos self.cogCtrlSpace.xfo.tr = cogPos self.cogCtrl.xfo.tr = cogPos self.cogCtrl.setCurveData(cogCtrlCrvData) self.spineBaseCtrlSpace.xfo.tr = spineBasePos self.spineBaseCtrl.xfo.tr = spineBasePos self.spineBaseCtrl.setCurveData(spineBaseCtrlCrvData) self.spineBaseHandleCtrlSpace.xfo.tr = spineBaseHandlePos self.spineBaseHandleCtrl.xfo.tr = spineBaseHandlePos self.spineBaseHandleCtrl.setCurveData(spineBaseHandleCtrlCrvData) self.spineEndHandleCtrlSpace.xfo.tr = spineEndHandlePos self.spineEndHandleCtrl.xfo.tr = spineEndHandlePos self.spineEndHandleCtrl.setCurveData(spineEndHandleCtrlCrvData) self.spineEndCtrlSpace.xfo.tr = spineEndPos self.spineEndCtrl.xfo.tr = spineEndPos self.spineEndCtrl.setCurveData(spineEndCtrlCrvData) length = spineBasePos.distanceTo( spineBaseHandlePos) + spineBaseHandlePos.distanceTo( spineEndHandlePos) + spineEndHandlePos.distanceTo(spineEndPos) self.lengthInputAttr.setMax(length * 3.0) self.lengthInputAttr.setValue(length) # Update number of deformers and outputs self.setNumDeformers(numDeformers) # Updating constraint to use the updated last output. self.spineEndOutputConstraint.setConstrainer(self.spineOutputs[-1], index=0) # ============ # Set IO Xfos # ============ # ==================== # Evaluate Splice Ops # ==================== # evaluate the spine op so that all the output transforms are updated. self.bezierSpineSpliceOp.evaluate() # evaluate the constraint op so that all the joint transforms are updated. self.deformersToOutputsSpliceOp.evaluate() # evaluate the constraints to ensure the outputs are now in the correct location. self.spineSrtInputConstraint.evaluate() self.spineCogOutputConstraint.evaluate() self.spineBaseOutputPosConstraint.evaluate() self.spineBaseOutputOriConstraint.evaluate() self.spineEndOutputConstraint.evaluate() self.spineEndCtrlOutputConstraint.evaluate()
def __init__(self, name='head', parent=None): Profiler.getInstance().push("Construct Head Rig Component:" + name) super(HeadComponentRig, self).__init__(name, parent) # ========= # Controls # ========= # Head self.headCtrlSpace = CtrlSpace('head', parent=self.ctrlCmpGrp) self.headCtrl = Control('head', parent=self.headCtrlSpace, shape="circle") self.headCtrl.rotatePoints(0, 0, 90) self.headCtrl.scalePoints(Vec3(3, 3, 3)) self.headCtrl.translatePoints(Vec3(0, 1, 0.25)) # Eye Left self.eyeLeftCtrlSpace = CtrlSpace('eyeLeft', parent=self.headCtrl) self.eyeLeftCtrl = Control('eyeLeft', parent=self.eyeLeftCtrlSpace, shape="sphere") self.eyeLeftCtrl.scalePoints(Vec3(0.5, 0.5, 0.5)) self.eyeLeftCtrl.setColor("blueMedium") # Eye Right self.eyeRightCtrlSpace = CtrlSpace('eyeRight', parent=self.headCtrl) self.eyeRightCtrl = Control('eyeRight', parent=self.eyeRightCtrlSpace, shape="sphere") self.eyeRightCtrl.scalePoints(Vec3(0.5, 0.5, 0.5)) self.eyeRightCtrl.setColor("blueMedium") # Jaw self.jawCtrlSpace = CtrlSpace('jawCtrlSpace', parent=self.headCtrl) self.jawCtrl = Control('jaw', parent=self.jawCtrlSpace, shape="cube") self.jawCtrl.alignOnYAxis(negative=True) self.jawCtrl.alignOnZAxis() self.jawCtrl.scalePoints(Vec3(1.45, 0.65, 1.25)) self.jawCtrl.translatePoints(Vec3(0, -0.25, 0)) self.jawCtrl.setColor("orange") # ========== # Deformers # ========== deformersLayer = self.getOrCreateLayer('deformers') defCmpGrp = ComponentGroup(self.getName(), self, parent=deformersLayer) headDef = Joint('head', parent=defCmpGrp) headDef.setComponent(self) jawDef = Joint('jaw', parent=defCmpGrp) jawDef.setComponent(self) eyeLeftDef = Joint('eyeLeft', parent=defCmpGrp) eyeLeftDef.setComponent(self) eyeRightDef = Joint('eyeRight', parent=defCmpGrp) eyeRightDef.setComponent(self) # ============== # Constrain I/O # ============== # Constraint inputs headInputConstraint = PoseConstraint('_'.join([ self.headCtrlSpace.getName(), 'To', self.headBaseInputTgt.getName() ])) headInputConstraint.setMaintainOffset(True) headInputConstraint.addConstrainer(self.headBaseInputTgt) self.headCtrlSpace.addConstraint(headInputConstraint) # # Constraint outputs headOutputConstraint = PoseConstraint('_'.join( [self.headOutputTgt.getName(), 'To', self.headCtrl.getName()])) headOutputConstraint.addConstrainer(self.headCtrl) self.headOutputTgt.addConstraint(headOutputConstraint) jawOutputConstraint = PoseConstraint('_'.join( [self.jawOutputTgt.getName(), 'To', self.jawCtrl.getName()])) jawOutputConstraint.addConstrainer(self.jawCtrl) self.jawOutputTgt.addConstraint(jawOutputConstraint) eyeLOutputConstraint = PoseConstraint('_'.join( [self.eyeLOutputTgt.getName(), 'To', self.eyeLeftCtrl.getName()])) eyeLOutputConstraint.addConstrainer(self.eyeLeftCtrl) self.eyeLOutputTgt.addConstraint(eyeLOutputConstraint) eyeROutputConstraint = PoseConstraint('_'.join( [self.eyeROutputTgt.getName(), 'To', self.eyeRightCtrl.getName()])) eyeROutputConstraint.addConstrainer(self.eyeRightCtrl) self.eyeROutputTgt.addConstraint(eyeROutputConstraint) # ================== # Add Component I/O # ================== # Add Xfo I/O's # self.addInput(self.headBaseInputTgt) # self.addOutput(self.headOutputTgt) # self.addOutput(self.jawOutputTgt) # self.addOutput(self.eyeLOutputTgt) # self.addOutput(self.eyeROutputTgt) # Add Attribute I/O's # self.addInput(self.drawDebugInputAttr) # =============== # Add Splice Ops # =============== # Add Deformer Splice Op # spliceOp = SpliceOperator('headDeformerSpliceOp', 'HeadConstraintSolver', 'KrakenHeadConstraintSolver') # self.addOperator(spliceOp) # # Add Att Inputs # spliceOp.setInput('drawDebug', self.drawDebugInputAttr) # spliceOp.setInput('rigScale', self.rigScaleInputAttr) # # Add Xfo Inputstrl) # spliceOp.setInput('headConstrainer', self.headOutputTgt) # spliceOp.setInput('jawConstrainer', self.jawOutputTgt) # spliceOp.setInput('eyeLeftConstrainer', self.eyeLOutputTgt) # spliceOp.setInput('eyeRightConstrainer', self.eyeROutputTgt) # # Add Xfo Outputs # spliceOp.setOutput('headDeformer', headDef) # spliceOp.setOutput('jawDeformer', jawDef) # spliceOp.setOutput('eyeLeftDeformer', eyeLeftDef) # spliceOp.setOutput('eyeRightDeformer', eyeRightDef) Profiler.getInstance().pop()
class ArmComponentRig(ArmComponent): """Arm Component Rig""" def __init__(self, name='arm', parent=None): Profiler.getInstance().push("Construct Arm Rig Component:" + name) super(ArmComponentRig, self).__init__(name, parent) # ========= # Controls # ========= # Bicep self.bicepFKCtrlSpace = CtrlSpace('bicepFK', parent=self.ctrlCmpGrp) self.bicepFKCtrl = Control('bicepFK', parent=self.bicepFKCtrlSpace, shape="cube") self.bicepFKCtrl.alignOnXAxis() self.bicepFKCtrl.lockScale(True, True, True) self.bicepFKCtrl.lockTranslation(True, True, True) # Forearm self.forearmFKCtrlSpace = CtrlSpace('forearmFK', parent=self.bicepFKCtrl) self.forearmFKCtrl = Control('forearmFK', parent=self.forearmFKCtrlSpace, shape="cube") self.forearmFKCtrl.alignOnXAxis() self.forearmFKCtrl.lockScale(True, True, True) self.forearmFKCtrl.lockTranslation(True, True, True) # Arm IK self.armIKCtrlSpace = CtrlSpace('IK', parent=self.ctrlCmpGrp) self.armIKCtrl = Control('IK', parent=self.armIKCtrlSpace, shape="jack") self.armIKCtrl.scalePoints(Vec3(2.0, 2.0, 2.0)) self.armIKCtrl.lockScale(True, True, True) # Add Params to IK control armSettingsAttrGrp = AttributeGroup("DisplayInfo_ArmSettings", parent=self.armIKCtrl) self.armDebugInputAttr = BoolAttribute('drawDebug', value=False, parent=armSettingsAttrGrp) self.armBone0LenInputAttr = ScalarAttribute('bone1Len', value=0.0, parent=armSettingsAttrGrp) self.armBone1LenInputAttr = ScalarAttribute('bone2Len', value=0.0, parent=armSettingsAttrGrp) self.armIKBlendInputAttr = ScalarAttribute('fkik', value=0.0, minValue=0.0, maxValue=1.0, parent=armSettingsAttrGrp) # Util Objects self.ikRootPosition = Transform("ikPosition", parent=self.ctrlCmpGrp) # Connect Input Attrs self.drawDebugInputAttr.connect(self.armDebugInputAttr) # Connect Output Attrs self.drawDebugOutputAttr.connect(self.armDebugInputAttr) self.ikBlendOutputAttr.connect(self.armIKBlendInputAttr) # UpV self.armUpVCtrlSpace = CtrlSpace('UpV', parent=self.ctrlCmpGrp) self.armUpVCtrl = Control('UpV', parent=self.armUpVCtrlSpace, shape="triangle") self.armUpVCtrl.alignOnZAxis() self.armUpVCtrl.rotatePoints(180, 0, 0) self.armIKCtrl.lockScale(True, True, True) self.armIKCtrl.lockRotation(True, True, True) # ========== # Deformers # ========== self.deformersLayer = self.getOrCreateLayer('deformers') self.defCmpGrp = ComponentGroup(self.getName(), self, parent=self.deformersLayer) self.addItem('defCmpGrp', self.defCmpGrp) self.bicepDef = Joint('bicep', parent=self.defCmpGrp) self.bicepDef.setComponent(self) self.elbowDef = Joint('elbow', parent=self.defCmpGrp) self.elbowDef.setComponent(self) self.forearmDef = Joint('forearm', parent=self.defCmpGrp) self.forearmDef.setComponent(self) self.wristDef = Joint('wrist', parent=self.defCmpGrp) self.wristDef.setComponent(self) # ============== # Constrain I/O # ============== # Constraint inputs self.armIKCtrlSpaceInputConstraint = PoseConstraint('_'.join([ self.armIKCtrlSpace.getName(), 'To', self.globalSRTInputTgt.getName() ])) self.armIKCtrlSpaceInputConstraint.setMaintainOffset(True) self.armIKCtrlSpaceInputConstraint.addConstrainer( self.globalSRTInputTgt) self.armIKCtrlSpace.addConstraint(self.armIKCtrlSpaceInputConstraint) self.armUpVCtrlSpaceInputConstraint = PoseConstraint('_'.join([ self.armUpVCtrlSpace.getName(), 'To', self.globalSRTInputTgt.getName() ])) self.armUpVCtrlSpaceInputConstraint.setMaintainOffset(True) self.armUpVCtrlSpaceInputConstraint.addConstrainer( self.globalSRTInputTgt) self.armUpVCtrlSpace.addConstraint(self.armUpVCtrlSpaceInputConstraint) self.armRootInputConstraint = PoseConstraint('_'.join([ self.bicepFKCtrlSpace.getName(), 'To', self.rootInputTgt.getName() ])) self.armRootInputConstraint.setMaintainOffset(True) self.armRootInputConstraint.addConstrainer(self.rootInputTgt) self.bicepFKCtrlSpace.addConstraint(self.armRootInputConstraint) self.ikPosInputConstraint = PoseConstraint('_'.join( [self.ikRootPosition.getName(), 'To', self.rootInputTgt.getName()])) self.ikPosInputConstraint.setMaintainOffset(True) self.ikPosInputConstraint.addConstrainer(self.rootInputTgt) self.ikRootPosition.addConstraint(self.ikPosInputConstraint) # Constraint outputs # =============== # Add Splice Ops # =============== # Add Splice Op self.armSolverKLOperator = KLOperator('ikSolver', 'TwoBoneIKSolver', 'Kraken') self.addOperator(self.armSolverKLOperator) # Add Att Inputs self.armSolverKLOperator.setInput('drawDebug', self.drawDebugInputAttr) self.armSolverKLOperator.setInput('rigScale', self.rigScaleInputAttr) self.armSolverKLOperator.setInput('bone0Len', self.armBone0LenInputAttr) self.armSolverKLOperator.setInput('bone1Len', self.armBone1LenInputAttr) self.armSolverKLOperator.setInput('ikblend', self.armIKBlendInputAttr) self.armSolverKLOperator.setInput('rightSide', self.rightSideInputAttr) # Add Xfo Inputs self.armSolverKLOperator.setInput('root', self.ikRootPosition) self.armSolverKLOperator.setInput('bone0FK', self.bicepFKCtrl) self.armSolverKLOperator.setInput('bone1FK', self.forearmFKCtrl) self.armSolverKLOperator.setInput('ikHandle', self.armIKCtrl) self.armSolverKLOperator.setInput('upV', self.armUpVCtrl) # Add Xfo Outputs self.armSolverKLOperator.setOutput('bone0Out', self.bicepOutputTgt) self.armSolverKLOperator.setOutput('bone1Out', self.forearmOutputTgt) self.armSolverKLOperator.setOutput('bone2Out', self.wristOutputTgt) self.armSolverKLOperator.setOutput('midJointOut', self.elbowOutputTgt) # Add Deformer Splice Op self.outputsToDeformersKLOp = KLOperator('defConstraint', 'MultiPoseConstraintSolver', 'Kraken') self.addOperator(self.outputsToDeformersKLOp) # Add Att Inputs self.outputsToDeformersKLOp.setInput('drawDebug', self.drawDebugInputAttr) self.outputsToDeformersKLOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Inputs self.outputsToDeformersKLOp.setInput('constrainers', [ self.bicepOutputTgt, self.elbowOutputTgt, self.forearmOutputTgt, self.wristOutputTgt ]) # Add Xfo Outputs self.outputsToDeformersKLOp.setOutput( 'constrainees', [self.bicepDef, self.elbowDef, self.forearmDef, self.wristDef]) Profiler.getInstance().pop() def loadData(self, data=None): """Load a saved guide representation from persisted data. Arguments: data -- object, The JSON data object. Return: True if successful. """ super(ArmComponentRig, self).loadData(data) bicepXfo = data.get('bicepXfo') forearmXfo = data.get('forearmXfo') wristXfo = data.get('wristXfo') upVXfo = data.get('upVXfo') bicepLen = data.get('bicepLen') forearmLen = data.get('forearmLen') bicepFKCtrlSize = data.get('bicepFKCtrlSize') forearmFKCtrlSize = data.get('forearmFKCtrlSize') self.rootInputTgt.xfo.tr = bicepXfo.tr self.bicepFKCtrlSpace.xfo = bicepXfo self.bicepFKCtrl.xfo = bicepXfo self.bicepFKCtrl.scalePoints( Vec3(bicepLen, bicepFKCtrlSize, bicepFKCtrlSize)) self.forearmFKCtrlSpace.xfo = forearmXfo self.forearmFKCtrl.xfo = forearmXfo self.forearmFKCtrl.scalePoints( Vec3(forearmLen, forearmFKCtrlSize, forearmFKCtrlSize)) self.ikRootPosition.xfo = bicepXfo self.armIKCtrlSpace.xfo.tr = wristXfo.tr self.armIKCtrl.xfo.tr = wristXfo.tr if self.getLocation() == "R": self.armIKCtrl.rotatePoints(0, 90, 0) else: self.armIKCtrl.rotatePoints(0, -90, 0) self.armUpVCtrlSpace.xfo.tr = upVXfo.tr self.armUpVCtrl.xfo.tr = upVXfo.tr self.rightSideInputAttr.setValue(self.getLocation() is 'R') self.armBone0LenInputAttr.setMin(0.0) self.armBone0LenInputAttr.setMax(bicepLen * 3.0) self.armBone0LenInputAttr.setValue(bicepLen) self.armBone1LenInputAttr.setMin(0.0) self.armBone1LenInputAttr.setMax(forearmLen * 3.0) self.armBone1LenInputAttr.setValue(forearmLen) # Outputs self.bicepOutputTgt.xfo = bicepXfo self.forearmOutputTgt.xfo = forearmXfo self.wristOutputTgt.xfo = wristXfo # Eval Constraints self.ikPosInputConstraint.evaluate() self.armIKCtrlSpaceInputConstraint.evaluate() self.armUpVCtrlSpaceInputConstraint.evaluate() self.armRootInputConstraint.evaluate() self.armRootInputConstraint.evaluate() # Eval Operators self.armSolverKLOperator.evaluate() self.outputsToDeformersKLOp.evaluate()
def __init__(self, name="fabriceTail", parent=None): Profiler.getInstance().push("Construct Tail Rig Component:" + name) super(FabriceTailRig, self).__init__(name, parent) # ========= # Controls # ========= # Tail Base # self.tailBaseCtrlSpace = CtrlSpace('tailBase', parent=self.ctrlCmpGrp) # self.tailBaseCtrl = Control('tailBase', parent=self.tailBaseCtrlSpace, shape="circle") # self.tailBaseCtrl.rotatePoints(90, 0, 0) # self.tailBaseCtrl.scalePoints(Vec3(2.0, 2.0, 2.0)) # self.tailBaseCtrl.setColor("greenBlue") # Tail Base Handle self.tailBaseHandleCtrlSpace = CtrlSpace('tailBaseHandle', parent=self.ctrlCmpGrp) self.tailBaseHandleCtrl = Control('tailBaseHandle', parent=self.tailBaseHandleCtrlSpace, shape="pin") self.tailBaseHandleCtrl.lockScale(x=True, y=True, z=True) self.tailBaseHandleCtrl.setColor("turqoise") # Tail End Handle self.tailEndHandleCtrlSpace = CtrlSpace('tailEndHandle', parent=self.ctrlCmpGrp) self.tailEndHandleCtrl = Control('tailEndHandle', parent=self.tailEndHandleCtrlSpace, shape="pin") self.tailEndHandleCtrl.lockScale(x=True, y=True, z=True) self.tailEndHandleCtrl.setColor("turqoise") # Tail End self.tailEndCtrlSpace = CtrlSpace('tailEnd', parent=self.tailEndHandleCtrl) self.tailEndCtrl = Control('tailEnd', parent=self.tailEndCtrlSpace, shape="pin") self.tailEndCtrl.lockScale(x=True, y=True, z=True) self.tailEndCtrl.setColor("greenBlue") # ========== # Deformers # ========== deformersLayer = self.getOrCreateLayer('deformers') self.defCmpGrp = ComponentGroup(self.getName(), self, parent=deformersLayer) self.deformerJoints = [] self.tailOutputs = [] self.setNumDeformers(1) # ===================== # Create Component I/O # ===================== # Setup component Xfo I/O's self.tailVertebraeOutput.setTarget(self.tailOutputs) # ============== # Constrain I/O # ============== # Constraint inputs self.tailBaseHandleInputConstraint = PoseConstraint('_'.join([ self.tailBaseHandleCtrlSpace.getName(), 'To', self.spineEndCtrlInputTgt.getName() ])) self.tailBaseHandleInputConstraint.addConstrainer( self.spineEndCtrlInputTgt) self.tailBaseHandleInputConstraint.setMaintainOffset(True) self.tailBaseHandleCtrlSpace.addConstraint( self.tailBaseHandleInputConstraint) self.tailEndHandleInputConstraint = PoseConstraint('_'.join([ self.tailEndHandleCtrlSpace.getName(), 'To', self.cogInputTgt.getName() ])) self.tailEndHandleInputConstraint.addConstrainer(self.cogInputTgt) self.tailEndHandleInputConstraint.setMaintainOffset(True) self.tailEndHandleCtrlSpace.addConstraint( self.tailEndHandleInputConstraint) # Constraint outputs self.tailBaseOutputConstraint = PoseConstraint('_'.join( [self.tailBaseOutputTgt.getName(), 'To', 'spineBase'])) self.tailBaseOutputConstraint.addConstrainer(self.tailOutputs[0]) self.tailBaseOutputTgt.addConstraint(self.tailBaseOutputConstraint) self.tailEndOutputConstraint = PoseConstraint('_'.join( [self.tailEndOutputTgt.getName(), 'To', 'spineEnd'])) self.tailEndOutputConstraint.addConstrainer(self.tailOutputs[0]) self.tailEndOutputTgt.addConstraint(self.tailEndOutputConstraint) # =============== # Add Splice Ops # =============== # Add Tail Splice Op self.bezierTailKLOp = KLOperator('tailKLOp', 'BezierSpineSolver', 'Kraken') self.addOperator(self.bezierTailKLOp) # Add Att Inputs self.bezierTailKLOp.setInput('drawDebug', self.drawDebugInputAttr) self.bezierTailKLOp.setInput('rigScale', self.rigScaleInputAttr) self.bezierTailKLOp.setInput('length', self.lengthInputAttr) # Add Xfo Inputs self.bezierTailKLOp.setInput('base', self.spineEndInputTgt) self.bezierTailKLOp.setInput('baseHandle', self.tailBaseHandleCtrl) self.bezierTailKLOp.setInput('tipHandle', self.tailEndHandleCtrl) self.bezierTailKLOp.setInput('tip', self.tailEndCtrl) # Add Xfo Outputs self.bezierTailKLOp.setOutput('outputs', self.tailOutputs) # Add Deformer Splice Op self.deformersToOutputsKLOp = KLOperator('tailDeformerKLOp', 'MultiPoseConstraintSolver', 'Kraken') self.addOperator(self.deformersToOutputsKLOp) # Add Att Inputs self.deformersToOutputsKLOp.setInput('drawDebug', self.drawDebugInputAttr) self.deformersToOutputsKLOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Outputs self.deformersToOutputsKLOp.setInput('constrainers', self.tailOutputs) # Add Xfo Outputs self.deformersToOutputsKLOp.setOutput('constrainees', self.deformerJoints) Profiler.getInstance().pop()
def __init__(self, name="spine", parent=None): Profiler.getInstance().push("Construct Spine Rig Component:" + name) super(FabriceSpineRig, self).__init__(name, parent) # ========= # Controls # ========= # COG self.cogCtrlSpace = CtrlSpace('cog', parent=self.ctrlCmpGrp) self.cogCtrl = Control('cog', parent=self.cogCtrlSpace, shape="circle") self.cogCtrl.rotatePoints(90, 0, 0) self.cogCtrl.scalePoints(Vec3(3.0, 3.0, 3.0)) self.cogCtrl.translatePoints(Vec3(0.0, 0.0, 0.2)) self.cogCtrl.lockScale(x=True, y=True, z=True) self.cogCtrl.setColor("orange") # Spine Base self.spineBaseCtrlSpace = CtrlSpace('spineBase', parent=self.cogCtrl) self.spineBaseCtrl = Control('spineBase', parent=self.spineBaseCtrlSpace, shape="pin") self.spineBaseCtrl.rotatePoints(90, 0, 0) self.spineBaseCtrl.translatePoints(Vec3(0, 1.0, 0)) self.spineBaseCtrl.lockScale(x=True, y=True, z=True) # Spine Base Handle self.spineBaseHandleCtrlSpace = CtrlSpace('spineBaseHandle', parent=self.spineBaseCtrl) self.spineBaseHandleCtrl = Control('spineBaseHandle', parent=self.spineBaseHandleCtrlSpace, shape="pin") self.spineBaseHandleCtrl.rotatePoints(90, 0, 0) self.spineBaseHandleCtrl.translatePoints(Vec3(0, 1.0, 0)) self.spineBaseHandleCtrl.lockScale(x=True, y=True, z=True) self.spineBaseHandleCtrl.setColor("orange") # Spine End self.spineEndCtrlSpace = CtrlSpace('spineEnd', parent=self.cogCtrl) self.spineEndCtrl = Control('spineEnd', parent=self.spineEndCtrlSpace, shape="pin") self.spineEndCtrl.rotatePoints(90, 0, 0) self.spineEndCtrl.lockScale(x=True, y=True, z=True) self.spineEndCtrl.translatePoints(Vec3(0, 1.0, 0)) # Spine End Handle self.spineEndHandleCtrlSpace = CtrlSpace('spineEndHandle', parent=self.spineEndCtrl) self.spineEndHandleCtrl = Control('spineEndHandle', parent=self.spineEndHandleCtrlSpace, shape="pin") self.spineEndHandleCtrl.rotatePoints(90, 0, 0) self.spineEndHandleCtrl.translatePoints(Vec3(0, 1.0, 0)) self.spineEndHandleCtrl.lockScale(x=True, y=True, z=True) self.spineEndHandleCtrl.setColor("orange") # ========== # Deformers # ========== deformersLayer = self.getOrCreateLayer('deformers') self.defCmpGrp = ComponentGroup(self.getName(), self, parent=deformersLayer) self.chestDef = Joint('chest', parent=self.defCmpGrp) self.chestDef.setComponent(self) self.deformerJoints = [] self.spineOutputs = [] self.setNumDeformers(1) # ===================== # Create Component I/O # ===================== # Setup component Xfo I/O's self.spineVertebraeOutput.setTarget(self.spineOutputs) # ===================== # Constraint Deformers # ===================== self.chestDefConstraint = PoseConstraint('_'.join([self.chestDef.getName(), 'To', self.spineBaseOutputTgt.getName()])) self.chestDefConstraint.addConstrainer(self.spineBaseOutputTgt) self.chestDef.addConstraint(self.chestDefConstraint) # ============== # Constrain I/O # ============== # Constraint inputs self.spineSrtInputConstraint = PoseConstraint('_'.join([self.cogCtrlSpace.getName(), 'To', self.spineMainSrtInputTgt.getName()])) self.spineSrtInputConstraint.addConstrainer(self.spineMainSrtInputTgt) self.spineSrtInputConstraint.setMaintainOffset(True) self.cogCtrlSpace.addConstraint(self.spineSrtInputConstraint) # Constraint outputs self.spineCogOutputConstraint = PoseConstraint('_'.join([self.spineCogOutputTgt.getName(), 'To', self.cogCtrl.getName()])) self.spineCogOutputConstraint.addConstrainer(self.cogCtrl) self.spineCogOutputTgt.addConstraint(self.spineCogOutputConstraint) # Spine Base self.spineBaseOutputPosConstraint = PositionConstraint('_'.join([self.spineBaseOutputTgt.getName(), 'PosTo', self.spineOutputs[0].getName()])) self.spineBaseOutputPosConstraint.addConstrainer(self.spineOutputs[0]) self.spineBaseOutputTgt.addConstraint(self.spineBaseOutputPosConstraint) self.spineBaseOutputOriConstraint = OrientationConstraint('_'.join([self.spineBaseOutputTgt.getName(), 'PosTo', self.cogCtrl.getName()])) self.spineBaseOutputOriConstraint.addConstrainer(self.cogCtrl) self.spineBaseOutputTgt.addConstraint(self.spineBaseOutputOriConstraint) # Spine End self.spineEndOutputConstraint = PoseConstraint('_'.join([self.spineEndOutputTgt.getName(), 'To', 'spineEnd'])) self.spineEndOutputConstraint.addConstrainer(self.spineOutputs[0]) self.spineEndOutputTgt.addConstraint(self.spineEndOutputConstraint) self.spineEndCtrlOutputConstraint = PoseConstraint('_'.join([self.spineEndCtrlOutputTgt.getName(), 'To', self.spineEndCtrl.getName()])) self.spineEndCtrlOutputConstraint.addConstrainer(self.spineEndCtrl) self.spineEndCtrlOutputTgt.addConstraint(self.spineEndCtrlOutputConstraint) # =============== # Add Splice Ops # =============== # Add Spine Splice Op self.bezierSpineSpliceOp = SpliceOperator('spineSpliceOp', 'BezierSpineSolver', 'Kraken') self.addOperator(self.bezierSpineSpliceOp) # Add Att Inputs self.bezierSpineSpliceOp.setInput('drawDebug', self.drawDebugInputAttr) self.bezierSpineSpliceOp.setInput('rigScale', self.rigScaleInputAttr) self.bezierSpineSpliceOp.setInput('length', self.lengthInputAttr) # Add Xfo Inputs self.bezierSpineSpliceOp.setInput('base', self.spineBaseCtrl) self.bezierSpineSpliceOp.setInput('baseHandle', self.spineBaseHandleCtrl) self.bezierSpineSpliceOp.setInput('tipHandle', self.spineEndHandleCtrl) self.bezierSpineSpliceOp.setInput('tip', self.spineEndCtrl) # Add Xfo Outputs self.bezierSpineSpliceOp.setOutput('outputs', self.spineOutputs) # Add Deformer Splice Op self.deformersToOutputsSpliceOp = SpliceOperator('spineDeformerSpliceOp', 'MultiPoseConstraintSolver', 'Kraken', alwaysEval=True) self.addOperator(self.deformersToOutputsSpliceOp) # Add Att Inputs self.deformersToOutputsSpliceOp.setInput('drawDebug', self.drawDebugInputAttr) self.deformersToOutputsSpliceOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Outputs self.deformersToOutputsSpliceOp.setInput('constrainers', self.spineOutputs) # Add Xfo Outputs self.deformersToOutputsSpliceOp.setOutput('constrainees', self.deformerJoints) Profiler.getInstance().pop()
class ArmComponentRig(ArmComponent): """Arm Component Rig""" def __init__(self, name='arm', parent=None): Profiler.getInstance().push("Construct Arm Rig Component:" + name) super(ArmComponentRig, self).__init__(name, parent) # ========= # Controls # ========= # Bicep self.bicepFKCtrlSpace = CtrlSpace('bicepFK', parent=self.ctrlCmpGrp) self.bicepFKCtrl = Control('bicepFK', parent=self.bicepFKCtrlSpace, shape="cube") self.bicepFKCtrl.alignOnXAxis() # Forearm self.forearmFKCtrlSpace = CtrlSpace('forearmFK', parent=self.bicepFKCtrl) self.forearmFKCtrl = Control('forearmFK', parent=self.forearmFKCtrlSpace, shape="cube") self.forearmFKCtrl.alignOnXAxis() self.handCtrlSpace = CtrlSpace('hand', parent=self.ctrlCmpGrp) self.handCtrl = Control('hand', parent=self.handCtrlSpace, shape="circle") self.handCtrl.rotatePoints(0, 0, 90) self.handCtrl.scalePoints(Vec3(1.0, 0.75, 0.75)) # Arm IK self.armIKCtrlSpace = CtrlSpace('IK', parent=self.ctrlCmpGrp) self.armIKCtrl = Control('IK', parent=self.armIKCtrlSpace, shape="pin") # Add Params to IK control armSettingsAttrGrp = AttributeGroup("DisplayInfo_ArmSettings", parent=self.armIKCtrl) armDebugInputAttr = BoolAttribute('drawDebug', value=False, parent=armSettingsAttrGrp) self.armBone0LenInputAttr = ScalarAttribute('bone1Len', value=0.0, parent=armSettingsAttrGrp) self.armBone1LenInputAttr = ScalarAttribute('bone2Len', value=0.0, parent=armSettingsAttrGrp) armIKBlendInputAttr = ScalarAttribute('fkik', value=0.0, minValue=0.0, maxValue=1.0, parent=armSettingsAttrGrp) armSoftIKInputAttr = BoolAttribute('softIK', value=True, parent=armSettingsAttrGrp) armSoftDistInputAttr = ScalarAttribute('softDist', value=0.0, minValue=0.0, parent=armSettingsAttrGrp) armStretchInputAttr = BoolAttribute('stretch', value=True, parent=armSettingsAttrGrp) armStretchBlendInputAttr = ScalarAttribute('stretchBlend', value=0.0, minValue=0.0, maxValue=1.0, parent=armSettingsAttrGrp) # Hand Params handSettingsAttrGrp = AttributeGroup("DisplayInfo_HandSettings", parent=self.handCtrl) handLinkToWorldInputAttr = ScalarAttribute('linkToWorld', 0.0, maxValue=1.0, parent=handSettingsAttrGrp) self.drawDebugInputAttr.connect(armDebugInputAttr) # UpV self.armUpVCtrlSpace = CtrlSpace('UpV', parent=self.ctrlCmpGrp) self.armUpVCtrl = Control('UpV', parent=self.armUpVCtrlSpace, shape="triangle") self.armUpVCtrl.alignOnZAxis() self.armUpVCtrl.rotatePoints(180, 0, 0) # ========== # Deformers # ========== deformersLayer = self.getOrCreateLayer('deformers') defCmpGrp = ComponentGroup(self.getName(), self, parent=deformersLayer) bicepDef = Joint('bicep', parent=defCmpGrp) bicepDef.setComponent(self) forearmDef = Joint('forearm', parent=defCmpGrp) forearmDef.setComponent(self) wristDef = Joint('wrist', parent=defCmpGrp) wristDef.setComponent(self) handDef = Joint('hand', parent=defCmpGrp) handDef.setComponent(self) # ============== # Constrain I/O # ============== # Constraint inputs self.armIKCtrlSpaceInputConstraint = PoseConstraint('_'.join([ self.armIKCtrlSpace.getName(), 'To', self.globalSRTInputTgt.getName() ])) self.armIKCtrlSpaceInputConstraint.setMaintainOffset(True) self.armIKCtrlSpaceInputConstraint.addConstrainer( self.globalSRTInputTgt) self.armIKCtrlSpace.addConstraint(self.armIKCtrlSpaceInputConstraint) self.armUpVCtrlSpaceInputConstraint = PoseConstraint('_'.join([ self.armUpVCtrlSpace.getName(), 'To', self.globalSRTInputTgt.getName() ])) self.armUpVCtrlSpaceInputConstraint.setMaintainOffset(True) self.armUpVCtrlSpaceInputConstraint.addConstrainer( self.globalSRTInputTgt) self.armUpVCtrlSpace.addConstraint(self.armUpVCtrlSpaceInputConstraint) self.armRootInputConstraint = PoseConstraint('_'.join([ self.bicepFKCtrlSpace.getName(), 'To', self.clavicleEndInputTgt.getName() ])) self.armRootInputConstraint.setMaintainOffset(True) self.armRootInputConstraint.addConstrainer(self.clavicleEndInputTgt) self.bicepFKCtrlSpace.addConstraint(self.armRootInputConstraint) # Constraint outputs self.handConstraint = PoseConstraint('_'.join( [self.handOutputTgt.getName(), 'To', self.handCtrl.getName()])) self.handConstraint.addConstrainer(self.handCtrl) self.handOutputTgt.addConstraint(self.handConstraint) self.handCtrlSpaceConstraint = PoseConstraint('_'.join([ self.handCtrlSpace.getName(), 'To', self.armEndXfoOutputTgt.getName() ])) self.handCtrlSpaceConstraint.setMaintainOffset(True) self.handCtrlSpaceConstraint.addConstrainer(self.armEndXfoOutputTgt) self.handCtrlSpace.addConstraint(self.handCtrlSpaceConstraint) # =============== # Add Splice Ops # =============== # Add Splice Op self.spliceOp = KLOperator('armKLOp', 'TwoBoneIKSolver', 'Kraken') self.addOperator(self.spliceOp) # Add Att Inputs self.spliceOp.setInput('drawDebug', self.drawDebugInputAttr) self.spliceOp.setInput('rigScale', self.rigScaleInputAttr) self.spliceOp.setInput('bone0Len', self.armBone0LenInputAttr) self.spliceOp.setInput('bone1Len', self.armBone1LenInputAttr) self.spliceOp.setInput('ikblend', armIKBlendInputAttr) self.spliceOp.setInput('softIK', armSoftIKInputAttr) self.spliceOp.setInput('softDist', armSoftDistInputAttr) self.spliceOp.setInput('stretch', armStretchInputAttr) self.spliceOp.setInput('stretchBlend', armStretchBlendInputAttr) self.spliceOp.setInput('rightSide', self.rightSideInputAttr) # Add Xfo Inputs self.spliceOp.setInput('root', self.clavicleEndInputTgt) self.spliceOp.setInput('bone0FK', self.bicepFKCtrl) self.spliceOp.setInput('bone1FK', self.forearmFKCtrl) self.spliceOp.setInput('ikHandle', self.armIKCtrl) self.spliceOp.setInput('upV', self.armUpVCtrl) # Add Xfo Outputs self.spliceOp.setOutput('bone0Out', self.bicepOutputTgt) self.spliceOp.setOutput('bone1Out', self.forearmOutputTgt) self.spliceOp.setOutput('bone2Out', self.armEndXfoOutputTgt) # Add Deformer Splice Op self.outputsToDeformersKLOp = KLOperator('armDeformerKLOp', 'MultiPoseConstraintSolver', 'Kraken') self.addOperator(self.outputsToDeformersKLOp) # Add Att Inputs self.outputsToDeformersKLOp.setInput('drawDebug', self.drawDebugInputAttr) self.outputsToDeformersKLOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Inputs self.outputsToDeformersKLOp.setInput('constrainers', [ self.bicepOutputTgt, self.forearmOutputTgt, self.armEndXfoOutputTgt, self.handOutputTgt ]) # Add Xfo Outputs self.outputsToDeformersKLOp.setOutput( 'constrainees', [bicepDef, forearmDef, wristDef, handDef]) Profiler.getInstance().pop() def loadData(self, data=None): """Load a saved guide representation from persisted data. Arguments: data -- object, The JSON data object. Return: True if successful. """ super(ArmComponentRig, self).loadData(data) self.clavicleEndInputTgt.xfo.tr = data['bicepXfo'].tr self.bicepFKCtrlSpace.xfo = data['bicepXfo'] self.bicepFKCtrl.xfo = data['bicepXfo'] self.bicepFKCtrl.scalePoints( Vec3(data['bicepLen'], data['bicepFKCtrlSize'], data['bicepFKCtrlSize'])) self.bicepOutputTgt.xfo = data['bicepXfo'] self.forearmOutputTgt.xfo = data['forearmXfo'] self.forearmFKCtrlSpace.xfo = data['forearmXfo'] self.forearmFKCtrl.xfo = data['forearmXfo'] self.forearmFKCtrl.scalePoints( Vec3(data['forearmLen'], data['forearmFKCtrlSize'], data['forearmFKCtrlSize'])) self.handCtrlSpace.xfo = data['handXfo'] self.handCtrl.xfo = data['handXfo'] self.armIKCtrlSpace.xfo.tr = data['armEndXfo'].tr self.armIKCtrl.xfo.tr = data['armEndXfo'].tr if self.getLocation() == "R": self.armIKCtrl.rotatePoints(0, 90, 0) else: self.armIKCtrl.rotatePoints(0, -90, 0) self.armUpVCtrlSpace.xfo = data['upVXfo'] self.armUpVCtrl.xfo = data['upVXfo'] self.rightSideInputAttr.setValue(self.getLocation() is 'R') self.armBone0LenInputAttr.setMin(0.0) self.armBone0LenInputAttr.setMax(data['bicepLen'] * 3.0) self.armBone0LenInputAttr.setValue(data['bicepLen']) self.armBone1LenInputAttr.setMin(0.0) self.armBone1LenInputAttr.setMax(data['forearmLen'] * 3.0) self.armBone1LenInputAttr.setValue(data['forearmLen']) # Outputs self.handOutputTgt.xfo = data['handXfo'] # Eval Constraints self.armIKCtrlSpaceInputConstraint.evaluate() self.armUpVCtrlSpaceInputConstraint.evaluate() self.armRootInputConstraint.evaluate() self.armRootInputConstraint.evaluate() self.handConstraint.evaluate() self.handCtrlSpaceConstraint.evaluate() # Eval Operators self.spliceOp.evaluate() self.outputsToDeformersKLOp.evaluate()
class LegComponentRig(LegComponent): """Leg Component""" def __init__(self, name='leg', parent=None): Profiler.getInstance().push("Construct Leg Rig Component:" + name) super(LegComponentRig, self).__init__(name, parent) # ========= # Controls # ========= # Femur self.femurFKCtrlSpace = CtrlSpace('femurFK', parent=self.ctrlCmpGrp) self.femurFKCtrl = Control('femurFK', parent=self.femurFKCtrlSpace, shape="cube") self.femurFKCtrl.alignOnXAxis() # Shin self.shinFKCtrlSpace = CtrlSpace('shinFK', parent=self.femurFKCtrl) self.shinFKCtrl = Control('shinFK', parent=self.shinFKCtrlSpace, shape="cube") self.shinFKCtrl.alignOnXAxis() # Ankle self.legIKCtrlSpace = CtrlSpace('IK', parent=self.ctrlCmpGrp) self.legIKCtrl = Control('IK', parent=self.legIKCtrlSpace, shape="pin") # FK Foot self.footCtrlSpace = CtrlSpace('foot', parent=self.ctrlCmpGrp) self.footCtrl = Control('foot', parent=self.footCtrlSpace, shape="cube") self.footCtrl.alignOnXAxis() # FK Toe self.toeCtrlSpace = CtrlSpace('toe', parent=self.footCtrl) self.toeCtrl = Control('toe', parent=self.toeCtrlSpace, shape="cube") self.toeCtrl.alignOnXAxis() # Rig Ref objects self.footRefSrt = Locator('footRef', parent=self.ctrlCmpGrp) # Add Component Params to IK control footSettingsAttrGrp = AttributeGroup("DisplayInfo_FootSettings", parent=self.footCtrl) footLinkToWorldInputAttr = ScalarAttribute('linkToWorld', 1.0, maxValue=1.0, parent=footSettingsAttrGrp) # Add Component Params to IK control legSettingsAttrGrp = AttributeGroup("DisplayInfo_LegSettings", parent=self.legIKCtrl) legDrawDebugInputAttr = BoolAttribute('drawDebug', value=False, parent=legSettingsAttrGrp) self.legBone0LenInputAttr = ScalarAttribute('bone0Len', value=1.0, parent=legSettingsAttrGrp) self.legBone1LenInputAttr = ScalarAttribute('bone1Len', value=1.0, parent=legSettingsAttrGrp) legIKBlendInputAttr = ScalarAttribute('ikblend', value=1.0, minValue=0.0, maxValue=1.0, parent=legSettingsAttrGrp) legSoftIKInputAttr = BoolAttribute('softIK', value=True, parent=legSettingsAttrGrp) legSoftDistInputAttr = ScalarAttribute('softDist', value=0.0, minValue=0.0, parent=legSettingsAttrGrp) legStretchInputAttr = BoolAttribute('stretch', value=True, parent=legSettingsAttrGrp) legStretchBlendInputAttr = ScalarAttribute('stretchBlend', value=0.0, minValue=0.0, maxValue=1.0, parent=legSettingsAttrGrp) self.drawDebugInputAttr.connect(legDrawDebugInputAttr) # UpV self.legUpVCtrlSpace = CtrlSpace('UpV', parent=self.ctrlCmpGrp) self.legUpVCtrl = Control('UpV', parent=self.legUpVCtrlSpace, shape="triangle") self.legUpVCtrl.alignOnZAxis() # ========== # Deformers # ========== deformersLayer = self.getOrCreateLayer('deformers') self.defCmpGrp = ComponentGroup(self.getName(), self, parent=deformersLayer) femurDef = Joint('femur', parent=self.defCmpGrp) femurDef.setComponent(self) shinDef = Joint('shin', parent=self.defCmpGrp) shinDef.setComponent(self) ankleDef = Joint('ankle', parent=self.defCmpGrp) ankleDef.setComponent(self) self.footDef = Joint('foot', parent=self.defCmpGrp) self.footDef.setComponent(self) self.toeDef = Joint('toe', parent=self.defCmpGrp) self.toeDef.setComponent(self) # ============== # Constrain I/O # ============== # Constraint inputs self.legIKCtrlSpaceInputConstraint = PoseConstraint('_'.join([self.legIKCtrlSpace.getName(), 'To', self.globalSRTInputTgt.getName()])) self.legIKCtrlSpaceInputConstraint.setMaintainOffset(True) self.legIKCtrlSpaceInputConstraint.addConstrainer(self.globalSRTInputTgt) self.legIKCtrlSpace.addConstraint(self.legIKCtrlSpaceInputConstraint) self.legUpVCtrlSpaceInputConstraint = PoseConstraint('_'.join([self.legUpVCtrlSpace.getName(), 'To', self.globalSRTInputTgt.getName()])) self.legUpVCtrlSpaceInputConstraint.setMaintainOffset(True) self.legUpVCtrlSpaceInputConstraint.addConstrainer(self.globalSRTInputTgt) self.legUpVCtrlSpace.addConstraint(self.legUpVCtrlSpaceInputConstraint) self.legRootInputConstraint = PoseConstraint('_'.join([self.legIKCtrl.getName(), 'To', self.legPelvisInputTgt.getName()])) self.legRootInputConstraint.setMaintainOffset(True) self.legRootInputConstraint.addConstrainer(self.legPelvisInputTgt) self.femurFKCtrlSpace.addConstraint(self.legRootInputConstraint) # Constraint outputs self.footOutputConstraint = PoseConstraint('_'.join([self.footOutputTgt.getName(), 'To', self.footCtrl.getName()])) self.footOutputConstraint.addConstrainer(self.footCtrl) self.footOutputTgt.addConstraint(self.footOutputConstraint) self.toeOutputConstraint = PoseConstraint('_'.join([self.toeOutputTgt.getName(), 'To', self.toeCtrl.getName()])) self.toeOutputConstraint.addConstrainer(self.toeCtrl) self.toeOutputTgt.addConstraint(self.toeOutputConstraint) # =============== # Add Splice Ops # =============== # Add Leg Splice Op self.legIKSpliceOp = SpliceOperator('legSpliceOp', 'TwoBoneIKSolver', 'Kraken') self.addOperator(self.legIKSpliceOp) # Add Att Inputs self.legIKSpliceOp.setInput('drawDebug', self.drawDebugInputAttr) self.legIKSpliceOp.setInput('rigScale', self.rigScaleInputAttr) self.legIKSpliceOp.setInput('bone0Len', self.legBone0LenInputAttr) self.legIKSpliceOp.setInput('bone1Len', self.legBone1LenInputAttr) self.legIKSpliceOp.setInput('ikblend', legIKBlendInputAttr) self.legIKSpliceOp.setInput('softIK', legSoftIKInputAttr) self.legIKSpliceOp.setInput('softDist', legSoftDistInputAttr) self.legIKSpliceOp.setInput('stretch', legStretchInputAttr) self.legIKSpliceOp.setInput('stretchBlend', legStretchBlendInputAttr) self.legIKSpliceOp.setInput('rightSide', self.rightSideInputAttr) # Add Xfo Inputs self.legIKSpliceOp.setInput('root', self.legPelvisInputTgt) self.legIKSpliceOp.setInput('bone0FK', self.femurFKCtrl) self.legIKSpliceOp.setInput('bone1FK', self.shinFKCtrl) self.legIKSpliceOp.setInput('ikHandle', self.legIKCtrl) self.legIKSpliceOp.setInput('upV', self.legUpVCtrl) # Add Xfo Outputs self.legIKSpliceOp.setOutput('bone0Out', self.femurOutputTgt) self.legIKSpliceOp.setOutput('bone1Out', self.shinOutputTgt) self.legIKSpliceOp.setOutput('bone2Out', self.legEndXfoOutputTgt) # Add Leg Deformer Splice Op self.outputsToDeformersSpliceOp = SpliceOperator('legDeformerSpliceOp', 'MultiPoseConstraintSolver', 'Kraken') self.addOperator(self.outputsToDeformersSpliceOp) # Add Att Inputs self.outputsToDeformersSpliceOp.setInput('drawDebug', self.drawDebugInputAttr) self.outputsToDeformersSpliceOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Inputs self.outputsToDeformersSpliceOp.setInput('constrainers', [self.femurOutputTgt, self.shinOutputTgt, self.legEndXfoOutputTgt]) # Add Xfo Outputs self.outputsToDeformersSpliceOp.setOutput('constrainees', [femurDef, shinDef, ankleDef]) # Add Foot Deformer Splice Op self.footDefSpliceOp = SpliceOperator('footDeformerSpliceOp', 'PoseConstraintSolver', 'Kraken') self.addOperator(self.footDefSpliceOp) # Add Att Inputs self.footDefSpliceOp.setInput('drawDebug', self.drawDebugInputAttr) self.footDefSpliceOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Inputs) self.footDefSpliceOp.setInput('constrainer', self.footOutputTgt) # Add Xfo Outputs self.footDefSpliceOp.setOutput('constrainee', self.footDef) # Add Toe Deformer Splice Op self.toeDefSpliceOp = SpliceOperator('toeDeformerSpliceOp', 'PoseConstraintSolver', 'Kraken') self.addOperator(self.toeDefSpliceOp) # Add Att Inputs self.toeDefSpliceOp.setInput('drawDebug', self.drawDebugInputAttr) self.toeDefSpliceOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Inputs self.toeDefSpliceOp.setInput('constrainer', self.toeOutputTgt) # Add Xfo Outputs self.toeDefSpliceOp.setOutput('constrainee', self.toeDef) Profiler.getInstance().pop() # ============= # Data Methods # ============= def loadData(self, data=None): """Load a saved guide representation from persisted data. Arguments: data -- object, The JSON data object. Return: True if successful. """ super(LegComponentRig, self).loadData( data ) self.femurFKCtrlSpace.xfo = data['femurXfo'] self.femurFKCtrl.xfo = data['femurXfo'] self.femurFKCtrl.scalePoints(Vec3(data['femurLen'], 1.75, 1.75)) self.femurOutputTgt.xfo = data['femurXfo'] self.shinOutputTgt.xfo = data['kneeXfo'] self.shinFKCtrlSpace.xfo = data['kneeXfo'] self.shinFKCtrl.xfo = data['kneeXfo'] self.shinFKCtrl.scalePoints(Vec3(data['shinLen'], 1.5, 1.5)) self.footCtrlSpace.xfo.tr = data['ankleXfo'].tr self.footCtrl.xfo.tr = data['ankleXfo'].tr self.toeCtrlSpace.xfo = data['toeXfo'] self.toeCtrl.xfo = data['toeXfo'] self.legIKCtrlSpace.xfo.tr = data['ankleXfo'].tr self.legIKCtrl.xfo.tr = data['ankleXfo'].tr if self.getLocation() == "R": self.legIKCtrl.rotatePoints(0, 90, 0) self.legIKCtrl.translatePoints(Vec3(-1.0, 0.0, 0.0)) else: self.legIKCtrl.rotatePoints(0, -90, 0) self.legIKCtrl.translatePoints(Vec3(1.0, 0.0, 0.0)) self.legUpVCtrlSpace.xfo = data['upVXfo'] self.legUpVCtrl.xfo = data['upVXfo'] self.rightSideInputAttr.setValue(self.getLocation() is 'R') self.legBone0LenInputAttr.setMin(0.0) self.legBone0LenInputAttr.setMax(data['femurLen'] * 3.0) self.legBone0LenInputAttr.setValue(data['femurLen']) self.legBone1LenInputAttr.setMin(0.0) self.legBone1LenInputAttr.setMax(data['shinLen'] * 3.0) self.legBone1LenInputAttr.setValue(data['shinLen']) self.legPelvisInputTgt.xfo = data['femurXfo'] # Eval Constraints self.legIKCtrlSpaceInputConstraint.evaluate() self.legUpVCtrlSpaceInputConstraint.evaluate() self.legRootInputConstraint.evaluate() self.footOutputConstraint.evaluate() self.toeOutputConstraint.evaluate() # Eval Operators self.legIKSpliceOp.evaluate() self.outputsToDeformersSpliceOp.evaluate() self.footDefSpliceOp.evaluate()
def __init__(self, name='arm', parent=None): Profiler.getInstance().push("Construct Arm Rig Component:" + name) super(ArmComponentRig, self).__init__(name, parent) # ========= # Controls # ========= # Bicep self.bicepFKCtrlSpace = CtrlSpace('bicepFK', parent=self.ctrlCmpGrp) self.bicepFKCtrl = Control('bicepFK', parent=self.bicepFKCtrlSpace, shape="cube") self.bicepFKCtrl.alignOnXAxis() # Forearm self.forearmFKCtrlSpace = CtrlSpace('forearmFK', parent=self.bicepFKCtrl) self.forearmFKCtrl = Control('forearmFK', parent=self.forearmFKCtrlSpace, shape="cube") self.forearmFKCtrl.alignOnXAxis() self.handCtrlSpace = CtrlSpace('hand', parent=self.ctrlCmpGrp) self.handCtrl = Control('hand', parent=self.handCtrlSpace, shape="circle") self.handCtrl.rotatePoints(0, 0, 90) self.handCtrl.scalePoints(Vec3(1.0, 0.75, 0.75)) # Arm IK self.armIKCtrlSpace = CtrlSpace('IK', parent=self.ctrlCmpGrp) self.armIKCtrl = Control('IK', parent=self.armIKCtrlSpace, shape="pin") # Add Params to IK control armSettingsAttrGrp = AttributeGroup("DisplayInfo_ArmSettings", parent=self.armIKCtrl) armDebugInputAttr = BoolAttribute('drawDebug', value=False, parent=armSettingsAttrGrp) self.armBone0LenInputAttr = ScalarAttribute('bone1Len', value=0.0, parent=armSettingsAttrGrp) self.armBone1LenInputAttr = ScalarAttribute('bone2Len', value=0.0, parent=armSettingsAttrGrp) armIKBlendInputAttr = ScalarAttribute('fkik', value=0.0, minValue=0.0, maxValue=1.0, parent=armSettingsAttrGrp) armSoftIKInputAttr = BoolAttribute('softIK', value=True, parent=armSettingsAttrGrp) armSoftDistInputAttr = ScalarAttribute('softDist', value=0.0, minValue=0.0, parent=armSettingsAttrGrp) armStretchInputAttr = BoolAttribute('stretch', value=True, parent=armSettingsAttrGrp) armStretchBlendInputAttr = ScalarAttribute('stretchBlend', value=0.0, minValue=0.0, maxValue=1.0, parent=armSettingsAttrGrp) # Hand Params handSettingsAttrGrp = AttributeGroup("DisplayInfo_HandSettings", parent=self.handCtrl) handLinkToWorldInputAttr = ScalarAttribute('linkToWorld', 0.0, maxValue=1.0, parent=handSettingsAttrGrp) self.drawDebugInputAttr.connect(armDebugInputAttr) # UpV self.armUpVCtrlSpace = CtrlSpace('UpV', parent=self.ctrlCmpGrp) self.armUpVCtrl = Control('UpV', parent=self.armUpVCtrlSpace, shape="triangle") self.armUpVCtrl.alignOnZAxis() self.armUpVCtrl.rotatePoints(180, 0, 0) # ========== # Deformers # ========== deformersLayer = self.getOrCreateLayer('deformers') defCmpGrp = ComponentGroup(self.getName(), self, parent=deformersLayer) bicepDef = Joint('bicep', parent=defCmpGrp) bicepDef.setComponent(self) forearmDef = Joint('forearm', parent=defCmpGrp) forearmDef.setComponent(self) wristDef = Joint('wrist', parent=defCmpGrp) wristDef.setComponent(self) handDef = Joint('hand', parent=defCmpGrp) handDef.setComponent(self) # ============== # Constrain I/O # ============== # Constraint inputs self.armIKCtrlSpaceInputConstraint = PoseConstraint('_'.join([ self.armIKCtrlSpace.getName(), 'To', self.globalSRTInputTgt.getName() ])) self.armIKCtrlSpaceInputConstraint.setMaintainOffset(True) self.armIKCtrlSpaceInputConstraint.addConstrainer( self.globalSRTInputTgt) self.armIKCtrlSpace.addConstraint(self.armIKCtrlSpaceInputConstraint) self.armUpVCtrlSpaceInputConstraint = PoseConstraint('_'.join([ self.armUpVCtrlSpace.getName(), 'To', self.globalSRTInputTgt.getName() ])) self.armUpVCtrlSpaceInputConstraint.setMaintainOffset(True) self.armUpVCtrlSpaceInputConstraint.addConstrainer( self.globalSRTInputTgt) self.armUpVCtrlSpace.addConstraint(self.armUpVCtrlSpaceInputConstraint) self.armRootInputConstraint = PoseConstraint('_'.join([ self.bicepFKCtrlSpace.getName(), 'To', self.clavicleEndInputTgt.getName() ])) self.armRootInputConstraint.setMaintainOffset(True) self.armRootInputConstraint.addConstrainer(self.clavicleEndInputTgt) self.bicepFKCtrlSpace.addConstraint(self.armRootInputConstraint) # Constraint outputs self.handConstraint = PoseConstraint('_'.join( [self.handOutputTgt.getName(), 'To', self.handCtrl.getName()])) self.handConstraint.addConstrainer(self.handCtrl) self.handOutputTgt.addConstraint(self.handConstraint) self.handCtrlSpaceConstraint = PoseConstraint('_'.join([ self.handCtrlSpace.getName(), 'To', self.armEndXfoOutputTgt.getName() ])) self.handCtrlSpaceConstraint.setMaintainOffset(True) self.handCtrlSpaceConstraint.addConstrainer(self.armEndXfoOutputTgt) self.handCtrlSpace.addConstraint(self.handCtrlSpaceConstraint) # =============== # Add Splice Ops # =============== # Add Splice Op self.spliceOp = KLOperator('armKLOp', 'TwoBoneIKSolver', 'Kraken') self.addOperator(self.spliceOp) # Add Att Inputs self.spliceOp.setInput('drawDebug', self.drawDebugInputAttr) self.spliceOp.setInput('rigScale', self.rigScaleInputAttr) self.spliceOp.setInput('bone0Len', self.armBone0LenInputAttr) self.spliceOp.setInput('bone1Len', self.armBone1LenInputAttr) self.spliceOp.setInput('ikblend', armIKBlendInputAttr) self.spliceOp.setInput('softIK', armSoftIKInputAttr) self.spliceOp.setInput('softDist', armSoftDistInputAttr) self.spliceOp.setInput('stretch', armStretchInputAttr) self.spliceOp.setInput('stretchBlend', armStretchBlendInputAttr) self.spliceOp.setInput('rightSide', self.rightSideInputAttr) # Add Xfo Inputs self.spliceOp.setInput('root', self.clavicleEndInputTgt) self.spliceOp.setInput('bone0FK', self.bicepFKCtrl) self.spliceOp.setInput('bone1FK', self.forearmFKCtrl) self.spliceOp.setInput('ikHandle', self.armIKCtrl) self.spliceOp.setInput('upV', self.armUpVCtrl) # Add Xfo Outputs self.spliceOp.setOutput('bone0Out', self.bicepOutputTgt) self.spliceOp.setOutput('bone1Out', self.forearmOutputTgt) self.spliceOp.setOutput('bone2Out', self.armEndXfoOutputTgt) # Add Deformer Splice Op self.outputsToDeformersKLOp = KLOperator('armDeformerKLOp', 'MultiPoseConstraintSolver', 'Kraken') self.addOperator(self.outputsToDeformersKLOp) # Add Att Inputs self.outputsToDeformersKLOp.setInput('drawDebug', self.drawDebugInputAttr) self.outputsToDeformersKLOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Inputs self.outputsToDeformersKLOp.setInput('constrainers', [ self.bicepOutputTgt, self.forearmOutputTgt, self.armEndXfoOutputTgt, self.handOutputTgt ]) # Add Xfo Outputs self.outputsToDeformersKLOp.setOutput( 'constrainees', [bicepDef, forearmDef, wristDef, handDef]) Profiler.getInstance().pop()
def __init__(self, name, parent=None, location='M'): super(ArmComponent, self).__init__(name, parent, location) # ========= # Controls # ========= # Setup component attributes defaultAttrGroup = self.getAttributeGroupByIndex(0) defaultAttrGroup.addAttribute(BoolAttribute("toggleDebugging", True)) # Default values if self.getLocation() == "R": ctrlColor = "red" bicepPosition = Vec3(-2.27, 15.295, -0.753) forearmPosition = Vec3(-5.039, 13.56, -0.859) wristPosition = Vec3(-7.1886, 12.2819, 0.4906) else: ctrlColor = "greenBright" bicepPosition = Vec3(2.27, 15.295, -0.753) forearmPosition = Vec3(5.039, 13.56, -0.859) wristPosition = Vec3(7.1886, 12.2819, 0.4906) # Calculate Bicep Xfo rootToWrist = wristPosition.subtract(bicepPosition).unit() rootToElbow = forearmPosition.subtract(bicepPosition).unit() bone1Normal = rootToWrist.cross(rootToElbow).unit() bone1ZAxis = rootToElbow.cross(bone1Normal).unit() bicepXfo = Xfo() bicepXfo.setFromVectors(rootToElbow, bone1Normal, bone1ZAxis, bicepPosition) # Calculate Forearm Xfo elbowToWrist = wristPosition.subtract(forearmPosition).unit() elbowToRoot = bicepPosition.subtract(forearmPosition).unit() bone2Normal = elbowToRoot.cross(elbowToWrist).unit() bone2ZAxis = elbowToWrist.cross(bone2Normal).unit() forearmXfo = Xfo() forearmXfo.setFromVectors(elbowToWrist, bone2Normal, bone2ZAxis, forearmPosition) # Bicep bicepFKCtrl = CubeControl('bicepFK') bicepFKCtrl.alignOnXAxis() bicepLen = bicepPosition.subtract(forearmPosition).length() bicepFKCtrl.scalePoints(Vec3(bicepLen, 1.75, 1.75)) bicepFKCtrl.setColor(ctrlColor) bicepFKCtrl.xfo.copy(bicepXfo) bicepFKCtrlSrtBuffer = SrtBuffer('bicepFK') self.addChild(bicepFKCtrlSrtBuffer) bicepFKCtrlSrtBuffer.xfo.copy(bicepFKCtrl.xfo) bicepFKCtrlSrtBuffer.addChild(bicepFKCtrl) # Forearm forearmFKCtrl = CubeControl('forearmFK') forearmFKCtrl.alignOnXAxis() forearmLen = forearmPosition.subtract(wristPosition).length() forearmFKCtrl.scalePoints(Vec3(forearmLen, 1.5, 1.5)) forearmFKCtrl.setColor(ctrlColor) forearmFKCtrl.xfo.copy(forearmXfo) forearmFKCtrlSrtBuffer = SrtBuffer('forearmFK') bicepFKCtrl.addChild(forearmFKCtrlSrtBuffer) forearmFKCtrlSrtBuffer.xfo.copy(forearmFKCtrl.xfo) forearmFKCtrlSrtBuffer.addChild(forearmFKCtrl) # Arm IK armIKCtrlSrtBuffer = SrtBuffer('IK', parent=self) armIKCtrlSrtBuffer.xfo.tr.copy(wristPosition) armIKCtrl = PinControl('IK', parent=armIKCtrlSrtBuffer) armIKCtrl.xfo.copy(armIKCtrlSrtBuffer.xfo) armIKCtrl.setColor(ctrlColor) if self.getLocation() == "R": armIKCtrl.rotatePoints(0, 90, 0) else: armIKCtrl.rotatePoints(0, -90, 0) # Add Component Params to IK control armDebugInputAttr = BoolAttribute('debug', True) armBone1LenInputAttr = FloatAttribute('bone1Len', bicepLen, 0.0, 100.0) armBone2LenInputAttr = FloatAttribute('bone2Len', forearmLen, 0.0, 100.0) armFkikInputAttr = FloatAttribute('fkik', 0.0, 0.0, 1.0) armSoftIKInputAttr = BoolAttribute('softIK', True) armSoftDistInputAttr = FloatAttribute('softDist', 0.0, 0.0, 1.0) armStretchInputAttr = BoolAttribute('stretch', True) armStretchBlendInputAttr = FloatAttribute('stretchBlend', 0.0, 0.0, 1.0) armSettingsAttrGrp = AttributeGroup("DisplayInfo_ArmSettings") armIKCtrl.addAttributeGroup(armSettingsAttrGrp) armSettingsAttrGrp.addAttribute(armDebugInputAttr) armSettingsAttrGrp.addAttribute(armBone1LenInputAttr) armSettingsAttrGrp.addAttribute(armBone2LenInputAttr) armSettingsAttrGrp.addAttribute(armFkikInputAttr) armSettingsAttrGrp.addAttribute(armSoftIKInputAttr) armSettingsAttrGrp.addAttribute(armSoftDistInputAttr) armSettingsAttrGrp.addAttribute(armStretchInputAttr) armSettingsAttrGrp.addAttribute(armStretchBlendInputAttr) # UpV upVXfo = xfoFromDirAndUpV(bicepPosition, wristPosition, forearmPosition) upVXfo.tr.copy(forearmPosition) upVOffset = Vec3(0, 0, 5) upVOffset = upVXfo.transformVector(upVOffset) armUpVCtrl = TriangleControl('UpV') armUpVCtrl.xfo.tr.copy(upVOffset) armUpVCtrl.alignOnZAxis() armUpVCtrl.rotatePoints(180, 0, 0) armUpVCtrl.setColor(ctrlColor) armUpVCtrlSrtBuffer = SrtBuffer('UpV') self.addChild(armUpVCtrlSrtBuffer) armUpVCtrlSrtBuffer.xfo.tr.copy(upVOffset) armUpVCtrlSrtBuffer.addChild(armUpVCtrl) # ========== # Deformers # ========== container = self.getParent().getParent() deformersLayer = container.getChildByName('deformers') bicepDef = Joint('bicep') bicepDef.setComponent(self) forearmDef = Joint('forearm') forearmDef.setComponent(self) wristDef = Joint('wrist') wristDef.setComponent(self) deformersLayer.addChild(bicepDef) deformersLayer.addChild(forearmDef) deformersLayer.addChild(wristDef) # ===================== # Create Component I/O # ===================== # Setup component Xfo I/O's clavicleEndInput = Locator('clavicleEnd') clavicleEndInput.xfo.copy(bicepXfo) bicepOutput = Locator('bicep') bicepOutput.xfo.copy(bicepXfo) forearmOutput = Locator('forearm') forearmOutput.xfo.copy(forearmXfo) armEndXfo = Xfo() armEndXfo.rot = forearmXfo.rot.clone() armEndXfo.tr.copy(wristPosition) armEndXfoOutput = Locator('armEndXfo') armEndXfoOutput.xfo.copy(armEndXfo) armEndPosOutput = Locator('armEndPos') armEndPosOutput.xfo.copy(armEndXfo) # Setup componnent Attribute I/O's debugInputAttr = BoolAttribute('debug', True) bone1LenInputAttr = FloatAttribute('bone1Len', bicepLen, 0.0, 100.0) bone2LenInputAttr = FloatAttribute('bone2Len', forearmLen, 0.0, 100.0) fkikInputAttr = FloatAttribute('fkik', 0.0, 0.0, 1.0) softIKInputAttr = BoolAttribute('softIK', True) softDistInputAttr = FloatAttribute('softDist', 0.5, 0.0, 1.0) stretchInputAttr = BoolAttribute('stretch', True) stretchBlendInputAttr = FloatAttribute('stretchBlend', 0.0, 0.0, 1.0) rightSideInputAttr = BoolAttribute('rightSide', location is 'R') # Connect attrs to control attrs debugInputAttr.connect(armDebugInputAttr) bone1LenInputAttr.connect(armBone1LenInputAttr) bone2LenInputAttr.connect(armBone2LenInputAttr) fkikInputAttr.connect(armFkikInputAttr) softIKInputAttr.connect(armSoftIKInputAttr) softDistInputAttr.connect(armSoftDistInputAttr) stretchInputAttr.connect(armStretchInputAttr) stretchBlendInputAttr.connect(armStretchBlendInputAttr) # ============== # Constrain I/O # ============== # Constraint inputs armRootInputConstraint = PoseConstraint('_'.join([armIKCtrl.getName(), 'To', clavicleEndInput.getName()])) armRootInputConstraint.setMaintainOffset(True) armRootInputConstraint.addConstrainer(clavicleEndInput) bicepFKCtrlSrtBuffer.addConstraint(armRootInputConstraint) # Constraint outputs # ================== # Add Component I/O # ================== # Add Xfo I/O's self.addInput(clavicleEndInput) self.addOutput(bicepOutput) self.addOutput(forearmOutput) self.addOutput(armEndXfoOutput) self.addOutput(armEndPosOutput) # Add Attribute I/O's self.addInput(debugInputAttr) self.addInput(bone1LenInputAttr) self.addInput(bone2LenInputAttr) self.addInput(fkikInputAttr) self.addInput(softIKInputAttr) self.addInput(softDistInputAttr) self.addInput(stretchInputAttr) self.addInput(stretchBlendInputAttr) self.addInput(rightSideInputAttr)
class LegComponentRig(LegComponent): """Leg Component""" def __init__(self, name='leg', parent=None): Profiler.getInstance().push("Construct Leg Rig Component:" + name) super(LegComponentRig, self).__init__(name, parent) # ========= # Controls # ========= # Femur self.femurFKCtrlSpace = CtrlSpace('femurFK', parent=self.ctrlCmpGrp) self.femurFKCtrl = Control('femurFK', parent=self.femurFKCtrlSpace, shape="cube") self.femurFKCtrl.alignOnXAxis() self.femurFKCtrl.lockTranslation(True, True, True) self.femurFKCtrl.lockScale(True, True, True) # Shin self.shinFKCtrlSpace = CtrlSpace('shinFK', parent=self.femurFKCtrl) self.shinFKCtrl = Control('shinFK', parent=self.shinFKCtrlSpace, shape="cube") self.shinFKCtrl.alignOnXAxis() self.shinFKCtrl.lockTranslation(True, True, True) self.shinFKCtrl.lockScale(True, True, True) # IK Handle self.legIKCtrlSpace = CtrlSpace('IK', parent=self.ctrlCmpGrp) self.legIKCtrl = Control('IK', parent=self.legIKCtrlSpace, shape="pin") self.legIKCtrl.lockScale(True, True, True) # Add Component Params to IK control legSettingsAttrGrp = AttributeGroup("DisplayInfo_LegSettings", parent=self.legIKCtrl) legDrawDebugInputAttr = BoolAttribute('drawDebug', value=False, parent=legSettingsAttrGrp) self.legRightSideInputAttr = BoolAttribute('rightSide', value=False, parent=legSettingsAttrGrp) self.legBone0LenInputAttr = ScalarAttribute('bone0Len', value=1.0, parent=legSettingsAttrGrp) self.legBone1LenInputAttr = ScalarAttribute('bone1Len', value=1.0, parent=legSettingsAttrGrp) legIKBlendInputAttr = ScalarAttribute('ikblend', value=1.0, minValue=0.0, maxValue=1.0, parent=legSettingsAttrGrp) # Util Objects self.ikRootPosition = Transform("ikRootPosition", parent=self.ctrlCmpGrp) # Connect Input Attrs self.drawDebugInputAttr.connect(legDrawDebugInputAttr) # Connect Output Attrs self.drawDebugOutputAttr.connect(legDrawDebugInputAttr) self.ikBlendOutputAttr.connect(legIKBlendInputAttr) # UpV self.legUpVCtrlSpace = CtrlSpace('UpV', parent=self.ctrlCmpGrp) self.legUpVCtrl = Control('UpV', parent=self.legUpVCtrlSpace, shape="triangle") self.legUpVCtrl.alignOnZAxis() self.legUpVCtrl.lockRotation(True, True, True) self.legUpVCtrl.lockScale(True, True, True) # ========== # Deformers # ========== deformersLayer = self.getOrCreateLayer('deformers') self.defCmpGrp = ComponentGroup(self.getName(), self, parent=deformersLayer) self.addItem('defCmpGrp', self.defCmpGrp) femurDef = Joint('femur', parent=self.defCmpGrp) femurDef.setComponent(self) kneeDef = Joint('knee', parent=self.defCmpGrp) kneeDef.setComponent(self) shinDef = Joint('shin', parent=self.defCmpGrp) shinDef.setComponent(self) # ============== # Constrain I/O # ============== # Constraint inputs self.legIKCtrlSpaceInputConstraint = PoseConstraint('_'.join([ self.legIKCtrlSpace.getName(), 'To', self.globalSRTInputTgt.getName() ])) self.legIKCtrlSpaceInputConstraint.setMaintainOffset(True) self.legIKCtrlSpaceInputConstraint.addConstrainer( self.globalSRTInputTgt) self.legIKCtrlSpace.addConstraint(self.legIKCtrlSpaceInputConstraint) self.legUpVCtrlSpaceInputConstraint = PoseConstraint('_'.join([ self.legUpVCtrlSpace.getName(), 'To', self.globalSRTInputTgt.getName() ])) self.legUpVCtrlSpaceInputConstraint.setMaintainOffset(True) self.legUpVCtrlSpaceInputConstraint.addConstrainer( self.globalSRTInputTgt) self.legUpVCtrlSpace.addConstraint(self.legUpVCtrlSpaceInputConstraint) self.legRootInputConstraint = PoseConstraint('_'.join([ self.femurFKCtrlSpace.getName(), 'To', self.legPelvisInputTgt.getName() ])) self.legRootInputConstraint.setMaintainOffset(True) self.legRootInputConstraint.addConstrainer(self.legPelvisInputTgt) self.femurFKCtrlSpace.addConstraint(self.legRootInputConstraint) self.ikRootPosInputConstraint = PoseConstraint('_'.join([ self.ikRootPosition.getName(), 'To', self.legPelvisInputTgt.getName() ])) self.ikRootPosInputConstraint.setMaintainOffset(True) self.ikRootPosInputConstraint.addConstrainer(self.legPelvisInputTgt) self.ikRootPosition.addConstraint(self.ikRootPosInputConstraint) # Constraint outputs self.legEndFKOutputConstraint = PoseConstraint('_'.join([ self.legEndFKOutputTgt.getName(), 'To', self.shinFKCtrl.getName() ])) self.legEndFKOutputConstraint.setMaintainOffset(True) self.legEndFKOutputConstraint.addConstrainer(self.shinFKCtrl) self.legEndFKOutputTgt.addConstraint(self.legEndFKOutputConstraint) self.ikHandleOutputConstraint = PoseConstraint('_'.join( [self.ikHandleOutputTgt.getName(), 'To', self.legIKCtrl.getName()])) self.ikHandleOutputConstraint.setMaintainOffset(True) self.ikHandleOutputConstraint.addConstrainer(self.legIKCtrl) self.ikHandleOutputTgt.addConstraint(self.ikHandleOutputConstraint) # =============== # Add Splice Ops # =============== # Add Leg Splice Op self.legIKKLOp = KLOperator('ikSolver', 'TwoBoneIKSolver', 'Kraken') self.addOperator(self.legIKKLOp) # Add Att Inputs self.legIKKLOp.setInput('drawDebug', self.drawDebugInputAttr) self.legIKKLOp.setInput('rigScale', self.rigScaleInputAttr) self.legIKKLOp.setInput('bone0Len', self.legBone0LenInputAttr) self.legIKKLOp.setInput('bone1Len', self.legBone1LenInputAttr) self.legIKKLOp.setInput('ikblend', legIKBlendInputAttr) self.legIKKLOp.setInput('rightSide', self.legRightSideInputAttr) # Add Xfo Inputs self.legIKKLOp.setInput('root', self.ikRootPosition) self.legIKKLOp.setInput('bone0FK', self.femurFKCtrl) self.legIKKLOp.setInput('bone1FK', self.shinFKCtrl) self.legIKKLOp.setInput('ikHandle', self.legIKTargetInputTgt) self.legIKKLOp.setInput('upV', self.legUpVCtrl) # Add Xfo Outputs self.legIKKLOp.setOutput('bone0Out', self.femurOutputTgt) self.legIKKLOp.setOutput('bone1Out', self.shinOutputTgt) self.legIKKLOp.setOutput('bone2Out', self.legEndOutputTgt) self.legIKKLOp.setOutput('midJointOut', self.kneeOutputTgt) # Add Leg Deformer Splice Op self.outputsToDeformersKLOp = KLOperator('defConstraint', 'MultiPoseConstraintSolver', 'Kraken') self.addOperator(self.outputsToDeformersKLOp) # Add Att Inputs self.outputsToDeformersKLOp.setInput('drawDebug', self.drawDebugInputAttr) self.outputsToDeformersKLOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Inputs self.outputsToDeformersKLOp.setInput( 'constrainers', [self.femurOutputTgt, self.kneeOutputTgt, self.shinOutputTgt]) # Add Xfo Outputs self.outputsToDeformersKLOp.setOutput('constrainees', [femurDef, kneeDef, shinDef]) Profiler.getInstance().pop() # ============= # Data Methods # ============= def loadData(self, data=None): """Load a saved guide representation from persisted data. Arguments: data -- object, The JSON data object. Return: True if successful. """ super(LegComponentRig, self).loadData(data) createIKHandle = data.get('createIKHandle') femurXfo = data.get('femurXfo') kneeXfo = data.get('kneeXfo') handleXfo = data.get('handleXfo') upVXfo = data.get('upVXfo') femurLen = data.get('femurLen') shinLen = data.get('shinLen') self.femurFKCtrlSpace.xfo = femurXfo self.femurFKCtrl.xfo = femurXfo self.femurFKCtrl.scalePoints(Vec3(femurLen, 1.75, 1.75)) self.femurOutputTgt.xfo = femurXfo self.shinOutputTgt.xfo = kneeXfo self.shinFKCtrlSpace.xfo = kneeXfo self.shinFKCtrl.xfo = kneeXfo self.shinFKCtrl.scalePoints(Vec3(shinLen, 1.5, 1.5)) self.legEndFKOutputTgt.xfo.tr = handleXfo.tr self.legEndFKOutputTgt.xfo.ori = kneeXfo.ori self.ikHandleOutputTgt.xfo = handleXfo self.ikRootPosition.xfo = femurXfo self.legIKCtrlSpace.xfo = handleXfo self.legIKCtrl.xfo = handleXfo if self.getLocation() == 'R': self.legIKCtrl.rotatePoints(0, 90, 0) self.legIKCtrl.translatePoints(Vec3(-1.0, 0.0, 0.0)) else: self.legIKCtrl.rotatePoints(0, -90, 0) self.legIKCtrl.translatePoints(Vec3(1.0, 0.0, 0.0)) self.legUpVCtrlSpace.xfo.tr = upVXfo.tr self.legUpVCtrl.xfo.tr = upVXfo.tr self.legRightSideInputAttr.setValue(self.getLocation() is 'R') self.legBone0LenInputAttr.setMin(0.0) self.legBone0LenInputAttr.setMax(femurLen * 3.0) self.legBone0LenInputAttr.setValue(femurLen) self.legBone1LenInputAttr.setMin(0.0) self.legBone1LenInputAttr.setMax(shinLen * 3.0) self.legBone1LenInputAttr.setValue(shinLen) self.legPelvisInputTgt.xfo = femurXfo self.legIKTargetInputTgt.xfo = handleXfo # TODO: We need the Rig class to be modified to handle the ability to # query if the ports are connected during loadData. Currently just a # place holder until that happens. # If IK Target input is not connected, switch to legIKCtrl # ikTargetInput = self.getInputByName('ikTarget') # if not ikTargetInput.isConnected(): # self.legIKKLOp.setInput('ikHandle', self.legIKCtrl) # Eval Input Constraints self.ikRootPosInputConstraint.evaluate() self.legIKCtrlSpaceInputConstraint.evaluate() self.legUpVCtrlSpaceInputConstraint.evaluate() self.legRootInputConstraint.evaluate() # Eval Operators self.legIKKLOp.evaluate() self.outputsToDeformersKLOp.evaluate() # Eval Output Constraints self.legEndFKOutputConstraint.evaluate() self.ikHandleOutputConstraint.evaluate()
def __init__(self, name="fabriceTail", parent=None): Profiler.getInstance().push("Construct Tail Rig Component:" + name) super(FabriceTailRig, self).__init__(name, parent) # ========= # Controls # ========= # Tail Base # self.tailBaseCtrlSpace = CtrlSpace('tailBase', parent=self.ctrlCmpGrp) # self.tailBaseCtrl = Control('tailBase', parent=self.tailBaseCtrlSpace, shape="circle") # self.tailBaseCtrl.rotatePoints(90, 0, 0) # self.tailBaseCtrl.scalePoints(Vec3(2.0, 2.0, 2.0)) # self.tailBaseCtrl.setColor("greenBlue") # Tail Base Handle self.tailBaseHandleCtrlSpace = CtrlSpace('tailBaseHandle', parent=self.ctrlCmpGrp) self.tailBaseHandleCtrl = Control('tailBaseHandle', parent=self.tailBaseHandleCtrlSpace, shape="pin") self.tailBaseHandleCtrl.lockScale(x=True, y=True, z=True) self.tailBaseHandleCtrl.setColor("turqoise") # Tail End Handle self.tailEndHandleCtrlSpace = CtrlSpace('tailEndHandle', parent=self.ctrlCmpGrp) self.tailEndHandleCtrl = Control('tailEndHandle', parent=self.tailEndHandleCtrlSpace, shape="pin") self.tailEndHandleCtrl.lockScale(x=True, y=True, z=True) self.tailEndHandleCtrl.setColor("turqoise") # Tail End self.tailEndCtrlSpace = CtrlSpace('tailEnd', parent=self.tailEndHandleCtrl) self.tailEndCtrl = Control('tailEnd', parent=self.tailEndCtrlSpace, shape="pin") self.tailEndCtrl.lockScale(x=True, y=True, z=True) self.tailEndCtrl.setColor("greenBlue") # ========== # Deformers # ========== deformersLayer = self.getOrCreateLayer('deformers') self.defCmpGrp = ComponentGroup(self.getName(), self, parent=deformersLayer) self.deformerJoints = [] self.tailOutputs = [] self.setNumDeformers(1) # ===================== # Create Component I/O # ===================== # Setup component Xfo I/O's self.tailVertebraeOutput.setTarget(self.tailOutputs) # ============== # Constrain I/O # ============== # Constraint inputs self.tailBaseHandleInputConstraint = PoseConstraint('_'.join([self.tailBaseHandleCtrlSpace.getName(), 'To', self.spineEndCtrlInputTgt.getName()])) self.tailBaseHandleInputConstraint.addConstrainer(self.spineEndCtrlInputTgt) self.tailBaseHandleInputConstraint.setMaintainOffset(True) self.tailBaseHandleCtrlSpace.addConstraint(self.tailBaseHandleInputConstraint) self.tailEndHandleInputConstraint = PoseConstraint('_'.join([self.tailEndHandleCtrlSpace.getName(), 'To', self.cogInputTgt.getName()])) self.tailEndHandleInputConstraint.addConstrainer(self.cogInputTgt) self.tailEndHandleInputConstraint.setMaintainOffset(True) self.tailEndHandleCtrlSpace.addConstraint(self.tailEndHandleInputConstraint) # Constraint outputs self.tailBaseOutputConstraint = PoseConstraint('_'.join([self.tailBaseOutputTgt.getName(), 'To', 'spineBase'])) self.tailBaseOutputConstraint.addConstrainer(self.tailOutputs[0]) self.tailBaseOutputTgt.addConstraint(self.tailBaseOutputConstraint) self.tailEndOutputConstraint = PoseConstraint('_'.join([self.tailEndOutputTgt.getName(), 'To', 'spineEnd'])) self.tailEndOutputConstraint.addConstrainer(self.tailOutputs[0]) self.tailEndOutputTgt.addConstraint(self.tailEndOutputConstraint) # =============== # Add Splice Ops # =============== # Add Tail Splice Op self.bezierTailKLOp = KLOperator('tailKLOp', 'BezierSpineSolver', 'Kraken') self.addOperator(self.bezierTailKLOp) # Add Att Inputs self.bezierTailKLOp.setInput('drawDebug', self.drawDebugInputAttr) self.bezierTailKLOp.setInput('rigScale', self.rigScaleInputAttr) self.bezierTailKLOp.setInput('length', self.lengthInputAttr) # Add Xfo Inputs self.bezierTailKLOp.setInput('base', self.spineEndInputTgt) self.bezierTailKLOp.setInput('baseHandle', self.tailBaseHandleCtrl) self.bezierTailKLOp.setInput('tipHandle', self.tailEndHandleCtrl) self.bezierTailKLOp.setInput('tip', self.tailEndCtrl) # Add Xfo Outputs self.bezierTailKLOp.setOutput('outputs', self.tailOutputs) # Add Deformer Splice Op self.deformersToOutputsKLOp = KLOperator('tailDeformerKLOp', 'MultiPoseConstraintSolver', 'Kraken') self.addOperator(self.deformersToOutputsKLOp) # Add Att Inputs self.deformersToOutputsKLOp.setInput('drawDebug', self.drawDebugInputAttr) self.deformersToOutputsKLOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Outputs self.deformersToOutputsKLOp.setInput('constrainers', self.tailOutputs) # Add Xfo Outputs self.deformersToOutputsKLOp.setOutput('constrainees', self.deformerJoints) Profiler.getInstance().pop()
def __init__(self, name='leg', parent=None): Profiler.getInstance().push("Construct Leg Rig Component:" + name) super(LegComponentRig, self).__init__(name, parent) # ========= # Controls # ========= # Femur self.femurFKCtrlSpace = CtrlSpace('femurFK', parent=self.ctrlCmpGrp) self.femurFKCtrl = Control('femurFK', parent=self.femurFKCtrlSpace, shape="cube") self.femurFKCtrl.alignOnXAxis() self.femurFKCtrl.lockTranslation(True, True, True) self.femurFKCtrl.lockScale(True, True, True) # Shin self.shinFKCtrlSpace = CtrlSpace('shinFK', parent=self.femurFKCtrl) self.shinFKCtrl = Control('shinFK', parent=self.shinFKCtrlSpace, shape="cube") self.shinFKCtrl.alignOnXAxis() self.shinFKCtrl.lockTranslation(True, True, True) self.shinFKCtrl.lockScale(True, True, True) # IK Handle self.legIKCtrlSpace = CtrlSpace('IK', parent=self.ctrlCmpGrp) self.legIKCtrl = Control('IK', parent=self.legIKCtrlSpace, shape="pin") self.legIKCtrl.lockScale(True, True, True) # Add Component Params to IK control legSettingsAttrGrp = AttributeGroup("DisplayInfo_LegSettings", parent=self.legIKCtrl) legDrawDebugInputAttr = BoolAttribute('drawDebug', value=False, parent=legSettingsAttrGrp) self.legRightSideInputAttr = BoolAttribute('rightSide', value=False, parent=legSettingsAttrGrp) self.legBone0LenInputAttr = ScalarAttribute('bone0Len', value=1.0, parent=legSettingsAttrGrp) self.legBone1LenInputAttr = ScalarAttribute('bone1Len', value=1.0, parent=legSettingsAttrGrp) legIKBlendInputAttr = ScalarAttribute('ikblend', value=1.0, minValue=0.0, maxValue=1.0, parent=legSettingsAttrGrp) # Util Objects self.ikRootPosition = Transform("ikRootPosition", parent=self.ctrlCmpGrp) # Connect Input Attrs self.drawDebugInputAttr.connect(legDrawDebugInputAttr) # Connect Output Attrs self.drawDebugOutputAttr.connect(legDrawDebugInputAttr) self.ikBlendOutputAttr.connect(legIKBlendInputAttr) # UpV self.legUpVCtrlSpace = CtrlSpace('UpV', parent=self.ctrlCmpGrp) self.legUpVCtrl = Control('UpV', parent=self.legUpVCtrlSpace, shape="triangle") self.legUpVCtrl.alignOnZAxis() self.legUpVCtrl.lockRotation(True, True, True) self.legUpVCtrl.lockScale(True, True, True) # ========== # Deformers # ========== deformersLayer = self.getOrCreateLayer('deformers') self.defCmpGrp = ComponentGroup(self.getName(), self, parent=deformersLayer) self.addItem('defCmpGrp', self.defCmpGrp) femurDef = Joint('femur', parent=self.defCmpGrp) femurDef.setComponent(self) kneeDef = Joint('knee', parent=self.defCmpGrp) kneeDef.setComponent(self) shinDef = Joint('shin', parent=self.defCmpGrp) shinDef.setComponent(self) # ============== # Constrain I/O # ============== # Constraint inputs self.legIKCtrlSpaceInputConstraint = PoseConstraint('_'.join([ self.legIKCtrlSpace.getName(), 'To', self.globalSRTInputTgt.getName() ])) self.legIKCtrlSpaceInputConstraint.setMaintainOffset(True) self.legIKCtrlSpaceInputConstraint.addConstrainer( self.globalSRTInputTgt) self.legIKCtrlSpace.addConstraint(self.legIKCtrlSpaceInputConstraint) self.legUpVCtrlSpaceInputConstraint = PoseConstraint('_'.join([ self.legUpVCtrlSpace.getName(), 'To', self.globalSRTInputTgt.getName() ])) self.legUpVCtrlSpaceInputConstraint.setMaintainOffset(True) self.legUpVCtrlSpaceInputConstraint.addConstrainer( self.globalSRTInputTgt) self.legUpVCtrlSpace.addConstraint(self.legUpVCtrlSpaceInputConstraint) self.legRootInputConstraint = PoseConstraint('_'.join([ self.femurFKCtrlSpace.getName(), 'To', self.legPelvisInputTgt.getName() ])) self.legRootInputConstraint.setMaintainOffset(True) self.legRootInputConstraint.addConstrainer(self.legPelvisInputTgt) self.femurFKCtrlSpace.addConstraint(self.legRootInputConstraint) self.ikRootPosInputConstraint = PoseConstraint('_'.join([ self.ikRootPosition.getName(), 'To', self.legPelvisInputTgt.getName() ])) self.ikRootPosInputConstraint.setMaintainOffset(True) self.ikRootPosInputConstraint.addConstrainer(self.legPelvisInputTgt) self.ikRootPosition.addConstraint(self.ikRootPosInputConstraint) # Constraint outputs self.legEndFKOutputConstraint = PoseConstraint('_'.join([ self.legEndFKOutputTgt.getName(), 'To', self.shinFKCtrl.getName() ])) self.legEndFKOutputConstraint.setMaintainOffset(True) self.legEndFKOutputConstraint.addConstrainer(self.shinFKCtrl) self.legEndFKOutputTgt.addConstraint(self.legEndFKOutputConstraint) self.ikHandleOutputConstraint = PoseConstraint('_'.join( [self.ikHandleOutputTgt.getName(), 'To', self.legIKCtrl.getName()])) self.ikHandleOutputConstraint.setMaintainOffset(True) self.ikHandleOutputConstraint.addConstrainer(self.legIKCtrl) self.ikHandleOutputTgt.addConstraint(self.ikHandleOutputConstraint) # =============== # Add Splice Ops # =============== # Add Leg Splice Op self.legIKKLOp = KLOperator('ikSolver', 'TwoBoneIKSolver', 'Kraken') self.addOperator(self.legIKKLOp) # Add Att Inputs self.legIKKLOp.setInput('drawDebug', self.drawDebugInputAttr) self.legIKKLOp.setInput('rigScale', self.rigScaleInputAttr) self.legIKKLOp.setInput('bone0Len', self.legBone0LenInputAttr) self.legIKKLOp.setInput('bone1Len', self.legBone1LenInputAttr) self.legIKKLOp.setInput('ikblend', legIKBlendInputAttr) self.legIKKLOp.setInput('rightSide', self.legRightSideInputAttr) # Add Xfo Inputs self.legIKKLOp.setInput('root', self.ikRootPosition) self.legIKKLOp.setInput('bone0FK', self.femurFKCtrl) self.legIKKLOp.setInput('bone1FK', self.shinFKCtrl) self.legIKKLOp.setInput('ikHandle', self.legIKTargetInputTgt) self.legIKKLOp.setInput('upV', self.legUpVCtrl) # Add Xfo Outputs self.legIKKLOp.setOutput('bone0Out', self.femurOutputTgt) self.legIKKLOp.setOutput('bone1Out', self.shinOutputTgt) self.legIKKLOp.setOutput('bone2Out', self.legEndOutputTgt) self.legIKKLOp.setOutput('midJointOut', self.kneeOutputTgt) # Add Leg Deformer Splice Op self.outputsToDeformersKLOp = KLOperator('defConstraint', 'MultiPoseConstraintSolver', 'Kraken') self.addOperator(self.outputsToDeformersKLOp) # Add Att Inputs self.outputsToDeformersKLOp.setInput('drawDebug', self.drawDebugInputAttr) self.outputsToDeformersKLOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Inputs self.outputsToDeformersKLOp.setInput( 'constrainers', [self.femurOutputTgt, self.kneeOutputTgt, self.shinOutputTgt]) # Add Xfo Outputs self.outputsToDeformersKLOp.setOutput('constrainees', [femurDef, kneeDef, shinDef]) Profiler.getInstance().pop()