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(FKChainComponentGuide, self).getRigBuildData() numJoints = self.numJoints.getValue() # Calculate Xfos fw = Vec3(0, 0, 1) boneXfos = [] boneLengths = [] for i in xrange(numJoints): boneVec = self.jointCtrls[i + 1].xfo.tr.subtract(self.jointCtrls[i].xfo.tr) boneLengths.append(boneVec.length()) bone1Normal = fw.cross(boneVec).unit() bone1ZAxis = boneVec.cross(bone1Normal).unit() xfo = Xfo() xfo.setFromVectors(boneVec.unit(), bone1Normal, bone1ZAxis, self.jointCtrls[i].xfo.tr) boneXfos.append(xfo) data['boneXfos'] = boneXfos data['endXfo'] = self.jointCtrls[-1].xfo data['boneLengths'] = boneLengths return data
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(NeckComponentGuide, self).getRigBuildData() # values neckEndPosition = self.neckCtrl.xfo.tr neckPosition = self.neckEndCtrl.xfo.tr neckUpV = Vec3(0.0, 0.0, -1.0) # Calculate Neck 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) data['neckXfo'] = neckXfo return data
def calculateUpVXfo(self, boneXfos, endXfo): """Calculates the transform for the UpV control. Args: boneXfos (list): Bone transforms. endXfo (Xfo): Transform for the end of the chain. Returns: Xfo: Up Vector transform. """ # Calculate FW toFirst = boneXfos[1].tr.subtract(boneXfos[0].tr).unit() toTip = endXfo.tr.subtract(boneXfos[0].tr).unit() fw = toTip.cross(toFirst).unit() chainNormal = fw.cross(toTip).unit() chainZAxis = toTip.cross(chainNormal).unit() chainXfo = Xfo() chainXfo.setFromVectors(toTip.unit(), chainNormal, chainZAxis, boneXfos[0].tr) rootToTip = endXfo.tr.subtract(boneXfos[0].tr).length() upVXfo = Xfo() upVXfo.tr = chainXfo.transformVector(Vec3(rootToTip / 2.0, rootToTip / 2.0, 0.0)) return upVXfo
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(ClavicleComponentGuide, self).getRigBuildData() # Values claviclePosition = self.clavicleCtrl.xfo.tr clavicleUpV = self.clavicleUpVCtrl.xfo.tr clavicleEndPosition = self.clavicleEndCtrl.xfo.tr # 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) clavicleLen = claviclePosition.subtract(clavicleEndPosition).length() data['clavicleXfo'] = clavicleXfo data['clavicleLen'] = clavicleLen return data
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(ArmComponentGuide, self).getRigBuildData() # values bicepPosition = self.bicepCtrl.xfo.tr forearmPosition = self.forearmCtrl.xfo.tr wristPosition = self.wristCtrl.xfo.tr # 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) handXfo = Xfo() handXfo.tr = self.handCtrl.xfo.tr handXfo.ori = self.handCtrl.xfo.ori bicepLen = bicepPosition.subtract(forearmPosition).length() forearmLen = forearmPosition.subtract(wristPosition).length() armEndXfo = Xfo() armEndXfo.tr = wristPosition armEndXfo.ori = forearmXfo.ori upVXfo = xfoFromDirAndUpV(bicepPosition, wristPosition, forearmPosition) upVXfo.tr = forearmPosition upVXfo.tr = upVXfo.transformVector(Vec3(0, 0, 5)) data["bicepXfo"] = bicepXfo data["forearmXfo"] = forearmXfo data["handXfo"] = handXfo data["armEndXfo"] = armEndXfo data["upVXfo"] = upVXfo data["forearmLen"] = forearmLen data["bicepLen"] = bicepLen return data
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(StretchyLimbComponentGuide, self).getRigBuildData() # Values startPos = self.upperCtl.xfo.tr midPos = self.lowerCtl.xfo.tr endPos = self.endCtl.xfo.tr # Calculate Upper Xfo startToEnd = endPos.subtract(startPos).unit() startToMid = midPos.subtract(startPos).unit() bone1Normal = startToEnd.cross(startToMid).unit() bone1ZAxis = startToMid.cross(bone1Normal).unit() upperXfo = Xfo() upperXfo.setFromVectors(startToMid, bone1Normal, bone1ZAxis, startPos) # Calculate Lower Xfo midToEnd = endPos.subtract(midPos).unit() midToStart = startPos.subtract(midPos).unit() bone2Normal = midToStart.cross(midToEnd).unit() bone2ZAxis = midToEnd.cross(bone2Normal).unit() lowerXfo = Xfo() lowerXfo.setFromVectors(midToEnd, bone2Normal, bone2ZAxis, midPos) upperLen = startPos.subtract(midPos).length() lowerLen = endPos.subtract(midPos).length() handleXfo = Xfo() handleXfo.tr = endPos endXfo = Xfo() endXfo.tr = endPos # endXfo.ori = lowerXfo.ori upVXfo = xfoFromDirAndUpV(startPos, endPos, midPos) upVXfo.tr = midPos upVXfo.tr = upVXfo.transformVector(Vec3(0, 0, 5)) data['upperXfo'] = upperXfo data['lowerXfo'] = lowerXfo data['endXfo'] = endXfo data['handleXfo'] = handleXfo data['upVXfo'] = upVXfo data['upperLen'] = upperLen data['lowerLen'] = lowerLen return data
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(TentacleComponentGuide, self).getRigBuildData() numJoints = self.numJoints.getValue() # Calculate FW toFirst = self.jointCtrls[0].xfo.tr.subtract( self.jointCtrls[1].xfo.tr).unit() toTip = self.jointCtrls[0].xfo.tr.subtract( self.jointCtrls[-1].xfo.tr).unit() fw = toTip.cross(toFirst).unit() # Calculate Xfos boneXfos = [] boneLengths = [] for i in xrange(numJoints): boneVec = self.jointCtrls[i + 1].xfo.tr.subtract( self.jointCtrls[i].xfo.tr) boneLengths.append(boneVec.length()) bone1Normal = fw.cross(boneVec).unit() bone1ZAxis = boneVec.cross(bone1Normal).unit() xfo = Xfo() xfo.setFromVectors(boneVec.unit(), bone1Normal, bone1ZAxis, self.jointCtrls[i].xfo.tr) boneXfos.append(xfo) data['boneXfos'] = boneXfos data['endXfo'] = self.jointCtrls[-1].xfo data['boneLengths'] = boneLengths return data
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(HandComponentGuide, self).getRigBuildData() data['handXfo'] = self.handCtrl.xfo fingerData = {} for finger in self.fingers.keys(): fingerData[finger] = [] for i, joint in enumerate(self.fingers[finger]): if i == len(self.fingers[finger]) - 1: continue # Calculate Xfo boneVec = self.fingers[finger][i + 1].xfo.tr - self.fingers[finger][i].xfo.tr bone1Normal = self.fingers[finger][i].xfo.ori.getZaxis().cross(boneVec).unit() bone1ZAxis = boneVec.cross(bone1Normal).unit() jointXfo = Xfo() jointXfo.setFromVectors(boneVec.unit(), bone1Normal, bone1ZAxis, self.fingers[finger][i].xfo.tr) jointData = { 'curveData': self.fingers[finger][i].shapeCtrl.getCurveData(), 'length': self.fingers[finger][i].xfo.tr.distanceTo(self.fingers[finger][i + 1].xfo.tr), 'xfo': jointXfo } fingerData[finger].append(jointData) data['fingerData'] = fingerData return data
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(InsectLegComponentGuide, self).getRigBuildData() numJoints = self.numJoints.getValue() # Calculate FW toFirst = self.jointCtrls[0].xfo.tr.subtract(self.jointCtrls[1].xfo.tr).unit() toTip = self.jointCtrls[0].xfo.tr.subtract(self.jointCtrls[-1].xfo.tr).unit() fw = toTip.cross(toFirst).unit() # Calculate Xfos boneXfos = [] boneLengths = [] for i in xrange(numJoints): boneVec = self.jointCtrls[i + 1].xfo.tr.subtract(self.jointCtrls[i].xfo.tr) boneLengths.append(boneVec.length()) bone1Normal = fw.cross(boneVec).unit() bone1ZAxis = boneVec.cross(bone1Normal).unit() xfo = Xfo() xfo.setFromVectors(boneVec.unit(), bone1Normal, bone1ZAxis, self.jointCtrls[i].xfo.tr) boneXfos.append(xfo) data["boneXfos"] = boneXfos data["endXfo"] = self.jointCtrls[-1].xfo data["boneLengths"] = boneLengths return data
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)
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(LegComponentGuide, self).getRigBuildData() # Values femurPosition = self.femurCtrl.xfo.tr kneePosition = self.kneeCtrl.xfo.tr anklePosition = self.ankleCtrl.xfo.tr toePosition = self.toeCtrl.xfo.tr toeTipPosition = self.toeTipCtrl.xfo.tr # Calculate Bicep Xfo rootToWrist = anklePosition.subtract(femurPosition).unit() rootToKnee = kneePosition.subtract(femurPosition).unit() bone1Normal = rootToWrist.cross(rootToKnee).unit() bone1ZAxis = rootToKnee.cross(bone1Normal).unit() femurXfo = Xfo() femurXfo.setFromVectors(rootToKnee, bone1Normal, bone1ZAxis, femurPosition) # Calculate Forearm Xfo elbowToWrist = anklePosition.subtract(kneePosition).unit() elbowToRoot = femurPosition.subtract(kneePosition).unit() bone2Normal = elbowToRoot.cross(elbowToWrist).unit() bone2ZAxis = elbowToWrist.cross(bone2Normal).unit() kneeXfo = Xfo() kneeXfo.setFromVectors(elbowToWrist, bone2Normal, bone2ZAxis, kneePosition) femurLen = femurPosition.subtract(kneePosition).length() shinLen = kneePosition.subtract(anklePosition).length() handleXfo = Xfo() handleXfo.tr = anklePosition ankleXfo = Xfo() ankleXfo.tr = anklePosition # ankleXfo.ori = kneeXfo.ori toeXfo = Xfo() toeXfo.tr = toePosition # toeXfo.ori = kneeXfo.ori upVXfo = xfoFromDirAndUpV(femurPosition, anklePosition, kneePosition) upVXfo.tr = kneePosition upVXfo.tr = upVXfo.transformVector(Vec3(0, 0, 5)) data['femurXfo'] = femurXfo data['kneeXfo'] = kneeXfo data['handleXfo'] = handleXfo data['ankleXfo'] = ankleXfo data['toeXfo'] = toeXfo data['upVXfo'] = upVXfo data['femurLen'] = femurLen data['shinLen'] = shinLen return data
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, 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)