class FabriceHeadGuide(FabriceHead): """Fabrice Head Component Guide""" def __init__(self, name='head', parent=None): Profiler.getInstance().push("Construct Head Guide Component:" + name) super(FabriceHeadGuide, self).__init__(name, parent) # ========= # Controls # ========= guideSettingsAttrGrp = AttributeGroup("GuideSettings", parent=self) self.headCtrl = Control('head', parent=self.ctrlCmpGrp, shape="circle") self.headCtrl.rotatePoints(90.0, 0.0, 0.0) self.headCtrl.scalePoints(Vec3(3.5, 3.5, 3.5)) self.jawCtrl = Control('jaw', parent=self.ctrlCmpGrp, shape="cube") self.jawCtrl.alignOnZAxis() self.jawCtrl.scalePoints(Vec3(2.0, 0.5, 2.0)) self.jawCtrl.alignOnYAxis(negative=True) self.jawCtrl.setColor('orange') data = { "name": name, "location": "M", "headXfo": Xfo(Vec3(0.0, 1.67, 1.75)), "headCtrlCrvData": self.headCtrl.getCurveData(), "jawPosition": Vec3(0.0, 1.2787, 2.0078), "jawCtrlCrvData": self.jawCtrl.getCurveData(), } self.loadData(data) Profiler.getInstance().pop() # ============= # Data Methods # ============= def saveData(self): """Save the data for the component to be persisted. Return: The JSON data object """ data = super(FabriceHeadGuide, self).saveData() data['headXfo'] = self.headCtrl.xfo data['headCtrlCrvData'] = self.headCtrl.getCurveData() data['jawPosition'] = self.jawCtrl.xfo.tr data['jawCtrlCrvData'] = self.jawCtrl.getCurveData() return data def loadData(self, data): """Load a saved guide representation from persisted data. Arguments: data -- object, The JSON data object. Return: True if successful. """ super(FabriceHeadGuide, self).loadData(data) self.headCtrl.xfo = data['headXfo'] self.headCtrl.setCurveData(data['headCtrlCrvData']) self.jawCtrl.xfo.tr = data['jawPosition'] self.jawCtrl.setCurveData(data['jawCtrlCrvData']) return True def getRigBuildData(self): """Returns the Guide data used by the Rig Component to define the layout of the final rig.. Return: The JSON rig data object. """ data = super(FabriceHeadGuide, self).getRigBuildData() data['headXfo'] = self.headCtrl.xfo data['headCtrlCrvData'] = self.headCtrl.getCurveData() data['jawPosition'] = self.jawCtrl.xfo.tr data['jawCtrlCrvData'] = self.jawCtrl.getCurveData() return data # ============== # Class Methods # ============== @classmethod def getComponentType(cls): """Enables introspection of the class prior to construction to determine if it is a guide component. Return: The true if this component is a guide component. """ return 'Guide' @classmethod def getRigComponentClass(cls): """Returns the corresponding rig component class for this guide component class Return: The rig component class. """ return FabriceHeadRig
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 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") # 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)) # 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)) # Spine03 self.spine03CtrlSpace = CtrlSpace('spine03', parent=self.spine02Ctrl) self.spine03Ctrl = Control('spine03', parent=self.spine03CtrlSpace, shape="circle") self.spine03Ctrl.scalePoints(Vec3(4.5, 4.5, 4.5)) self.spine03Ctrl.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)) # Pelvis self.pelvisCtrlSpace = CtrlSpace('pelvis', parent=self.cogCtrl) self.pelvisCtrl = Control('pelvis', parent=self.pelvisCtrlSpace, shape="cube") self.pelvisCtrl.alignOnYAxis(negative=True) self.pelvisCtrl.scalePoints(Vec3(2.0, 1.5, 1.5)) # ========== # Deformers # ========== deformersLayer = self.getOrCreateLayer('deformers') self.defCmpGrp = ComponentGroup(self.getName(), self, parent=deformersLayer) 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.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) 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.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.spine01Ctrl) self.bezierSpineSpliceOp.setInput('baseHandle', self.spine02Ctrl) self.bezierSpineSpliceOp.setInput('tipHandle', self.spine03Ctrl) self.bezierSpineSpliceOp.setInput('tip', self.spine04Ctrl) # Add Xfo Outputs self.bezierSpineSpliceOp.setOutput('outputs', self.spineOutputs) # Add Deformer Splice Op self.deformersToOutputsSpliceOp = SpliceOperator( 'spineDeformerSpliceOp', 'MultiPoseConstraintSolver', 'Kraken') 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) # Add Pelvis Splice Op self.pelvisDefSpliceOp = SpliceOperator('pelvisDeformerSpliceOp', 'PoseConstraintSolver', 'Kraken') self.addOperator(self.pelvisDefSpliceOp) # Add Att Inputs self.pelvisDefSpliceOp.setInput('drawDebug', self.drawDebugInputAttr) self.pelvisDefSpliceOp.setInput('rigScale', self.rigScaleInputAttr) # Add Xfo Inputs self.pelvisDefSpliceOp.setInput('constrainer', self.pelvisOutputTgt) # Add Xfo Outputs self.pelvisDefSpliceOp.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.bezierSpineSpliceOp.evaluate() # evaluate the constraint op so that all the joint transforms are updated. self.deformersToOutputsSpliceOp.evaluate() self.pelvisDefSpliceOp.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()
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 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.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 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) self.headCtrlSpace.xfo.tr = data['headPosition'] self.headCtrl.xfo.tr = data['headPosition'] self.eyeLeftCtrlSpace.xfo.tr = data['eyeLeftPosition'] self.eyeLeftCtrl.xfo.tr = data['eyeLeftPosition'] self.eyeRightCtrlSpace.xfo.tr = data['eyeRightPosition'] self.eyeRightCtrl.xfo.tr = data['eyeRightPosition'] self.jawCtrlSpace.xfo.tr = data['jawPosition'] self.jawCtrl.xfo.tr = data['jawPosition'] # ============ # Set IO Xfos # ============ self.headBaseInputTgt.xfo.tr = data['headPosition'] self.headOutputTgt.xfo.tr = data['headPosition'] self.jawOutputTgt.xfo.tr = data['jawPosition'] self.eyeLOutputTgt.xfo.tr = data['eyeLeftPosition'] self.eyeROutputTgt.xfo.tr = data['eyeRightPosition']
class FabriceHeadGuide(FabriceHead): """Fabrice Head Component Guide""" def __init__(self, name='head', parent=None): Profiler.getInstance().push("Construct Head Guide Component:" + name) super(FabriceHeadGuide, self).__init__(name, parent) # ========= # Controls # ========= guideSettingsAttrGrp = AttributeGroup("GuideSettings", parent=self) self.headCtrl = Control('head', parent=self.ctrlCmpGrp, shape="circle") self.headCtrl.rotatePoints(90.0, 0.0, 0.0) self.headCtrl.scalePoints(Vec3(3.5, 3.5, 3.5)) self.jawCtrl = Control('jaw', parent=self.ctrlCmpGrp, shape="cube") self.jawCtrl.alignOnZAxis() self.jawCtrl.scalePoints(Vec3(2.0, 0.5, 2.0)) self.jawCtrl.alignOnYAxis(negative=True) self.jawCtrl.setColor('orange') data = { "name": name, "location": "M", "headXfo": Xfo(Vec3(0.0, 1.67, 1.75)), "headCtrlCrvData": self.headCtrl.getCurveData(), "jawPosition": Vec3(0.0, 1.2787, 2.0078), "jawCtrlCrvData": self.jawCtrl.getCurveData(), } self.loadData(data) Profiler.getInstance().pop() # ============= # Data Methods # ============= def saveData(self): """Save the data for the component to be persisted. Return: The JSON data object """ data = super(FabriceHeadGuide, self).saveData() data['headXfo'] = self.headCtrl.xfo data['headCtrlCrvData'] = self.headCtrl.getCurveData() data['jawPosition'] = self.jawCtrl.xfo.tr data['jawCtrlCrvData'] = self.jawCtrl.getCurveData() return data def loadData(self, data): """Load a saved guide representation from persisted data. Arguments: data -- object, The JSON data object. Return: True if successful. """ super(FabriceHeadGuide, self).loadData( data ) self.headCtrl.xfo = data['headXfo'] self.headCtrl.setCurveData(data['headCtrlCrvData']) self.jawCtrl.xfo.tr = data['jawPosition'] self.jawCtrl.setCurveData(data['jawCtrlCrvData']) return True def getRigBuildData(self): """Returns the Guide data used by the Rig Component to define the layout of the final rig.. Return: The JSON rig data object. """ data = super(FabriceHeadGuide, self).getRigBuildData() data['headXfo'] = self.headCtrl.xfo data['headCtrlCrvData'] = self.headCtrl.getCurveData() data['jawPosition'] = self.jawCtrl.xfo.tr data['jawCtrlCrvData'] = self.jawCtrl.getCurveData() return data # ============== # Class Methods # ============== @classmethod def getComponentType(cls): """Enables introspection of the class prior to construction to determine if it is a guide component. Return: The true if this component is a guide component. """ return 'Guide' @classmethod def getRigComponentClass(cls): """Returns the corresponding rig component class for this guide component class Return: The rig component class. """ return FabriceHeadRig
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()
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.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 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 ) self.headCtrlSpace.xfo.tr = data['headPosition'] self.headCtrl.xfo.tr = data['headPosition'] self.eyeLeftCtrlSpace.xfo.tr = data['eyeLeftPosition'] self.eyeLeftCtrl.xfo.tr = data['eyeLeftPosition'] self.eyeRightCtrlSpace.xfo.tr = data['eyeRightPosition'] self.eyeRightCtrl.xfo.tr = data['eyeRightPosition'] self.jawCtrlSpace.xfo.tr = data['jawPosition'] self.jawCtrl.xfo.tr = data['jawPosition'] # ============ # Set IO Xfos # ============ self.headBaseInputTgt.xfo.tr = data['headPosition'] self.headOutputTgt.xfo.tr = data['headPosition'] self.jawOutputTgt.xfo.tr = data['jawPosition'] self.eyeLOutputTgt.xfo.tr = data['eyeLeftPosition'] self.eyeROutputTgt.xfo.tr = data['eyeRightPosition']