コード例 #1
0
    def create_controller(self):
        self.controller = pm.curve(
            name=self.controller,
            d=3,
            periodic=2,
            k=(-2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14),
            point=((0, 0.4, 0.25), (0, 0.4, 0.4), (0, 0.25, 0.4),
                   (0, -0.25, 0.4), (0, -0.4, 0.4), (0, -0.4, 0.25),
                   (0, -0.4, -0.25), (0, -0.4, -0.4), (0, -0.25, -0.4),
                   (0, 0.25, -0.4), (0, 0.4, -0.4), (0, 0.4, -0.25),
                   (0, 0.4, 0.25), (0, 0.4, 0.4), (0, 0.25, 0.4)))
        for axis in ['X', 'Y', 'Z']:
            pm.setAttr('{}.rotate{}'.format(self.controller, axis),
                       keyable=False)
            pm.setAttr('{}.scale{}'.format(self.controller, axis),
                       keyable=False)
            pm.setAttr('{}.translate{}'.format(self.controller, axis),
                       keyable=False)

        self.controller.translateX.lock()
        self.controller.translateY.showInChannelBox(True)
        self.controller.translateZ.showInChannelBox(True)
        self.controller.rotate.lock()
        self.controller.scale.lock()
        self.controller.visibility.setKeyable(False)
        self.controller.visibility.lock()
        pm.transformLimits(self.controller, tx=(0, 0), ty=(0, 0), tz=(0, 0))
        pm.transformLimits(self.controller,
                           etx=(False, False),
                           ety=(True, True),
                           etz=(True, True))
コード例 #2
0
def build_upper_halfbox(type, label=[], connections=True):
    if not pm.objExists(type + "_Prnt"):
        mainDict = {}

        squareShape = [[-1.0, 1.0, 0.0],
                       [-1.0, 0.0043876273513161479, 0.0],
                       [1.0, 0.0043876273513161479, 0.0],
                       [1.0, 1.0, 0.0],
                       [-1.0, 1.0, 0.0]]

        box = pm.curve(d=1, p=squareShape, n=type + "_Prnt")
        boxShape = box.getShape()
        boxShape.overrideEnabled.set(1)
        boxShape.overrideDisplayType.set(1)
        ctrl = pm.circle(nr=[0, 0, 0], r=0.2, ch=0, n=type + "_Ctrl")[0]
        pm.parent(ctrl, box)
        pm.transformLimits(ctrl, tx=[-1, 1], etx=[1, 1], ety=[1, 1], ty=[0, 1])
        libUtilities.lockAttr(str(ctrl), ["tz", "rx", "ry", "rz", "sx", "sy", "sz", "v"])

        mainDict["border"] = box
        mainDict["ctrl"] = ctrl

        if connections:
            connect_dict = {}
            connect_dict["TopLeftCorner"] = build_left_top_corner(type, ctrl)
            connect_dict["TopRightCorner"] = build_right_top_corner(type, ctrl)
            mainDict["connections"] = connect_dict

        if label:
            mainDict["label"] = build_label(label, box)

        return mainDict
    else:
        raise Exception(type + " setup already exists")
コード例 #3
0
def build_y_halfbox(type, label=[]):
    if not pm.objExists(type + "_Prnt"):
        mainDict = {}

        squareShape = [[-0.112423266524, 1.0, 0.0],
                       [-0.112423266524, -1.0, 0.0],
                       [0.112423266524, -1.0, 0.0],
                       [0.112, 1.0, 0.0],
                       [-0.112423266524, 1.0, 0.0]]

        box = pm.curve(d=1, p=squareShape, n=type + "_Prnt")
        boxShape = box.getShape()
        boxShape.overrideEnabled.set(1)
        boxShape.overrideDisplayType.set(1)

        ctrl = pm.circle(nr=[0, 0, 0], r=0.2, ch=0, n=type + "_Ctrl")[0]
        pm.parent(ctrl, box)
        pm.transformLimits(ctrl, tx=[0, 0], etx=[1, 1], ety=[1, 1], ty=[-1, 1])
        libUtilities.lockAttr(str(ctrl), ["tz", "tx", "rx", "ry", "rz", "sx", "sy", "sz", "v"])

        mainDict["border"] = box
        mainDict["ctrl"] = ctrl

        if label:
            mainDict["label"] = build_label(label, box)

        return mainDict

    else:
        raise Exception(type + " setup already exists")
コード例 #4
0
    def addObjects(self):
        """Add all the objects needed to create the component."""
        t = self.guide.tra["root"]
        if self.settings["mirrorBehaviour"] and self.negate:
            scl = [1, 1, -1]
        else:
            scl = [1, 1, 1]
        t = transform.setMatrixScale(t, scl)

        # The border needs to fit the ctl range of motion
        size = self.settings["ctlSize"]

        minX = -1 if self.settings["tx_negative"] else 0
        maxX = 1 if self.settings["tx_positive"] else 0
        minY = -1 if self.settings["ty_negative"] else 0
        maxY = 1 if self.settings["ty_positive"] else 0

        margin = 0.1 * self.size

        border_offset = dt.Point(minX + maxX, minY + maxY) * 0.5

        self.border = self.addCtl(self.root,
                                  "border",
                                  t,
                                  self.color_ik,
                                  "square",
                                  w=size + (maxX - minX) + margin,
                                  d=size + (maxY - minY) + margin,
                                  tp=self.parentCtlTag,
                                  po=border_offset,
                                  ro=dt.Vector(math.radians(90), 0, 0))
        border_shape = self.border.getShape()
        border_shape.overrideDisplayType.set(2)  # Set display to reference

        self.ctl = self.addCtl(self.border,
                               "ctl",
                               t,
                               self.color_ik,
                               self.settings["icon"],
                               d=size,
                               h=size,
                               w=size,
                               tp=self.parentCtlTag,
                               ro=dt.Vector(math.radians(90), 0, 0))

        self.border.scale.set([self.size, self.size, self.size])

        params = [
            s for s in ["tx", "ty"]
            if self.settings[s + "_negative"] or self.settings[s + "_positive"]
        ]
        attribute.setKeyableAttributes(self.ctl, params)
        attribute.setKeyableAttributes(self.border, [])

        tx_limit = [minX, maxX]
        ty_limit = [minY, maxY]

        pm.transformLimits(self.ctl, tx=tx_limit, etx=[1, 1])
        pm.transformLimits(self.ctl, ty=ty_limit, ety=[1, 1])
コード例 #5
0
ファイル: core.py プロジェクト: ordinc/rigbits
def toggle_limits(axis, controls=None):
    """
    Toggles the controller translate Limits On or Off
    from their current values, both upper and lower.

    Aruments:
        axis (str): x,y,z axis to use.
        controls (list / optional): List of PyNodes to iterate over
                                    If None, use Selection


    """
    # If no controls are provided, use selection
    if not controls:
        controls = pm.ls(sl=True, type="transform")

    # Loop over controls and toggle the limits
    for control in controls:
        if axis == "x":
            current_status = pm.transformLimits(control, q=True, etx=True)
            current_status_inv = [not i for i in current_status]
            pm.transformLimits(control, etx=current_status_inv)

        elif axis == "y":
            current_status = pm.transformLimits(control, q=True, ety=True)
            current_status_inv = [not i for i in current_status]
            pm.transformLimits(control, ety=current_status_inv)

        elif axis == "z":
            current_status = pm.transformLimits(control, q=True, etz=True)
            current_status_inv = [not i for i in current_status]
            pm.transformLimits(control, etz=current_status_inv)
コード例 #6
0
def fourWayShapeControl(driver,
                        shapes,
                        parent,
                        mult=0.5,
                        ctrlSize=1,
                        facialLoc='facialShapeDriver_LOC',
                        **kwds):

    negPos = defaultReturn(-1, 'negPos', param=kwds)

    ctrlSizeHalf = [ctrlSize / 2.0, ctrlSize / 2.0, ctrlSize / 2.0]
    ctrlSizeQuarter = [ctrlSize / 4.0, ctrlSize / 4.0, ctrlSize / 4.0]
    ctrlSize = [ctrlSize, ctrlSize, ctrlSize]

    side = rig_nameGetSide(driver)
    base = rig_nameGetBase(driver)
    driverCtrl = rig_control(side=side,
                             name=base,
                             shape='pyramid',
                             modify=1,
                             lockHideAttrs=['rx', 'ry', 'rz', 'tx'],
                             scale=ctrlSizeQuarter)

    pm.scale(driverCtrl.ctrl.cv, 1, 0, 1)

    pm.delete(pm.parentConstraint(driver, driverCtrl.offset))
    #pm.parentConstraint(parent, driverCtrl.offset, mo=True)
    pm.parent(driverCtrl.offset, parent)

    rig_animDrivenKey(driverCtrl.ctrl.translateY, (0, 1),
                      facialLoc + '.' + shapes[0], (0, 1))
    rig_animDrivenKey(driverCtrl.ctrl.translateY, (0, -1),
                      facialLoc + '.' + shapes[1], (0, 1))
    rig_animDrivenKey(driverCtrl.ctrl.translateZ, (0, 1),
                      facialLoc + '.' + shapes[2], (0, 1))
    rig_animDrivenKey(driverCtrl.ctrl.translateZ, (0, -1),
                      facialLoc + '.' + shapes[3], (0, 1))

    multiplyDivideNode(
        side + base,
        'multiply',
        input1=[driverCtrl.ctrl.translateY, driverCtrl.ctrl.translateZ, 0],
        input2=[negPos * mult, negPos * mult, negPos * mult],
        output=[
            driverCtrl.modify + '.translateY',
            driverCtrl.modify + '.translateZ'
        ])

    pm.transformLimits(driverCtrl.ctrl, ty=(-1, 1), ety=(1, 1))
    pm.transformLimits(driverCtrl.ctrl, tz=(-1, 1), etz=(1, 1))

    return driverCtrl
コード例 #7
0
ファイル: camera_tools.py プロジェクト: sergeneren/anima
def create_camera_space_locator(frustum_curve):
    """Creates a locator under the given frame_curve

    :param frustum_curve:
    :return:
    """
    # create the locator
    locator = pm.spaceLocator()
    locator_shape = locator.getShape()
    pm.parent(locator, frustum_curve, r=True)
    locator.tz.set(lock=True, keyable=False)
    locator.rx.set(lock=True, keyable=False)
    locator.ry.set(lock=True, keyable=False)
    locator.rz.set(lock=True, keyable=False)
    pm.transformLimits(locator, tx=(-0.5, 0.5), etx=(True, True))
    pm.transformLimits(locator, ty=(-0.5, 0.5), ety=(True, True))
    locator_shape.localScaleZ.set(0)
    return locator
コード例 #8
0
def create_camera_space_locator(frustum_curve):
    """Creates a locator under the given frame_curve

    :param frustum_curve:
    :return:
    """
    # create the locator
    locator = pm.spaceLocator()
    locator_shape = locator.getShape()
    pm.parent(locator, frustum_curve, r=True)
    locator.tz.set(lock=True, keyable=False)
    locator.rx.set(lock=True, keyable=False)
    locator.ry.set(lock=True, keyable=False)
    locator.rz.set(lock=True, keyable=False)
    pm.transformLimits(locator, tx=(-0.5, 0.5), etx=(True, True))
    pm.transformLimits(locator, ty=(-0.5, 0.5), ety=(True, True))
    locator_shape.localScaleZ.set(0)
    return locator
コード例 #9
0
    def snapToGround(self, *args):

        groundPlaneObject = pm.textFieldButtonGrp(
            self.widgets['groundplaneTextField'], q=True, tx=True)
        list = pm.ls(sl=True, tr=True)

        for x in list:

            locator = pm.spaceLocator()
            group = pm.group(locator)
            pm.delete(pm.parentConstraint(x, group, mo=False))
            Xparent = x.getParent()
            pm.parent(x, locator)
            pm.transformLimits(locator, tx=[0, 0], etx=[1, 1])
            pm.transformLimits(locator, tz=[0, 0], etz=[1, 1])
            pm.delete(pm.geometryConstraint(groundPlaneObject, locator, w=1))
            pm.parent(x, Xparent)
            pm.delete(group)
コード例 #10
0
def createEasySmooth():
    sel = pm.selected()
    objs = sel[0:]
    cruveGen = generateCurve(sel[-1])
    slider = cruveGen[0]
    sliderField = cruveGen[1]
    smoothCtls = [cruveGen[2]]
    ctl = sliderField
    for currentSel in (sel[:-1]):
        smoothCtls.append(generateChildCurve(currentSel))
    pm.group(smoothCtls, n=smoothCtls[0] + '_Group')
    # ctl = sel[-1] #[-1]で要素の末尾を取得
    #新しいアトリビュートを作成する
    pm.addAttr(ctl, ln='divisions', nn='div', at='long', min=0, max=4, dv=0)
    #作成したアトリビュートの編集を有効可する
    ctlDiv = pm.Attribute(ctl + '.divisions')
    pm.setAttr(
        ctlDiv,
        e=True,
        keyable=True,
    )
    for obj in objs:
        smthChk = False
        for cnct in set(obj.getShape().inputs()):
            if isinstance(
                    cnct, pm.nt.PolySmoothFace
            ):  #セットでinputsノードの重複を無くし、cnctの方がpolysmoothfaceだった場合(すでにスムースノードがある場合)はsmthckをtrueにする
                smthChk = True
                break
        if smthChk:
            ctlDiv >> cnct.divisions  #すでにスムースノードがある場合は、それをctlDivアトリビュートと接続
        else:
            smthNode = pm.polySmooth(obj)  #objに新しくスムースを追加し
            ctlDiv >> smthNode[
                0].divisions  #スムースノードのdivisionsアトリビュートとctlのdivisionアトリビュート(ctlDiv)をつなぐ

    pm.transformLimits(slider, tx=(0, 1.23), etx=(True, True))
    pm.setDrivenKeyframe("%s.divisions" % ctl, cd="%s.tx" % slider, dv=0, v=0)
    pm.setDrivenKeyframe("%s.divisions" % ctl,
                         cd="%s.tx" % slider,
                         dv=1.23,
                         v=4)
コード例 #11
0
def build_face_x_control(type, connections=True):
    if not pm.objExists(type + "_Prnt"):
        mainDict = {}
        prnt = pm.createNode("transform", n=type + "_Prnt")
        ctrl = pm.curve(d=1, p=sphereShape, n=type + "_Ctrl")
        pm.parent(ctrl, prnt)
        pm.transformLimits(ctrl, tx=[-1, 1], etx=[1, 1])
        libUtilities.lockAttr(str(ctrl), ["ty", "tz", "rx", "ry", "rz", "sx", "sy", "sz", "v"])

        mainDict["prnt"] = prnt
        mainDict["ctrl"] = ctrl

        if connections:
            connect_dict = {}
            connect_dict["RightCorner"] = build_right_corner(type, ctrl)
            connect_dict["LeftCorner"] = build_left_corner(type, ctrl)
            mainDict["connections"] = connect_dict
        return mainDict
    else:
        raise Exception(type + " setup already exists")
コード例 #12
0
ファイル: cockle.py プロジェクト: duncanrudd/drTools
    def buildCockle(self):
        self.main_grp = pmc.group(empty=1, name='%s_GRP' % self.name)
        if not self.settingsNode:
            self.settingsNode = self.main_grp

        self.lf_grp = coreUtils.addChild(self.main_grp,
                                         'group',
                                         name='%s_lf_ZERO' % self.name)
        coreUtils.align(self.lf_grp, self.lf_GD)
        self.lf_drv = coreUtils.addChild(self.lf_grp,
                                         'group',
                                         name='%s_lf_DRV' % self.name)
        pmc.transformLimits(self.lf_drv, rz=(0, 0), erz=(0, 1))

        self.rt_grp = coreUtils.addChild(self.lf_drv,
                                         'group',
                                         name='%s_rt_ZERO' % self.name)
        coreUtils.align(self.rt_grp, self.rt_GD)
        self.rt_drv = coreUtils.addChild(self.rt_grp,
                                         'group',
                                         name='%s_rt_DRV' % self.name)
        pmc.transformLimits(self.rt_drv, rz=(0, 0), erz=(1, 0))

        self.fnt_grp = coreUtils.addChild(self.rt_drv,
                                          'group',
                                          name='%s_fnt_ZERO' % self.name)
        coreUtils.align(self.fnt_grp, self.fnt_GD)
        self.fnt_drv = coreUtils.addChild(self.fnt_grp,
                                          'group',
                                          name='%s_fnt_DRV' % self.name)
        pmc.transformLimits(self.fnt_drv, rx=(0, 0), erx=(1, 0))

        self.bck_grp = coreUtils.addChild(self.fnt_drv,
                                          'group',
                                          name='%s_bck_ZERO' % self.name)
        coreUtils.align(self.bck_grp, self.bck_GD)
        self.bck_drv = coreUtils.addChild(self.bck_grp,
                                          'group',
                                          name='%s_bck_DRV' % self.name)
        pmc.transformLimits(self.bck_drv, rx=(0, 0), erx=(0, 1))

        pmc.addAttr(self.settingsNode, ln='side_tilt', at='double', k=1, h=0)
        pmc.addAttr(self.settingsNode, ln='front_tilt', at='double', k=1, h=0)

        self.settingsNode.side_tilt.connect(self.lf_drv.rz)
        self.settingsNode.side_tilt.connect(self.rt_drv.rz)
        self.settingsNode.front_tilt.connect(self.fnt_drv.rx)
        self.settingsNode.front_tilt.connect(self.bck_drv.rx)

        pmc.delete([self.lf_GD, self.rt_GD, self.fnt_GD, self.bck_GD])
コード例 #13
0
ファイル: camera_tools.py プロジェクト: sergeneren/anima
def camera_film_offset_tool():
    """Adds a locator to the selected camera with which you can adjust the 2d
    pan and zoom.

    Usage :
    -------
    - To add it, select the camera and use camera_film_offset_tool
    - To remove it, set the transformations to 0 0 1 and then simply delete
    the curve
    - You can also use the ``enable`` option to temporarily disable the effect
    """
    camera_shape = get_selected_camera()
    if not camera_shape:
        raise RuntimeError("please select one camera!")

    # get the camera transform node
    camera_transform = camera_shape.getParent()

    frustum_curve = create_frustum_curve(camera_transform)
    handle = create_camera_space_locator(frustum_curve)

    # connect the locator tx and ty to film offset x and y
    handle.tx >> camera_shape.pan.horizontalPan
    handle.ty >> camera_shape.pan.verticalPan

    handle.sy.set(lock=False)
    handle.sz.set(lock=False)
    handle.sx >> handle.sy
    handle.sx >> handle.sz
    handle.sy.set(lock=True, keyable=False)
    handle.sz.set(lock=True, keyable=False)

    handle.sx >> camera_shape.zoom

    pm.transformLimits(handle, sx=(0.01, 2.0), esx=(True, True))

    handle.addAttr('enable', at='bool', dv=True, k=True)
    handle.enable >> camera_shape.panZoomEnabled
コード例 #14
0
def camera_film_offset_tool():
    """Adds a locator to the selected camera with which you can adjust the 2d
    pan and zoom.

    Usage :
    -------
    - To add it, select the camera and use camera_film_offset_tool
    - To remove it, set the transformations to 0 0 1 and then simply delete
    the curve
    - You can also use the ``enable`` option to temporarily disable the effect
    """
    camera_shape = get_selected_camera()
    if not camera_shape:
        raise RuntimeError("please select one camera!")

    # get the camera transform node
    camera_transform = camera_shape.getParent()

    frustum_curve = create_frustum_curve(camera_transform)
    handle = create_camera_space_locator(frustum_curve)

    # connect the locator tx and ty to film offset x and y
    handle.tx >> camera_shape.pan.horizontalPan
    handle.ty >> camera_shape.pan.verticalPan

    handle.sy.set(lock=False)
    handle.sz.set(lock=False)
    handle.sx >> handle.sy
    handle.sx >> handle.sz
    handle.sy.set(lock=True, keyable=False)
    handle.sz.set(lock=True, keyable=False)

    handle.sx >> camera_shape.zoom

    pm.transformLimits(handle, sx=(0.01, 2.0), esx=(True, True))

    handle.addAttr('enable', at='bool', dv=True, k=True)
    handle.enable >> camera_shape.panZoomEnabled
コード例 #15
0
def armSidesSimpleControls(module, side, colour):
    shieldRotYControl = simpleControls(
        side + '_shoulderShieldRotYJA_JNT',
        colour=colour,
        modify=1,
        scale=(4, 4, 4),
        parentOffset=module.controls,
        lockHideAttrs=['tx', 'ty', 'tz', 'rx', 'rz'])
    shieldRotXControl = simpleControls(
        side + '_shoulderShieldRotXJA_JNT',
        colour=colour,
        modify=1,
        scale=(4, 4, 4),
        parentOffset=module.controls,
        lockHideAttrs=['tx', 'ty', 'tz', 'ry', 'rz'])

    shieldRotY = shieldRotYControl[side + '_shoulderShieldRotYJA_JNT']
    shieldRotX = shieldRotXControl[side + '_shoulderShieldRotXJA_JNT']
    pm.delete(pm.listRelatives(shieldRotX.offset, type="constraint"))
    pm.parentConstraint(shieldRotY.con, shieldRotX.offset, mo=True)

    if side == 'r':
        simpleControls('r_gunBarrelJA_JNT',
                       colour=colour,
                       scale=(4, 4, 4),
                       parentOffset=module.controls,
                       lockHideAttrs=['tx', 'ty', 'tz', 'rx', 'rz'])
        blade = simpleControls('r_bladeJA_JNT',
                               colour=colour,
                               scale=(5, 2, 13),
                               parentOffset=module.controls,
                               lockHideAttrs=['tx', 'ty', 'rx', 'ry', 'rz'])

        bladeCtrl = blade['r_bladeJA_JNT']
        pm.move(0, 0, 10, bladeCtrl.ctrl.cv, os=True, r=True)
        pm.transformLimits(bladeCtrl.ctrl, tz=(-20, 0), etz=(1, 1))
コード例 #16
0
ファイル: before_buildFace.py プロジェクト: z1m0n6/SaG_tools
    def placement(self):
        grp2 = pm.ls("*offSet*")
        fols = pm.ls("*_fol")
        for num, fol in enumerate(fols):
            pos = pm.xform(fol, q=1, ws=1, t=True)
            oldName = fol.split("_")
            newName = oldName[0] + "_" + oldName[1] + "_"
            ctl = self.fControl(newName, num)
            pm.xform(grp2, ws=1, t=pos)
            loc = pm.spaceLocator(n="loc_{}".format(num))
            pm.setAttr(loc + ".visibility", 0)
            pm.xform(loc, ws=1, t=pos)
            pm.pointConstraint(fol, loc)
            pm.orientConstraint(fol, loc)

        ctls = pm.ls("*fCTL", type="transform")
        for x in ctls:
            pm.transformLimits(x, tx=(-1, 1), etx=(1, 0))
            pm.transformLimits(x, tx=(-1, 1), etx=(1, 1))
            pm.transformLimits(x, ty=(-1, 1), ety=(1, 0))
            pm.transformLimits(x, ty=(-1, 1), ety=(1, 1))
            #if:
            #pm.transformLimits(x, ty=(-1,1), ety=(1,0))
            #pm.transformLimits(x, ty=(-1,1), ety=(1,1))

        grp3 = pm.ls("*woldSpace*", type="transform")
        locs = pm.ls("loc_?", "loc_??", type="transform")
        for x, y in sorted(zip(grp3, locs)):
            pm.parent(y, x)
        grp2 = pm.ls("*offSet*")
        for x, y in sorted(zip(grp2, locs)):
            pm.connectAttr(y + ".translate", x + ".translate", force=True)
            pm.connectAttr(y + ".rotate", x + ".rotate", force=True)
        #for x in grp2:
        #pm.delete(pm.normalConstraint("C_body_PLY", x,  weight=1, aimVector=[0,0,1], upVector=[0,1,0], worldUpType="vector", worldUpVector=[0,1,0]))

        #grp =
        #for x in grp:
        #pm.orientConstraint("C_body_PLY", x, mo=True)
        pm.group(grp3, name="bsMan_faceRig_low_control_GRP")
コード例 #17
0
ファイル: hoof.py プロジェクト: duncanrudd/drTools
    def buildHoof(self, ankle, toe, inner, outer, heel, settingsNode, colour,
                  cleanup, blendAttr):
        if not ankle:
            return 'DrReverseFoot: Please supply or select joints for Ankle, Toe, Inner, Outer and Heel positions.'

        self.innerLoc = coreUtils.createAlignedNode(inner, 'group',
                                                    '%s_inner_GRP' % self.name)
        self.innerLoc.setParent(self.rig_grp)
        innerZero = coreUtils.addParent(self.innerLoc, 'group',
                                        '%s_inner_ZERO' % self.name)

        self.outerLoc = coreUtils.createAlignedNode(outer, 'group',
                                                    '%s_outer_GRP' % self.name)
        self.outerLoc.setParent(self.innerLoc)
        outerZero = coreUtils.addParent(self.outerLoc, 'group',
                                        '%s_outer_ZERO' % self.name)

        self.toeLoc = coreUtils.createAlignedNode(toe, 'group',
                                                  '%s_toe_GRP' % self.name)
        self.toeLoc.setParent(self.outerLoc)
        toeZero = coreUtils.addParent(self.toeLoc, 'group',
                                      '%s_toe_ZERO' % self.name)

        self.heelLoc = coreUtils.createAlignedNode(heel, 'group',
                                                   '%s_heel_GRP' % self.name)
        self.heelLoc.setParent(self.toeLoc)
        heelZero = coreUtils.addParent(self.heelLoc, 'group',
                                       '%s_heel_ZERO' % self.name)

        self.ankleLoc = coreUtils.createAlignedNode(ankle, 'group',
                                                    '%s_ankle_GRP' % self.name)
        self.ankleLoc.setParent(self.heelLoc)
        ankleZero = coreUtils.addParent(self.ankleLoc, 'group',
                                        '%s_ankle_ZERO' % self.name)

        self.ikConstGrp = coreUtils.createAlignedNode(
            ankle, 'group', '%s_ik_CONST' % self.name)
        self.ikConstGrp.setParent(self.rig_grp)
        innerZero.setParent(self.ikConstGrp)

        self.fkConstGrp = coreUtils.createAlignedNode(
            ankle, 'group', '%s_fk_CONST' % self.name)
        self.fkConstGrp.setParent(self.rig_grp)

        self.constGrp = coreUtils.createAlignedNode(ankle, 'group',
                                                    '%s_CONST' % self.name)
        self.constGrp.setParent(self.rig_grp)
        j = coreUtils.addChild(self.constGrp, 'joint', '%s_JNT' % self.name)
        self.joints.append(j)

        if not blendAttr:
            blendAttr = pmc.addAttr(self.main_grp,
                                    ln='ik_fk_blend',
                                    at='double',
                                    k=1,
                                    h=0)

        if not settingsNode:
            settingsNode = self.main_grp
        pmc.addAttr(settingsNode, longName='heel_toe', at='double', k=1, h=0)
        pmc.addAttr(settingsNode, longName='side_side', at='double', k=1, h=0)
        settingsNode.heel_toe.connect(self.heelLoc.rx)
        settingsNode.heel_toe.connect(self.toeLoc.rx)
        settingsNode.side_side.connect(self.innerLoc.rz)
        settingsNode.side_side.connect(self.outerLoc.rz)

        pmc.transformLimits(self.heelLoc, rx=(-45, 0), erx=(0, 1))
        pmc.transformLimits(self.toeLoc, rx=(0, 45), erx=(1, 0))
        pmc.transformLimits(self.innerLoc, rz=(-45, 0), erz=(0, 1))
        pmc.transformLimits(self.outerLoc, rz=(0, 45), erz=(1, 0))

        con = pmc.parentConstraint(self.ankleLoc,
                                   self.fkConstGrp,
                                   self.constGrp,
                                   mo=0)
        pmc.connectAttr(blendAttr, '%s.%sW1' % (con.name(), self.fkConstGrp))
        rev = coreUtils.reverse(blendAttr,
                                name='rev_%sIkFkBlend_UTL' % self.name)
        rev.outputX.connect('%s.%sW0' % (con.name(), self.ankleLoc))

        # connections
        self.exposeSockets({'ankle': self.ankleLoc})

        if cleanup:
            self.cleanup()
コード例 #18
0
    def run(self):
        shouldCreateOffset = False
        if self.createFollowerOffset == 0:
            # Always
            shouldCreateOffset = True
        elif self.createFollowerOffset == 1 and self.follower.nodeType(
        ) != 'joint':
            # Exclude Joints and the follower is not a joint
            shouldCreateOffset = True

        _follower = self.follower
        _toeFollower = self.toeFollower
        if shouldCreateOffset:
            _follower = pulse.nodes.createOffsetTransform(self.follower)
            _toeFollower = pulse.nodes.createOffsetTransform(self.toeFollower)

        # TODO(bsayre): expose as option
        self.useCustomAttrs = False

        if self.useCustomAttrs:
            # create 'lift' and 'ballToe' blend attrs
            self.control.addAttr("ballToe",
                                 min=0,
                                 max=1,
                                 at='double',
                                 defaultValue=0,
                                 keyable=1)
            ballToeAttr = self.control.attr('ballToe')
            self.control.addAttr("lift",
                                 min=0,
                                 max=1,
                                 at='double',
                                 defaultValue=0,
                                 keyable=1)
            liftAttr = self.control.attr('lift')

            lockedAttrs = ['tx', 'ty', 'tz', 'sx', 'sy', 'sz']
        else:
            # use tx and tz to control ball toe and lift blend
            ballToeAttr = self.control.tx
            liftAttr = self.control.tz
            # configure magic control
            # limit translate attrs and use them to drive blends
            pm.transformLimits(self.control,
                               tx=(0, 1),
                               tz=(0, 1),
                               etz=(True, True),
                               etx=(True, True))
            lockedAttrs = ['ty', 'sx', 'sy', 'sz']

        # lockup attributes on the magic control
        for attrName in lockedAttrs:
            attr = self.control.attr(attrName)
            attr.setKeyable(False)
            attr.showInChannelBox(False)
            attr.setLocked(True)

        # transform that will contain the final results of planted targets
        if self.plantedTarget:
            planted_tgt = self.plantedTarget
        else:
            planted_tgt = pm.group(em=True,
                                   p=self.control,
                                   n='{0}_mf_anklePlanted_tgt'.format(
                                       self.follower.nodeName()))
        # use liftControl directly as target
        lifted_tgt = self.liftControl

        # toe tgt is only used for the toe follower, not the main ankle follower
        # (keeps toe control fully locked when using ball pivot)
        toeDown_tgt = pm.group(em=True,
                               p=self.toePivot,
                               n='{0}_mf_toeDown_tgt'.format(
                                   self.toeFollower.nodeName()))
        toeUp_tgt = pm.group(em=True,
                             p=_toeFollower.getParent(),
                             n='{0}_mf_toeUp_tgt'.format(
                                 self.toeFollower.nodeName()))
        # ball pivot will contain result of both toe and ball pivot
        ballToe_tgt = pm.group(em=True,
                               p=self.ballPivot,
                               n='{0}_mf_ballToe_tgt'.format(
                                   self.follower.nodeName()))
        heel_tgt = pm.group(em=True,
                            p=self.heelPivot,
                            n='{0}_mf_heel_tgt'.format(
                                self.follower.nodeName()))

        followerMtx = pulse.nodes.getWorldMatrix(self.follower)
        toeFollowerMtx = pulse.nodes.getWorldMatrix(self.toeFollower)

        # update pivots to match world rotation of control and create
        # offset so that direct connect rotations will match up
        for node in (self.toePivot, self.ballPivot, self.heelPivot):
            followerMtx.translate = (0, 0, 0)
            followerMtx.scale = (1, 1, 1)
            pulse.nodes.setWorldMatrix(node, followerMtx)
            pulse.nodes.createOffsetTransform(node)
            if node == self.toePivot:
                # after orienting toe pivot, re-parent ballPivot
                self.ballPivot.setParent(self.toePivot)

        # update toe target transforms to match toe follower transform
        for node in (toeDown_tgt, toeUp_tgt):
            pulse.nodes.setWorldMatrix(node, toeFollowerMtx)

        # update target transforms to match follower transform
        # (basically preserves offsets on the follower)
        for node in (ballToe_tgt, heel_tgt):  # , ankle_tgt):
            pulse.nodes.setWorldMatrix(node, followerMtx)

        # connect direct rotations to heel pivot done after creating targets so that
        # the targets WILL move to reflect magic control non-zero rotations (if any)
        self.control.r >> self.heelPivot.r

        # connect blended rotation to toe / ball pivots
        # use ballToe attr to drive the blend (0 == ball, 1 == toe)
        toeRotBlendAttr = pulse.utilnodes.blend2(self.control.r, (0, 0, 0),
                                                 ballToeAttr)
        ballRotBlendAttr = pulse.utilnodes.blend2((0, 0, 0), self.control.r,
                                                  ballToeAttr)
        toeRotBlendAttr >> self.toePivot.r
        ballRotBlendAttr >> self.ballPivot.r

        # hide and lock the now-connected pivots
        for node in (self.toePivot, self.ballPivot, self.heelPivot):
            node.t.lock()
            node.r.lock()
            node.s.lock()
            node.v.set(False)

        # create condition to switch between ball/toe and heel pivots
        # TODO(bsayre): use dot-product towards up to determine toe vs heel
        isToeRollAttr = pulse.utilnodes.condition(self.control.ry, 0, [1], [0],
                                                  2)
        plantedMtxAttr = pulse.utilnodes.choice(isToeRollAttr, heel_tgt.wm,
                                                ballToe_tgt.wm)

        # connect final planted ankle matrix to ankle target transform
        pulse.nodes.connectMatrix(plantedMtxAttr, planted_tgt,
                                  pulse.nodes.ConnectMatrixMethod.SNAP)
        planted_tgt.t.lock()
        planted_tgt.r.lock()
        planted_tgt.s.lock()
        planted_tgt.v.setKeyable(False)
        # create matrix blend between planted and lifted targets
        # use lift attr to drive the blend (0 == planted, 1 == lifted)
        plantedLiftedBlendAttr = self.createMatrixBlend(
            planted_tgt.wm, lifted_tgt.wm, liftAttr,
            '{0}_mf_plantedLiftedBlend'.format(self.follower.nodeName()))

        # connect final matrix to follower
        # TODO(bsayre): this connect eliminates all transform inheritance, is
        #   world space control what we want? or do we need to inject offsets and
        #   allow parent transforms to come through
        pulse.nodes.connectMatrix(plantedLiftedBlendAttr, _follower,
                                  pulse.nodes.ConnectMatrixMethod.SNAP)

        # create toe up/down matrix blend, (0 == toe-up, 1 == toe-down/ball pivot)
        # in order to do this, reverse ballToe attr, then multiply by isToeRoll
        # to ensure toe-down is not active when not using toe pivots
        # reverse ballToeAttr, so that 1 == toe-down/ball
        ballToeReverseAttr = pulse.utilnodes.reverse(ballToeAttr)
        # multiply by isToe to ensure ball not active while using heel pivot
        isToeAndBallAttr = pulse.utilnodes.multiply(ballToeReverseAttr,
                                                    isToeRollAttr)
        # multiply by 1-liftAttr to ensure ball not active while lifting
        liftReverseAttr = pulse.utilnodes.reverse(liftAttr)
        toeUpDownBlendAttr = pulse.utilnodes.multiply(isToeAndBallAttr,
                                                      liftReverseAttr)
        ballToeMtxBlendAttr = self.createMatrixBlend(
            toeUp_tgt.wm, toeDown_tgt.wm, toeUpDownBlendAttr,
            '{0}_mf_toeUpDownBlend'.format(self.toeFollower.nodeName()))

        # connect final toe rotations to toeFollower
        # TODO(bsayre): parent both tgts to ankle somehow to prevent locking
        pulse.nodes.connectMatrix(ballToeMtxBlendAttr, _toeFollower,
                                  pulse.nodes.ConnectMatrixMethod.SNAP)

        # add meta data to controls
        ctlData = {
            'plantedTarget': planted_tgt,
            'liftControl': self.liftControl,
        }
        meta.setMetaData(self.control, MAGIC_FEET_CTL_METACLASSNAME, ctlData,
                         False)

        liftCtlData = {'control': self.control}
        meta.setMetaData(self.liftControl, MAGIC_FEET_LIFT_CTL_METACLASSNAME,
                         liftCtlData, False)
コード例 #19
0
ファイル: reverseFoot.py プロジェクト: duncanrudd/drTools
    def buildFoot(self, ankle, foot, ball, toe, inner, outer, heel,
                  settingsNode, blendAttr, colour, cleanup):

        # Make duplicate joint chains
        self.tripleChain = systemUtils.tripleChain(
            joints=[ankle, foot, ball, toe], name=self.name, flip=0)
        ikConst_grp = coreUtils.addParent(self.tripleChain['ikChain'][0],
                                          'group',
                                          '%s_ikConst_GRP' % self.name)
        fkConst_grp = coreUtils.addParent(self.tripleChain['fkChain'][0],
                                          'group',
                                          '%s_fkConst_GRP' % self.name)
        resultConst_grp = coreUtils.addParent(
            self.tripleChain['resultChain'][0], 'group',
            '%s_resultConst_GRP' % self.name)

        self.tripleChain['main_grp'].setParent(self.rig_grp)

        if blendAttr:
            par = pmc.parentConstraint(ikConst_grp,
                                       fkConst_grp,
                                       resultConst_grp,
                                       mo=0)
            attr = pmc.Attribute('%s.%sW1' % (par.name(), fkConst_grp.name()))
            blendAttr.connect(attr)
            attr = pmc.Attribute('%s.%sW0' % (par.name(), ikConst_grp.name()))
            blend_rev = coreUtils.reverse(blendAttr,
                                          'reverse_%s_blend, UTL' % self.name)
            blend_rev.outputX.connect(attr)

            for bc in self.tripleChain['blendColors']:
                blendAttr.connect(bc.blender)

        # Orientation for controls
        axis = 'x'
        if self.tripleChain['resultChain'][1].tx.get() < 0.0:
            axis = '-x'
        ctrlSize = coreUtils.getDistance(
            self.tripleChain['resultChain'][0],
            self.tripleChain['resultChain'][1]) * .5

        # ikHandles
        footIkHandle = pmc.ikHandle(solver='ikRPsolver',
                                    name='%s_foot_ikHandle' % self.name,
                                    startJoint=self.tripleChain['ikChain'][0],
                                    endEffector=self.tripleChain['ikChain'][1],
                                    setupForRPsolver=1)[0]
        footIkHandle.setParent(self.rig_grp)
        footIkHandleConst = coreUtils.addParent(
            footIkHandle, 'group', '%s_footIkHandle_CONST' % self.name)

        ballIkHandle = pmc.ikHandle(solver='ikRPsolver',
                                    name='%s_ball_ikHandle' % self.name,
                                    startJoint=self.tripleChain['ikChain'][1],
                                    endEffector=self.tripleChain['ikChain'][2],
                                    setupForRPsolver=1)[0]
        ballIkHandle.setParent(self.rig_grp)
        ballIkHandleConst = coreUtils.addParent(
            ballIkHandle, 'group', '%s_ballIkHandle_CONST' % self.name)

        toeIkHandle = pmc.ikHandle(solver='ikRPsolver',
                                   name='%s_toe_ikHandle' % self.name,
                                   startJoint=self.tripleChain['ikChain'][2],
                                   endEffector=self.tripleChain['ikChain'][3],
                                   setupForRPsolver=1)[0]
        toeIkHandle.setParent(self.rig_grp)
        toeIkHandleConst = coreUtils.addParent(
            toeIkHandle, 'group', '%s_toeIkHandle_CONST' % self.name)

        # ikCtrls
        self.heelIkCtrl = controls.squareCtrl(name='%s_heel_ik_CTRL' %
                                              self.name,
                                              axis=axis,
                                              size=ctrlSize)
        coreUtils.align(self.heelIkCtrl, heel)
        self.heelIkCtrl.setParent(self.ctrls_grp)
        self.ikCtrls_grp = coreUtils.addParent(self.heelIkCtrl, 'group',
                                               '%s_ikCtrls_GRP' % self.name)
        coreUtils.addParent(self.heelIkCtrl, 'group',
                            '%s_heelIkCtrl_ZERO' % self.name)
        self.ctrls.append(self.heelIkCtrl)

        self.toeIkCtrl = controls.squareCtrl(name='%s_toe_ik_CTRL' % self.name,
                                             axis=axis,
                                             size=ctrlSize)
        coreUtils.align(self.toeIkCtrl, self.tripleChain['ikChain'][3])
        self.toeIkCtrl.setParent(self.heelIkCtrl)
        coreUtils.addParent(self.toeIkCtrl, 'group',
                            '%s_toeIkCtrl_ZERO' % self.name)
        self.ctrls.append(self.toeIkCtrl)

        self.innerLoc = coreUtils.createAlignedNode(inner, 'group',
                                                    '%s_inner_GRP' % self.name)
        self.innerLoc.setParent(self.toeIkCtrl)
        innerZero = coreUtils.addParent(self.innerLoc, 'group',
                                        '%s_inner_ZERO' % self.name)

        self.outerLoc = coreUtils.createAlignedNode(outer, 'group',
                                                    '%s_outer_GRP' % self.name)
        self.outerLoc.setParent(self.innerLoc)
        outerZero = coreUtils.addParent(self.outerLoc, 'group',
                                        '%s_outer_ZERO' % self.name)

        self.ballPivotIkCtrl = controls.squareCtrl(
            name='%s_ballPivot_ik_CTRL' % self.name, axis=axis, size=ctrlSize)
        coreUtils.align(self.ballPivotIkCtrl, self.tripleChain['ikChain'][2])
        self.ballPivotIkCtrl.setParent(self.outerLoc)
        coreUtils.addParent(self.ballPivotIkCtrl, 'group',
                            '%s_ballPivotIkCtrl_ZERO' % self.name)
        inv_grp = coreUtils.addParent(self.ballPivotIkCtrl, 'group',
                                      '%s_ballPivotIkCtrlRotX_INV' % self.name)
        inv_uc = coreUtils.convert(self.ballPivotIkCtrl.rx,
                                   -1.0,
                                   name='uc_%s_ballPivotIkCtrlRotX_UTL' %
                                   self.name)
        inv_uc.output.connect(inv_grp.rx)

        pmc.parentConstraint(self.ballPivotIkCtrl, toeIkHandleConst, mo=1)
        self.ctrls.append(self.ballPivotIkCtrl)

        self.ballPivotIkCtrl.rx.connect(self.outerLoc.rx)
        pmc.transformLimits(self.innerLoc, rx=(-45, 0), erx=(0, 1))

        self.ballPivotIkCtrl.rx.connect(self.innerLoc.rx)
        pmc.transformLimits(self.outerLoc, rx=(0, 45), erx=(1, 0))

        self.ballIkCtrl = controls.squareCtrl(name='%s_ball_ik_CTRL' %
                                              self.name,
                                              axis=axis,
                                              size=ctrlSize)
        coreUtils.align(self.ballIkCtrl, self.tripleChain['ikChain'][2])
        self.ballIkCtrl.setParent(self.ballPivotIkCtrl)
        coreUtils.addParent(self.ballIkCtrl, 'group',
                            '%s_ballIkCtrl_ZERO' % self.name)
        pmc.parentConstraint(self.ballIkCtrl, ballIkHandleConst, mo=1)
        self.ctrls.append(self.ballIkCtrl)

        self.footIkCtrl = controls.squareCtrl(name='%s_foot_ik_CTRL' %
                                              self.name,
                                              axis=axis,
                                              size=ctrlSize)
        coreUtils.align(self.footIkCtrl, self.tripleChain['ikChain'][1])
        self.footIkCtrl.setParent(self.ballIkCtrl)
        coreUtils.addParent(self.footIkCtrl, 'group',
                            '%s_footIkCtrl_ZERO' % self.name)
        pmc.parentConstraint(self.footIkCtrl, footIkHandleConst, mo=1)
        pmc.parentConstraint(self.footIkCtrl, ikConst_grp, mo=1)
        self.ctrls.append(self.footIkCtrl)

        # fkCtrls
        self.footFkCtrl = controls.squareCtrl(name='%s_foot_fk_CTRL' %
                                              self.name,
                                              axis=axis,
                                              size=ctrlSize)
        coreUtils.align(self.footFkCtrl, self.tripleChain['fkChain'][1])
        self.footFkCtrl.setParent(self.ctrls_grp)
        self.fkCtrls_grp = coreUtils.addParent(self.footFkCtrl, 'group',
                                               '%s_fkCtrls_GRP' % self.name)
        coreUtils.addParent(self.footFkCtrl, 'group',
                            '%s_footFkCtrl_ZERO' % self.name)
        pmc.parentConstraint(self.footFkCtrl, self.tripleChain['fkChain'][1])
        self.ctrls.append(self.footFkCtrl)

        self.ballFkCtrl = controls.squareCtrl(name='%s_ball_fk_CTRL' %
                                              self.name,
                                              axis=axis,
                                              size=ctrlSize)
        coreUtils.align(self.ballFkCtrl, self.tripleChain['fkChain'][2])
        self.ballFkCtrl.setParent(self.footFkCtrl)
        coreUtils.addParent(self.ballFkCtrl, 'group',
                            '%s_ballFkCtrl_ZERO' % self.name)
        pmc.parentConstraint(self.ballFkCtrl, self.tripleChain['fkChain'][2])
        self.ctrls.append(self.ballFkCtrl)

        coreUtils.colorize(colour, self.ctrls)

        for ctrl in self.ctrls:
            pmc.select('%s.cv[*]' % ctrl.name())
            if ctrl != self.ballPivotIkCtrl:
                pmc.scale(3.0, scaleZ=1)
            else:
                pmc.scale(3.0, scaleY=1)

        pmc.parentConstraint(self.fkCtrls_grp, fkConst_grp, mo=1)

        for joint in self.tripleChain['resultChain']:
            self.joints.append(joint)

        # connections
        self.exposeSockets({'ikFoot': self.tripleChain['ikChain'][0]})

        if cleanup:
            self.cleanup()
コード例 #20
0
def kiddoRigModules():
    print 'Create kiddo rig modules'

    bodyModule = rig_module('body')
    pm.parent('mainJA_JNT', bodyModule.skeleton)

    main = rig_control(name='main',
                       shape='box',
                       targetOffset='mainJA_JNT',
                       constrain='mainJA_JNT',
                       parentOffset=bodyModule.controls,
                       scale=(45, 10, 50),
                       colour='white')

    main.gimbal = createCtrlGimbal(main)
    main.pivot = createCtrlPivot(main, overrideScale=(10, 10, 10))

    upperBody = rig_control(name='upperBody',
                            shape='box',
                            modify=1,
                            targetOffset='mainJA_JNT',
                            constrainOffset=main.con,
                            scale=(35, 15, 40),
                            colour='yellow',
                            parentOffset=bodyModule.controls,
                            lockHideAttrs=['tx', 'ty', 'tz'],
                            rotateOrder=2)

    pm.move(upperBody.ctrl.cv, [0, 10, 0], relative=True, objectSpace=True)

    upperWaistXYZ = simpleControls(
        ['upperWaistY_JA_JNT', 'upperWaistZ_JA_JNT', 'upperWaistX_JA_JNT'],
        modify=1,
        scale=(45, 10, 50),
        parentOffset=bodyModule.parts,
        lockHideAttrs=['tx', 'ty', 'tz'])

    upperWaistY = upperWaistXYZ['upperWaistY_JA_JNT']
    upperWaistZ = upperWaistXYZ['upperWaistZ_JA_JNT']
    upperWaistX = upperWaistXYZ['upperWaistX_JA_JNT']

    pm.hide(upperWaistY.offset, upperWaistZ.offset, upperWaistX.offset)

    constrainObject(upperBody.modify, [upperBody.offset, 'worldSpace_GRP'],
                    upperBody.ctrl, ['main', 'world'],
                    type='orientConstraint')

    constrainObject(upperWaistY.modify, [upperWaistY.offset, 'worldSpace_GRP'],
                    upperBody.ctrl, ['main', 'world'],
                    type='orientConstraint',
                    skip=('x', 'z'))

    constrainObject(upperWaistZ.modify, [upperWaistZ.offset, 'worldSpace_GRP'],
                    upperBody.ctrl, ['main', 'world'],
                    type='orientConstraint',
                    skip=('x', 'y'))

    constrainObject(upperWaistX.modify, [upperWaistX.offset, 'worldSpace_GRP'],
                    upperBody.ctrl, ['main', 'world'],
                    type='orientConstraint',
                    skip=('z', 'y'))

    pm.connectAttr(upperBody.ctrl.rotateX, upperWaistX.ctrl.rotateX)
    pm.connectAttr(upperBody.ctrl.rotateY, upperWaistY.ctrl.rotateY)
    pm.connectAttr(upperBody.ctrl.rotateZ, upperWaistZ.ctrl.rotateZ)

    lowerBody = rig_control(name='lowerBody',
                            shape='box',
                            modify=1,
                            targetOffset='lowerBodyJA_JNT',
                            constrainOffset=main.con,
                            scale=(40, 20, 30),
                            colour='green',
                            parentOffset=bodyModule.controls,
                            lockHideAttrs=['tx', 'ty', 'tz', 'rx', 'rz'],
                            rotateOrder=2)

    constrainObject(lowerBody.modify, [lowerBody.offset, 'worldSpace_GRP'],
                    lowerBody.ctrl, ['main', 'world'],
                    type='orientConstraint',
                    skip=('x', 'z'))

    pm.parentConstraint(lowerBody.con, 'lowerBodyJA_JNT', mo=True)

    pm.move(lowerBody.ctrl.cv, [0, -10, 0], relative=True, objectSpace=True)

    biped = rig_biped()
    biped.spineConnection = 'upperWaistX_JA_JNT'
    biped.pelvisConnection = 'lowerBodyJA_JNT'
    biped.centerConnection = 'mainJA_JNT'
    for side in ['l', 'r']:
        armModule = biped.arm(side, ctrlSize=10)

        fingersModule = biped.hand(side, ctrlSize=2.5)

        shoulderModule = biped.shoulder(side, ctrlSize=12)

        biped.connectArmShoulder(side)

        secColour = 'deepskyblue'
        if side == 'r':
            secColour = 'magenta'

        # make leg
        legName = side + '_leg'
        legModule = rig_module(legName)

        hipZJnt = side + '_hipZ_JA_JNT'
        hipYJnt = side + '_hipY_JA_JNT'

        legJnt = side + '_legJA_JNT'
        kneeJnt = side + '_kneeJA_JNT'
        ankleJnt = side + '_ankleJA_JNT'
        footJnt = side + '_footJA_JNT'

        pm.setAttr(hipYJnt + '.rotateOrder', 2)

        # chain IK
        legJntIK = rig_transform(0,
                                 name=side + '_legIK',
                                 type='joint',
                                 target=legJnt,
                                 parent=legModule.parts).object
        kneeJntIK = rig_transform(0,
                                  name=side + '_kneeIK',
                                  type='joint',
                                  target=kneeJnt).object
        ankleJntIK = rig_transform(
            0,
            name=side + '_ankleIK',
            type='joint',
            target=ankleJnt,
        ).object
        footJntIK = rig_transform(
            0,
            name=side + '_footIK',
            type='joint',
            target=footJnt,
        ).object
        chainIK = [legJntIK, kneeJntIK, ankleJntIK, footJntIK]

        chainParent(chainIK)
        chainIK.reverse()

        # create ik
        ik = rig_ik(legName, legJntIK, footJntIK, 'ikSpringSolver')
        pm.parent(ik.handle, legModule.parts)

        # pole vector
        legPoleVector = rig_control(side=side,
                                    name='legPV',
                                    shape='pointer',
                                    modify=1,
                                    lockHideAttrs=['rx', 'ry', 'rz'],
                                    targetOffset=[legJnt, footJnt],
                                    parentOffset=legModule.parts,
                                    scale=(2, 2, 2))

        pm.delete(pm.aimConstraint(ankleJnt, legPoleVector.offset, mo=False))

        kneePos = pm.xform(kneeJnt, translation=True, query=True, ws=True)
        poleVectorPos = pm.xform(legPoleVector.con,
                                 translation=True,
                                 query=True,
                                 ws=True)

        pvDistance = lengthVector(kneePos, poleVectorPos)

        pm.xform(legPoleVector.offset,
                 translation=[-25, 0, 0],
                 os=True,
                 r=True)

        pm.poleVectorConstraint(legPoleVector.con, ik.handle)  # create pv

        #pm.parentConstraint(biped.centerConnection, legPoleVector.offset, mo=True)
        pm.parentConstraint(hipYJnt, legPoleVector.offset, mo=True)

        if side == 'r':
            pm.rotate(legPoleVector.ctrl.cv, 0, -90, 0, r=True, os=True)
        else:
            pm.rotate(legPoleVector.ctrl.cv, 0, 90, 0, r=True, os=True)

        # create foot control
        foot = rig_control(side=side,
                           name='foot',
                           shape='box',
                           modify=1,
                           scale=(13, 13, 13),
                           parentOffset=legModule.controls,
                           lockHideAttrs=['rx', 'ry', 'rz'])

        pm.delete(pm.pointConstraint(footJnt, foot.offset))
        pm.parentConstraint(foot.con, ik.handle, mo=True)
        #pm.pointConstraint( foot.con, legPoleVector.modify, mo=True )

        foot.gimbal = createCtrlGimbal(foot)
        foot.pivot = createCtrlPivot(foot)

        constrainObject(
            foot.offset,
            [biped.pelvisConnection, biped.centerConnection, 'worldSpace_GRP'],
            foot.ctrl, ['pelvis', 'main', 'world'],
            type='parentConstraint')

        pm.setAttr(foot.ctrl.space, 2)

        pm.addAttr(foot.ctrl, longName='twist', at='float', k=True)
        pm.addAttr(foot.ctrl,
                   longName='springBiasBottom',
                   at='float',
                   min=0,
                   max=1,
                   k=True,
                   dv=0)
        pm.addAttr(foot.ctrl,
                   longName='springBiasTop',
                   at='float',
                   min=0,
                   max=1,
                   k=True,
                   dv=0.5)
        pm.connectAttr(foot.ctrl.twist, ik.handle.twist)

        pm.connectAttr(foot.ctrl.springBiasBottom,
                       ik.handle +
                       '.springAngleBias[0].springAngleBias_FloatValue',
                       f=True)
        pm.connectAttr(foot.ctrl.springBiasTop,
                       ik.handle +
                       '.springAngleBias[1].springAngleBias_FloatValue',
                       f=True)

        # create hip aims
        hipAimZ_loc = rig_transform(0,
                                    name=side + '_hipAimZ',
                                    type='locator',
                                    parent=legModule.parts,
                                    target=hipZJnt).object
        footAimZ_loc = rig_transform(0,
                                     name=side + '_footAimZ',
                                     type='locator',
                                     parent=legModule.parts).object

        pm.pointConstraint(biped.pelvisConnection, hipAimZ_loc, mo=True)
        pm.parentConstraint(foot.con, footAimZ_loc)

        # z rotation

        hipAimZ = mm.eval('rig_makePiston("' + footAimZ_loc + '", "' +
                          hipAimZ_loc + '", "' + side + '_hipAimZ");')

        hipZ = rig_control(side=side,
                           name='hipRoll',
                           shape='sphere',
                           modify=1,
                           scale=(5, 5, 7),
                           parentOffset=legModule.parts,
                           targetOffset=hipZJnt,
                           lockHideAttrs=['tx', 'ty', 'tz', 'rx', 'ry'],
                           rotateOrder=0)

        pm.parentConstraint(hipZ.con, hipZJnt, mo=True)
        pm.parentConstraint(lowerBody.con, hipZ.offset, mo=True)

        rotCon = pm.orientConstraint(hipZ.offset,
                                     hipAimZ_loc,
                                     hipZ.modify,
                                     mo=True,
                                     skip=('x', 'y'))
        targetZ = rotCon.getWeightAliasList()
        #pm.addAttr(hipZ.ctrl, longName='aim', at='float', k=True, min=0, max=1,
        # dv=1)
        #pm.connectAttr ( hipZ.ctrl.aim, target )

        # y rotation

        hipAimY_loc = rig_transform(0,
                                    name=side + '_hipAimY',
                                    type='locator',
                                    parent=legModule.parts,
                                    target=hipYJnt).object
        footAimY_loc = rig_transform(0,
                                     name=side + '_footAimY',
                                     type='locator',
                                     parent=legModule.parts).object

        pm.pointConstraint(hipZJnt, hipAimY_loc, mo=True)
        pm.parentConstraint(foot.con, footAimY_loc)

        hipAimY = mm.eval('rig_makePiston("' + footAimY_loc + '", "' +
                          hipAimY_loc + '", '
                          '"' + side + '_hipAimY");')

        pm.setAttr(side + '_hipAimZ_LOC.rotateOrder', 4)

        hipY = rig_control(side=side,
                           name='hipYaw',
                           shape='sphere',
                           modify=2,
                           scale=(5, 7, 5),
                           parentOffset=legModule.controls,
                           targetOffset=hipYJnt,
                           lockHideAttrs=['tx', 'ty', 'tz', 'rx', 'rz'],
                           rotateOrder=2)

        pm.parentConstraint(hipY.con, hipYJnt, mo=True)
        pm.parentConstraint(hipZ.con, hipY.offset, mo=True)
        #rotCon = pm.parentConstraint(hipAimY_loc, hipY.modify, mo=True,
        #                             skipTranslate=('x', 'y', 'z'),
        #                             skipRotate=('x', 'z'))
        rotCon = pm.orientConstraint(hipY.offset,
                                     hipAimY_loc,
                                     hipY.modify[0],
                                     mo=True,
                                     skip=('x', 'z'))
        targetY = rotCon.getWeightAliasList()
        pm.addAttr(hipY.ctrl,
                   longName='aim',
                   at='float',
                   k=True,
                   min=0,
                   max=1,
                   dv=1)
        pm.connectAttr(hipY.ctrl.aim, targetY[1])
        pm.connectAttr(hipY.ctrl.aim, targetZ[1])
        connectReverse(name=side + '_leg',
                       input=(hipY.ctrl.aim, hipY.ctrl.aim, 0),
                       output=(targetY[0], targetZ[0], 0))

        pm.setAttr(rotCon.interpType, 2)
        pm.transformLimits(hipY.modify[0], ry=(-30, 10), ery=(1, 1))

        pm.addAttr(hipY.ctrl,
                   longName='aimRotation',
                   at='float',
                   k=True,
                   min=0,
                   max=10,
                   dv=0)

        pm.addAttr(hipY.ctrl,
                   longName='limitOutRotation',
                   at='float',
                   k=True,
                   min=0,
                   max=10,
                   dv=3)
        pm.addAttr(hipY.ctrl,
                   longName='limitInRotation',
                   at='float',
                   k=True,
                   min=0,
                   max=10,
                   dv=0)
        hipY.ctrl.limitOutRotation.set(cb=True)
        hipY.ctrl.limitInRotation.set(cb=True)

        pm.setDrivenKeyframe(hipY.modify[0] + '.minRotYLimit',
                             cd=hipY.ctrl.limitOutRotation,
                             dv=0,
                             v=-45)
        pm.setDrivenKeyframe(hipY.modify[0] + '.minRotYLimit',
                             cd=hipY.ctrl.limitOutRotation,
                             dv=10,
                             v=0)
        pm.setDrivenKeyframe(hipY.modify[0] + '.maxRotYLimit',
                             cd=hipY.ctrl.limitInRotation,
                             dv=0,
                             v=10)
        pm.setDrivenKeyframe(hipY.modify[0] + '.maxRotYLimit',
                             cd=hipY.ctrl.limitInRotation,
                             dv=10,
                             v=0)

        rotCon = pm.orientConstraint(hipY.offset,
                                     hipY.modify[0],
                                     hipY.modify[1],
                                     mo=True)
        conTargets = rotCon.getWeightAliasList()
        pm.setDrivenKeyframe(conTargets[0],
                             cd=hipY.ctrl.aimRotation,
                             dv=0,
                             v=1)
        pm.setDrivenKeyframe(conTargets[0],
                             cd=hipY.ctrl.aimRotation,
                             dv=10,
                             v=0)
        connectReverse(name=side + '_hipYTarget',
                       input=(conTargets[0], 0, 0),
                       output=(conTargets[1], 0, 0))

        # constrain shizzle

        legTop = rig_transform(0,
                               name=side + '_legTop',
                               target=legJnt,
                               parent=legModule.skeleton).object

        pm.setAttr(legTop + '.inheritsTransform', 0)
        pm.scaleConstraint('worldSpace_GRP', legTop)
        legSkeletonParts = rig_transform(0,
                                         name=side + '_legSkeletonParts',
                                         parent=legTop).object

        pm.parent(hipAimY, hipAimZ, legModule.parts)
        pm.parent(legJntIK, legJnt, legSkeletonParts)
        pm.hide(legJntIK)
        pm.parentConstraint(hipYJnt,
                            legTop,
                            mo=True,
                            skipRotate=('x', 'y', 'z'))

        #pm.connectAttr(legJntIK+'.rotate', legJnt+'.rotate')
        pm.connectAttr(kneeJntIK + '.rotate', kneeJnt + '.rotate')
        pm.connectAttr(ankleJntIK + '.rotate', ankleJnt + '.rotate')

        multiplyDivideNode('legRotate',
                           'multiply',
                           input1=[
                               legJntIK + '.rotateX', legJntIK + '.rotateY',
                               legJntIK + '.rotateZ'
                           ],
                           input2=[1, hipY.ctrl.aim, hipY.ctrl.aim],
                           output=[
                               legJnt + '.rotateX', legJnt + '.rotateY',
                               legJnt + '.rotateZ'
                           ])

        pm.parent(hipZJnt, legModule.skeleton)
        pm.parent(hipYJnt, legModule.skeleton)

        footJnts = [
            side + '_heelRotY_JA_JNT', side + '_footRotX_JA_JNT',
            side + '_footRotY_JA_JNT', side + '_footRotZ_JA_JNT'
        ]
        footControls = simpleControls(footJnts,
                                      modify=2,
                                      scale=(11, 3, 20),
                                      parentOffset=legModule.parts,
                                      colour=secColour,
                                      lockHideAttrs=['tx', 'ty', 'tz'])

        #footControls[side+'']

        ankle = rig_control(side=side,
                            name='ankle',
                            shape='box',
                            modify=1,
                            scale=(10, 6, 8),
                            colour=secColour,
                            parentOffset=legModule.controls,
                            targetOffset=side + '_footRotZ_JA_JNT',
                            lockHideAttrs=['tx', 'ty', 'tz', 'ry'])

        pm.parentConstraint(footJnt, ankle.offset, mo=True)

        heel = footControls[side + '_heelRotY_JA_JNT']
        footRotX = footControls[side + '_footRotX_JA_JNT']
        footRotY = footControls[side + '_footRotY_JA_JNT']
        footRotZ = footControls[side + '_footRotZ_JA_JNT']

        pm.parent(heel.offset, legModule.controls)
        heel.ctrl.rotateX.setKeyable(False)
        heel.ctrl.rotateX.setLocked(True)
        heel.ctrl.rotateZ.setKeyable(False)
        heel.ctrl.rotateZ.setLocked(True)

        pm.parentConstraint(footRotY.con, heel.modify[0], mo=True)
        pm.parentConstraint(footRotZ.con, footRotY.modify[0], mo=True)
        pm.parentConstraint(footRotX.con, footRotZ.modify[0], mo=True)

        footSpace = footJnt
        if side == 'l':
            footSpace = rig_transform(0,
                                      name='l_footSpace',
                                      parent=legModule.parts,
                                      target=footJnt).object
            pm.setAttr(footSpace + '.rotateX', 0)
            pm.parentConstraint(footJnt, footSpace, mo=True)

        toeSpaceList = ('lowerBody', 'foot', 'main', 'world')
        constrainObject(heel.modify[1], [
            biped.pelvisConnection, footSpace, biped.centerConnection,
            'worldSpace_GRP'
        ],
                        heel.ctrl,
                        toeSpaceList,
                        type='orientConstraint',
                        skip=('x', 'z'))

        constrainObject(footRotX.modify[0], [
            biped.pelvisConnection, footSpace, biped.centerConnection,
            'worldSpace_GRP'
        ],
                        footRotX.ctrl,
                        toeSpaceList,
                        type='orientConstraint',
                        skip=('y', 'z'))

        constrainObject(footRotZ.modify[1], [
            biped.pelvisConnection, footSpace, biped.centerConnection,
            'worldSpace_GRP'
        ],
                        footRotZ.ctrl,
                        toeSpaceList,
                        type='orientConstraint',
                        skip=('x', 'y'))

        pm.connectAttr(ankle.ctrl.rotateX, footRotX.ctrl.rotateX)
        #pm.connectAttr( ankle.ctrl.rotateY, heel.ctrl.rotateY )
        #connectNegative(ankle.ctrl.rotateY, heel.ctrl.rotateY)
        pm.connectAttr(ankle.ctrl.rotateZ, footRotZ.ctrl.rotateZ)

        pm.addAttr(ankle.ctrl,
                   ln='SPACES',
                   at='enum',
                   enumName='___________',
                   k=True)
        ankle.ctrl.SPACES.setLocked(True)
        pm.addAttr(ankle.ctrl,
                   ln='rollSpace',
                   at='enum',
                   enumName='lowerBody:foot:main:world',
                   k=True)
        #pm.addAttr(ankle.ctrl, ln='yawSpace', at='enum',
        #           enumName='lowerBody:foot:main:world', k=True)
        pm.addAttr(ankle.ctrl,
                   ln='pitchSpace',
                   at='enum',
                   enumName='lowerBody:foot:main:world',
                   k=True)

        pm.connectAttr(ankle.ctrl.rollSpace, footRotX.ctrl.space)
        #pm.connectAttr( ankle.ctrl.yawSpace, heel.ctrl.space)
        pm.connectAttr(ankle.ctrl.pitchSpace, footRotZ.ctrl.space)

        pm.addAttr(ankle.ctrl,
                   ln='MOTION',
                   at='enum',
                   enumName='___________',
                   k=True)
        ankle.ctrl.MOTION.setLocked(True)

        pm.addAttr(ankle.ctrl,
                   longName='footFangs',
                   at='float',
                   k=True,
                   min=0,
                   max=10,
                   dv=0)
        pm.addAttr(ankle.ctrl,
                   longName='toeFangs',
                   at='float',
                   k=True,
                   min=0,
                   max=10,
                   dv=0)
        fangsJnt = pm.PyNode(side + '_toeFangsJA_JNT')
        toeFangsJnt = pm.PyNode(side + '_footFangsJA_JNT')
        fangsTranslate = fangsJnt.translate.get()
        pm.setDrivenKeyframe(fangsJnt.translateX,
                             cd=ankle.ctrl.footFangs,
                             dv=0,
                             v=fangsTranslate[0])
        pm.setDrivenKeyframe(fangsJnt.translateY,
                             cd=ankle.ctrl.footFangs,
                             dv=0,
                             v=fangsTranslate[1])
        pm.setDrivenKeyframe(fangsJnt.translateZ,
                             cd=ankle.ctrl.footFangs,
                             dv=0,
                             v=fangsTranslate[2])
        pm.move(0, 1.5, 0, fangsJnt, r=True, os=True)
        fangsTranslate = fangsJnt.translate.get()
        pm.move(0, -1.5, 0, fangsJnt, r=True, os=True)
        pm.setDrivenKeyframe(fangsJnt.translateX,
                             cd=ankle.ctrl.footFangs,
                             dv=10,
                             v=fangsTranslate[0])
        pm.setDrivenKeyframe(fangsJnt.translateY,
                             cd=ankle.ctrl.footFangs,
                             dv=10,
                             v=fangsTranslate[1])
        pm.setDrivenKeyframe(fangsJnt.translateZ,
                             cd=ankle.ctrl.footFangs,
                             dv=10,
                             v=fangsTranslate[2])

        # foot fangs
        fangsTranslate = toeFangsJnt.translate.get()
        pm.setDrivenKeyframe(toeFangsJnt.translateX,
                             cd=ankle.ctrl.toeFangs,
                             dv=0,
                             v=fangsTranslate[0])
        pm.setDrivenKeyframe(toeFangsJnt.translateY,
                             cd=ankle.ctrl.toeFangs,
                             dv=0,
                             v=fangsTranslate[1])
        pm.setDrivenKeyframe(toeFangsJnt.translateZ,
                             cd=ankle.ctrl.toeFangs,
                             dv=0,
                             v=fangsTranslate[2])
        pm.move(0, 0, -4.7, toeFangsJnt, r=True, os=True)
        fangsTranslate = toeFangsJnt.translate.get()
        pm.move(0, 0, 4.7, toeFangsJnt, r=True, os=True)
        pm.setDrivenKeyframe(toeFangsJnt.translateX,
                             cd=ankle.ctrl.toeFangs,
                             dv=10,
                             v=fangsTranslate[0])
        pm.setDrivenKeyframe(toeFangsJnt.translateY,
                             cd=ankle.ctrl.toeFangs,
                             dv=10,
                             v=fangsTranslate[1])
        pm.setDrivenKeyframe(toeFangsJnt.translateZ,
                             cd=ankle.ctrl.toeFangs,
                             dv=10,
                             v=fangsTranslate[2])

        pm.addAttr(ankle.ctrl,
                   longName='toeCapRotate',
                   at='float',
                   k=True,
                   dv=0)
        if side == 'l':
            pm.connectAttr(ankle.ctrl.toeCapRotate,
                           'l_footCapJA_JNT.rotateX',
                           f=True)
        else:
            connectReverse(ankle.ctrl.toeCapRotate, 'r_footCapJA_JNT.rotateX')

        # simple controls
        legSidesSimpleControls(legModule, side, secColour)

        armSidesSimpleControls(armModule, side, secColour)

    # asymettrical controls
    bodySimpleControls(bodyModule)
コード例 #21
0
ファイル: rig_flex.py プロジェクト: ziltz/riggingTools
def rig_autoFlexControl(name,
                        shapeDriverLoc,
                        startEnd=(),
                        shapeDriven='',
                        flexLoc='flexShapes_LOC',
                        module=None,
                        **kwds):

    scale = defaultReturn(5, 'scale', param=kwds)
    shape = defaultReturn('sphere', 'shape', param=kwds)
    colour = defaultReturn('red', 'colour', param=kwds)

    if not cmds.objExists(flexLoc + '.' + shapeDriven):
        pm.warning(flexLoc + '.' + shapeDriven +
                   ' = does not exist ! Not making auto flex control')
        return

    if module == None:
        parent = rig_transform(0, name=name + '_measureSetup').object
    else:
        parent = module.parts

    distNode = rig_measure(name=name + 'FlexDistance',
                           start=startEnd[0],
                           end=startEnd[1],
                           parent=parent)

    flexCenter = rig_control(
        name=name + 'FlexCenter',
        shape='box',
        scale=(scale, scale, scale),
        colour='white',
        lockHideAttrs=['tx', 'ty', 'tz', 'rx', 'ry', 'rz'],
        parentOffset=module.controls)
    pm.delete(pm.parentConstraint(shapeDriverLoc, flexCenter.offset))

    flexCtrl = rig_control(name=name + 'Flex',
                           shape=shape,
                           scale=(scale / 2, scale / 2, scale / 2),
                           parentOffset=flexCenter.con,
                           colour=colour,
                           lockHideAttrs=['tx', 'tz', 'rx', 'ry', 'rz'])
    pm.delete(pm.parentConstraint(flexCenter.con, flexCtrl.offset))

    rig_curveBetweenTwoPoints(flexCenter.con,
                              flexCtrl.con,
                              name=name + '_curveBetween',
                              degree=1,
                              colour=colour,
                              parent=flexCenter.offset)

    pm.addAttr(flexCtrl.ctrl,
               longName='autoFlex',
               attributeType="long",
               min=0,
               max=1,
               defaultValue=1,
               keyable=True)

    mdNode = multiplyDivideNode(
        name + '_flexMD',
        'multiply',
        input1=[distNode.distance + '.globalOriginalPercent', 0, 0],
        input2=[1, 1, 1],
        output=[])
    pmNode = plusMinusNode(name + '_flexPM', 'sum', distNode.distance,
                           'globalOriginalPercent', mdNode, 'outputX')
    conNode = conditionNode(name + '_flexCondition', 'equal',
                            (pmNode, 'output1D'), ('', 0), ('', 1),
                            (pmNode, 'output1D'))
    remapNode = remapValueNode(conNode + '.outColorR',
                               1,
                               0,
                               0,
                               1,
                               name=name,
                               valueinterp=2)

    rig_animDrivenKey(flexCtrl.ctrl.autoFlex, (0, 1), mdNode + '.input2X',
                      (-1, 0))

    rig_animDrivenKey(flexCtrl.ctrl.translateY, (0, -10),
                      remapNode + '.inputMin', (1, 0.8))
    rig_animDrivenKey(flexCtrl.ctrl.translateY, (0, 10),
                      remapNode + '.outputMin', (0, 1))

    pm.setAttr(remapNode + '.inputMax', 0.8)

    pm.connectAttr(remapNode + '.outValue',
                   flexLoc + '.' + shapeDriven,
                   f=True)

    pm.transformLimits(flexCtrl.ctrl, ty=(-10, 10), ety=(1, 1))

    mdNode = multiplyDivideNode(name + '_flexOffsetMD',
                                'multiply',
                                input1=[remapNode + '.outValue', 0, 0],
                                input2=[10, 1, 1],
                                output=[flexCtrl.offset + '.translateY'])

    pm.setAttr(flexCenter.ctrl.overrideDisplayType, 1)

    pm.select(flexCtrl.ctrl.cv[1],
              flexCtrl.ctrl.cv[27],
              flexCtrl.ctrl.cv[36],
              flexCtrl.ctrl.cv[46],
              flexCtrl.ctrl.cv[54],
              r=True)
    pm.move(0, 3, 0, r=True, os=True, wd=True)

    pm.select(flexCtrl.ctrl.cv[22],
              flexCtrl.ctrl.cv[32],
              flexCtrl.ctrl.cv[41],
              flexCtrl.ctrl.cv[50],
              flexCtrl.ctrl.cv[61],
              r=True)
    pm.move(0, -1, 0, r=True, os=True, wd=True)

    return (flexCenter, flexCtrl)
コード例 #22
0
def mantleCreate(charaHeight=2):  #default 2, 160cm height
    locM = pm.spaceLocator(name='locM')
    pm.xform(locM,
             ws=True,
             translation=[
                 8.17948246602115e-16, 126.43254364390185, -8.830608530289298
             ],
             scale=[3, 3, 3])  #shifting it into place
    locR = pm.spaceLocator(name='locR')
    pm.xform(locR,
             ws=True,
             translation=[-10, 124.043, -9.221],
             scale=[3, 3, 3])  #shifting it into place
    locRR = pm.spaceLocator(name='locRR')
    pm.xform(locRR, ws=True, translation=[-14, 129, -1.6],
             scale=[3, 3, 3])  #shifting it into place
    locL = pm.spaceLocator(name='locL')
    pm.xform(locL, ws=True, translation=[10, 124.043, -9.221],
             scale=[3, 3, 3])  #shifting it into place
    locLL = pm.spaceLocator(name='locLL')
    pm.xform(locLL, ws=True, translation=[14, 129, -1.6],
             scale=[3, 3, 3])  #shifting it into place

    heightPosition = {}  #order of data is M, R, RR, L, LL
    heightPosition['1'] = [0, 117.518,
                           -8.237], [-9.25, 115.129,
                                     -8.627], [-11, 120.1,
                                               -1.00], [9.25, 115.129, -8.627
                                                        ], [11, 120.1,
                                                            -1]  #1 = 150cm
    heightPosition['1sim'] = [0.001, 61.086,
                              -9.781], [-19, 77.696,
                                        -9.919], [-28, 120.1,
                                                  -1], [19, 77.696, -9.919
                                                        ], [28, 120.1, -1]
    heightPosition['2'] = [
        8.17948246602115e-16, 126.43254364390185, -8.830608530289298
    ], [-10, 124.043, -9.221], [-14, 129, -1.6], [10, 124.043,
                                                  -9.221], [14, 129,
                                                            -1.6]  #2 = 160cm
    heightPosition['2sim'] = [0.001, 70,
                              -11.002], [-21.549, 80, -10.513
                                         ], [-31, 129,
                                             -1.6], [21.549, 80,
                                                     -10.513], [31, 129, -1.6]
    heightPosition['3'] = [0, 133.789,
                           -13.546], [-11, 131.4,
                                      -13.936], [-15, 136.357, -4.721
                                                 ], [11, 131.4, -13.936
                                                     ], [15, 136.357,
                                                         -4.721]  #3 = 170cm
    heightPosition['3sim'] = [0.001, 77.357, -15.717], [-25.5, 79, -15.228], [
        -32, 136.357, -4.721
    ], [25.5, 79, -15.228], [32, 136.357, -4.721]
    heightPosition['4'] = [0, 157.786,
                           -14.305], [-12, 155,
                                      -14.695], [-20, 160.353, -4.5
                                                 ], [12, 155, -14.695
                                                     ], [20, 160.353,
                                                         -4.5]  #4 = 180cm
    heightPosition['4sim'] = [0.001, 101.353,
                              -16.476], [-25.75, 100,
                                         -15.987], [-37, 160.353, -4.5
                                                    ], [25.75, 100, -15.987
                                                        ], [37, 160.353, -4.5]

    #translating the locators to their position
    pm.xform('loc' + 'M',
             ws=True,
             translation=heightPosition['%s' % (charaHeight)][0],
             scale=[3, 3, 3])
    pm.xform('loc' + 'R',
             ws=True,
             translation=heightPosition['%s' % (charaHeight)][1],
             scale=[3, 3, 3])
    pm.xform('loc' + 'RR',
             ws=True,
             translation=heightPosition['%s' % (charaHeight)][2],
             scale=[3, 3, 3])
    pm.xform('loc' + 'L',
             ws=True,
             translation=heightPosition['%s' % (charaHeight)][3],
             scale=[3, 3, 3])
    pm.xform('loc' + 'LL',
             ws=True,
             translation=heightPosition['%s' % (charaHeight)][4],
             scale=[3, 3, 3])

    locList = [locM, locR, locRR, locL, locLL]
    locDict = {}
    locSimList = []

    for i in locList:
        sim = pm.duplicate(i, name=i[:3] + '_sim' + i[3:])
        locSimList.append(i)
        locDict[i] = sim

    #translating the sim locators to their positions
    pm.xform('loc_sim' + 'M',
             ws=True,
             translation=heightPosition['%ssim' % (charaHeight)][0],
             scale=[3, 3, 3])
    pm.xform('loc_sim' + 'R',
             ws=True,
             translation=heightPosition['%ssim' % (charaHeight)][1],
             scale=[3, 3, 3])
    pm.xform('loc_sim' + 'RR',
             ws=True,
             translation=heightPosition['%ssim' % (charaHeight)][2],
             scale=[3, 3, 3])
    pm.xform('loc_sim' + 'L',
             ws=True,
             translation=heightPosition['%ssim' % (charaHeight)][3],
             scale=[3, 3, 3])
    pm.xform('loc_sim' + 'LL',
             ws=True,
             translation=heightPosition['%ssim' % (charaHeight)][4],
             scale=[3, 3, 3])

    #____________________________________________________________________________________________________________________________________________________

    #locList = pm.ls('locM', 'locR','locRR', 'locL', 'locLL')#recreate the list data
    #locSimList = pm.ls('loc_simM', 'loc_simR','loc_simRR', 'loc_simL', 'loc_simLL')#recreating the list data
    #locDict = {}
    #for i in locList:
    #    locDict[i] = pm.ls(i[:3] + '_sim' + i[3:])

    #create mantle control
    mantContr = mel.eval(
        'curve -d 1 -p -0.5 1 0.866025 -p 0.5 1 0.866025 -p 0.5 -1 0.866025 -p 1 -1 0 -p 1 1 0 -p 0.5 1 -0.866025 -p 0.5 -1 -0.866025 -p -0.5 -1 -0.866026 -p -0.5 1 -0.866026 -p -1 1 -1.5885e-007 -p -1 -1 -1.5885e-007 -p -0.5 -1 0.866025 -p -0.5 1 0.866025 -p -1 1 -1.5885e-007 -p -0.5 1 -0.866026 -p 0.5 1 -0.866025 -p 1 1 0 -p 0.5 1 0.866025 -p 0.5 -1 0.866025 -p -0.5 -1 0.866025 -p -1 -1 -1.5885e-007 -p -0.5 -1 -0.866026 -p 0.5 -1 -0.866025 -p 1 -1 0 -k 0 -k 1 -k 2 -k 3 -k 4 -k 5 -k 6 -k 7 -k 8 -k 9 -k 10 -k 11 -k 12 -k 13 -k 14 -k 15 -k 16 -k 17 -k 18 -k 19 -k 20 -k 21 -k 22 -k 23 -n "controller1" ;'
    )
    mantContr = pm.rename(mantContr, 'mantle_Control')
    pm.addAttr(mantContr,
               longName='Drag',
               attributeType='short',
               keyable=True,
               defaultValue=5,
               minValue=0)  #adding drag attribute

    pm.select(deselect=True)  #deselect so it won't be the child of anything
    mantleParent = pm.joint(name='mantleParent',
                            position=pm.xform('locM',
                                              query=True,
                                              worldSpace=True,
                                              translation=True),
                            radius=2.5)  #creating mantle parent

    #main joints
    jointList = {}
    for i in locList:
        pm.select(deselect=True)  #deselect so it is parented to world
        j = pm.joint(name='joint' + i[3:],
                     position=pm.xform(i,
                                       query=True,
                                       worldSpace=True,
                                       translation=True),
                     radius=2.5)
        jointList[j] = None
        #setting transform and rotation limits
        if i[2:5] == 'cR':
            pm.transformLimits(j,
                               rotationX=[-5, 90],
                               rotationY=[-45, 45],
                               rotationZ=[-45, 25],
                               erx=[True, True],
                               ery=[True, True],
                               erz=[True, True])
        elif i[2:5] == 'cM':
            pm.transformLimits(j,
                               rotationX=[-5, 90],
                               rotationY=[-45, 45],
                               rotationZ=[-15, 15],
                               erx=[True, True],
                               ery=[True, True],
                               erz=[True, True])
        elif i[2:5] == 'cL':
            pm.transformLimits(j,
                               rotationX=[-5, 90],
                               rotationY=[-45, 45],
                               rotationZ=[-25, 45],
                               erx=[True, True],
                               ery=[True, True],
                               erz=[True, True])

    #main sims
    for i in jointList:
        pm.select(i)  #selecting so it is parented to parent joint
        sim = pm.joint(name='sim' + i[5:],
                       position=pm.xform('loc_sim' + i[5:],
                                         query=True,
                                         worldSpace=True,
                                         translation=True),
                       radius=1.5)
        jointList[i] = sim
        if i[5:] == 'LL' or i[5:] == 'RR':
            print('re-orient' + i)
            pm.joint(
                i,
                edit=True,
                orientJoint='xyz',
                secondaryAxisOrient='zup',
                zeroScaleOrient=True
            )  #orienting joint so it move appropriately from UpperArm2

    pm.select(deselect=True)

    for i in jointList:  #selecting joints
        pm.select(i, add=True)

    pm.parent(pm.ls(sl=True), mantleParent)

    #calc
    calcList = []
    mantGroup = pm.group(name='mantleGroup', world=True,
                         empty=True)  #creating calc joints
    for i in pm.listRelatives(mantleParent):
        cal = pm.duplicate(i, name=i[:7] + '_Calc', parentOnly=True)
        pm.parent(cal, mantGroup)
        spaceLoc = pm.spaceLocator(name='simLoc_' +
                                   i[5:])  #creating simloc locator
        pm.xform(spaceLoc,
                 ws=True,
                 translation=pm.xform(i, query=True, translation=True,
                                      ws=True))  #moving it to the right place
        pm.xform(spaceLoc, relative=True, translation=[0, -25.627, 0])
        pm.addAttr(spaceLoc, longName='momentumX', attributeType='float')
        pm.addAttr(spaceLoc, longName='momentumY', attributeType='float')
        pm.addAttr(spaceLoc, longName='momentumZ', attributeType='float')

        #creating expression to drive the SimLoc's translations
        pm.expression(
            object=spaceLoc,
            name=spaceLoc + '_translationExp',
            string=
            '$f = `currentTime -q`;\n$lastposX = `getAttr -t ($f - mantle_Control.Drag) %s.translateX`;\n%s.translateX = %s.translateX - (%s.translateX - $lastposX);\n$lastposY = `getAttr -t ($f - mantle_Control.Drag) %s.translateY`;\n%s.translateY = %s.translateY - (%s.translateY - $lastposY) - 25.627;\n$lastposZ = `getAttr -t ($f - mantle_Control.Drag) %s.translateZ`;\n%s.translateZ = %s.translateZ - (%s.translateZ - $lastposZ);'
            % (cal[0], spaceLoc, cal[0], cal[0], cal[0], spaceLoc, cal[0],
               cal[0], cal[0], spaceLoc, cal[0], cal[0]))
        '''
        '$f = `currentTime -q`;\n
        $lastposX = `getAttr -t ($f - mantle_Control.Drag) %s.translateX`;\n
        %s.translateX = %s.translateX - (%s.translateX - $lastposX);\n
        $lastposY = `getAttr -t ($f - mantle_Control.Drag) %s.translateY`;\n
        %s.translateY = %s.translateY - (%s.translateY - $lastposY) - 25.627;\n
        $lastposZ = `getAttr -t ($f - mantle_Control.Drag) %s.translateZ`;\n
        %s.translateZ = %s.translateZ - (%s.translateZ - $lastposZ);' %(cal[0], spaceLoc, cal[0], cal[0], cal[0], spaceLoc, cal[0], cal[0], cal[0], spaceLoc, cal[0], cal[0])
        '''

        #create expression for the momentum attributes
        if i[5:] == 'R':
            xVar = '- 0.000001'
        else:
            xVar = '+ 0.000001'
        pm.expression(
            object=spaceLoc,
            name=spaceLoc + '_momentumExp',
            string=
            '%s.momentumX = %s.translateX - %s.translateX %s;\n%s.momentumY = %s.translateY - %s.translateY;\n%s.momentumZ = %s.translateZ - %s.translateZ + 0.001;'
            % (spaceLoc, cal[0], spaceLoc, xVar, spaceLoc, cal[0], spaceLoc,
               spaceLoc, cal[0], spaceLoc))
        '''
        %s.momentumX = %s.translateX - %s.translateX %s;\n
        %s.momentumY = %s.translateY - %s.translateY;\n
        %s.momentumZ = %s.translateZ - %s.translateZ + 0.001;' % (spaceLoc, cal, spaceloc, xVar, spaceLoc, cal, spaceloc, spaceLoc, cal, spaceloc)
    
        '%s.momentumX = %s.translateX - %s.translateX %s;\n%s.momentumY = %s.translateY - %s.translateY;\n%s.momentumZ = %s.translateZ - %s.translateZ + 0.001;' % (spaceLoc, cal[0], spaceLoc, xVar, spaceLoc, cal[0], spaceLoc, spaceLoc, cal[0], spaceLoc)
        '''
        pm.parent(spaceLoc, mantGroup)
        if not cal[0][5:7] == 'RR' and not cal[0][5:7] == 'LL':
            calcList.append(cal[0])
        #creating transform limits for calc joints
        pm.transformLimits(cal[0],
                           rotationX=[-5, 360],
                           enableRotationY=[True, False])

    pm.delete(
        'simLoc_RR', 'simLoc_LL', 'jointRR_Calc',
        'jointLL_Calc')  #deleting the RR and LL simlocs that we won't need
    pm.parent(mantleParent,
              'spine2')  #parenting main joints into joint hierarchy

    #calcDriver
    calcDriver = pm.duplicate(
        mantleParent, parentOnly=True,
        name='mantleCalcDriver')  #creating calcDriver joints
    for i in pm.listRelatives(mantleParent):
        j = pm.duplicate(i, name=i[:7] + '_CalcDriver', parentOnly=True)
        pm.parent(j, calcDriver)

    #trigo
    trigoJointList = []
    trigoParent = pm.duplicate(mantleParent,
                               parentOnly=True,
                               name='mantle_trigo')  #creating trigoJoints
    for i in pm.listRelatives(mantleParent):
        trigoJoint = pm.duplicate(i, name=i[:7] + '_trigo')
        sim = pm.rename(pm.listRelatives(trigoJoint[0]),
                        'sim' + i[5:] + '_trigo')
        pm.parent(trigoJoint, trigoParent)
        if not (str(trigoJoint[0][5:7]) == 'RR') and not (str(
                trigoJoint[0][5:7]) == 'LL'):
            trigoJointList.append(trigoJoint[0])
        #creating transform limits
        pm.transformLimits(trigoJoint[0],
                           rotationY=[-45, 45],
                           ery=[True, True])

        if trigoJoint[0][5:7] == 'RR' or trigoJoint[0][
                5:
                7] == 'LL':  #performing parentConstraint from upperarm2 to RR or LL joint
            print('RR or LL joint constrained to upper arm')
            pm.joint(
                trigoJoint[0],
                edit=True,
                orientJoint='xyz',
                secondaryAxisOrient='zup',
                zeroScaleOrient=True
            )  #orienting joint so it move appropriately from UpperArm2
            pm.parentConstraint(trigoJoint[0][5] + '_upperarm2',
                                trigoJoint[0],
                                mo=True)

    #write a combined trigo expression
    pm.expression(
        object=trigoJointList[0],
        name=trigoJointList[0] + '_trigoExp',
        string=
        '%s.rotateX = atand(%s.momentumZ/%s.momentumY) - pelvis.rotateX - spine1.rotateZ - spine2.rotateZ;\n%s.rotateY = atand(%s.momentumX/%s.momentumZ) - pelvis.rotateY - spine1.rotateX - spine2.rotateX;\n%s.rotateX = atand(%s.momentumZ/%s.momentumY) - pelvis.rotateX - spine1.rotateZ - spine2.rotateZ;\n%s.rotateY = atand(%s.momentumX/%s.momentumZ) - pelvis.rotateY - spine1.rotateX - spine2.rotateX;\n%s.rotateX = atand(%s.momentumZ/%s.momentumY) - pelvis.rotateX - spine1.rotateZ - spine2.rotateZ;\n%s.rotateY = atand(%s.momentumX/%s.momentumZ) - pelvis.rotateY - spine1.rotateX - spine2.rotateX;'
        % (trigoJointList[1], 'simLoc_' + trigoJointList[1][5],
           'simLoc_' + trigoJointList[1][5], trigoJointList[1],
           'simLoc_' + trigoJointList[1][5], 'simLoc_' + trigoJointList[1][5],
           trigoJointList[0], 'simLoc_' + trigoJointList[0][5],
           'simLoc_' + trigoJointList[0][5], trigoJointList[0],
           'simLoc_' + trigoJointList[0][5], 'simLoc_' + trigoJointList[0][5],
           trigoJointList[2], 'simLoc_' + trigoJointList[2][5],
           'simLoc_' + trigoJointList[2][5], trigoJointList[2],
           'simLoc_' + trigoJointList[2][5], 'simLoc_' + trigoJointList[2][5]))
    '''
    %s.rotateX = atand(%s.momentumZ/%s.momentumY) - pelvis.rotateX - spine1.rotateZ - spine2.rotateZ;\n
    jointR_Driver1.rotateY = atand(simLocR1.momentumX/simLocR1.momentumZ) - pelvis.rotateY - spine1.rotateX - spine2.rotateX;\n
    
    jointM_Driver1.rotateX = atand(simLocM1.momentumZ/simLocM1.momentumY) - pelvis.rotateX - spine1.rotateZ - spine2.rotateZ;\n
    jointM_Driver1.rotateY = atand(simLocM1.momentumX/simLocM1.momentumZ) - pelvis.rotateY - spine1.rotateX - spine2.rotateX;\n
    
    jointL_Driver1.rotateX = atand(simLocL1.momentumZ/simLocL1.momentumY) - pelvis.rotateX - spine1.rotateZ - spine2.rotateZ;\n
    jointL_Driver1.rotateY = atand(simLocL1.momentumX/simLocL1.momentumZ) - pelvis.rotateY - spine1.rotateX - spine2.rotateX;\n % (trigoJointList[1], 'simLoc' + trigoJointList[1][5], 'simLoc' + trigoJointList[1][5], trigoJointList[1], 'simLoc' + trigoJointList[1][5], 'simLoc' + trigoJointList[1][5], trigoJointList[0], 'simLoc' + trigoJointList[0][5], 'simLoc' + trigoJointList[0][5], trigoJointList[0], 'simLoc' + trigoJointList[0][5], 'simLoc' + trigoJointList[0][5], trigoJointList[2], 'simLoc' + trigoJointList[2][5], 'simLoc' + trigoJointList[2][5], trigoJointList[2], 'simLoc' + trigoJointList[2][5], 'simLoc' + trigoJointList[2][5])
    '''

    #create the constraints for calcDriver -> calc
    for i in calcList:
        pm.parentConstraint(i + 'Driver', i, mo=False)

    #create IK
    for i in trigoJointList:
        ik = pm.ikHandle(name='ikHandle' + i[5],
                         sj=i[:6],
                         ee=pm.listRelatives(i[:6])[0],
                         solver='ikRPsolver')[0]
        pm.parent(ik, mantleParent)
        pm.parentConstraint(pm.listRelatives(i)[0], ik, mo=False,
                            weight=1)  #create constraints between trigo and IK
        #if i[5] != 'M':
        #pm.parentConstraint('sim' + i[5] + i[5] + '_trigo', ik, mo = True, weight = 0.25) #creating another parent constraint for the LL and RR to affect the R

    pm.parentConstraint('jointRR_trigo', 'jointRR', mo=True)
    pm.parentConstraint('jointLL_trigo', 'jointLL', mo=True)

    pm.delete(locList, locSimList,
              locDict)  #deleting unnecessary stuff used to create the rig

    if charaHeight == 1:  #importing mantle Mesh
        cmds.file(
            'K:/design/maya/data/tool/scData/Mant/mantMesh/mantMesh150.ma',
            i=True)
    elif charaHeight == 2:
        cmds.file(
            'K:/design/maya/data/tool/scData/Mant/mantMesh/mantMesh160.ma',
            i=True)
    elif charaHeight == 3:
        cmds.file(
            'K:/design/maya/data/tool/scData/Mant/mantMesh/mantMesh170.ma',
            i=True)  #adjust address later
    elif charaHeight == 4:
        cmds.file(
            'K:/design/maya/data/tool/scData/Mant/mantMesh/mantMesh180.ma',
            i=True)  #adjust address later

    if not charaHeight == 0:
        pm.skinCluster(pm.listRelatives(mantleParent),
                       mantleParent,
                       'mantMesh',
                       toSelectedBones=True)
        pm.select('mantMesh')
        mel.eval('source kkCharaSetup;kkCharaSetup_charaWeight_r;'
                 )  #imports weights from data embedded inside already
コード例 #23
0
def gizmoRigModules():
    print 'Create gizmo rig modules'

    biped = rig_biped()
    biped.elbowAxis = 'ry'

    biped.spine(ctrlSize=6)

    biped.pelvis(ctrlSize=5)

    biped.neck(ctrlSize=2.5)

    biped.head(ctrlSize=5)

    for side in ['l', 'r']:
        armModule = biped.arm(side, ctrlSize=3)

        fingersModule = biped.hand(side, ctrlSize=0.5)

        shoulderModule = biped.shoulder(side, ctrlSize=2)

        biped.connectArmShoulder(side)

        legModule = biped.leg(side, ctrlSize=3)

        toesModule = biped.foot(side, ctrlSize=0.5)

        biped.connectLegPelvis()

    # make tail
    '''
	tailModule = rig_ikChainSpline('tail', 'tailJA_JNT', ctrlSize=1, parent='pelvisJA_JNT',
	                               numIkControls=4, numFkControls=4)

	chainList = rig_chain('tailJOTip_JNT').chain
	print '====== MAKING TAIL TIP =============='
	fkCtrls = fkControlChain(chainList, modify=1, scale=[1, 1, 1], directCon=1)
	for fk in fkCtrls:
		pm.parent(fk.offset, tailModule.controls)
	'''

    tailModule = rig_ikChainSpline('tail',
                                   'tailHiJA_JNT',
                                   ctrlSize=1,
                                   parent='pelvisJA_JNT',
                                   numIkControls=12,
                                   numFkControls=12)

    # tail upgrade
    tailJnts = pm.listRelatives('tailskeleton_GRP', type='joint')
    for i in range(1, len(tailJnts)):
        tailNme = tailJnts[i].stripNamespace()
        tailIK = tailJnts[i]
        tailFK = tailNme.replace('IK', 'FK')
        tailFK = tailFK.replace('_JNT', '')

        constrainObject(tailFK + 'Modify2_GRP',
                        [tailIK, tailFK + 'Modify1_GRP'],
                        tailFK + '_CTRL', ['IK', 'parent'],
                        type='parentConstraint')

    pm.parentConstraint('tailFKACon_GRP', 'tailBaseIKOffset_GRP', mo=True)

    constrainObject('tailMidAIKOffset_GRP',
                    ['tailFKACon_GRP', 'pelvisCon_GRP', 'worldSpace_GRP'],
                    'tailMidAIK_CTRL', ['base', 'pelvis', 'world'],
                    type='parentConstraint')

    constrainObject('tailMidBIKOffset_GRP', [
        'tailFKACon_GRP', 'tailMidAIKCon_GRP', 'pelvisCon_GRP',
        'worldSpace_GRP'
    ],
                    'tailMidBIK_CTRL', ['base', 'FK', 'pelvis', 'world'],
                    type='parentConstraint')

    constrainObject('tailTipIKOffset_GRP', [
        'tailFKACon_GRP', 'tailMidBIKCon_GRP', 'pelvisCon_GRP',
        'worldSpace_GRP'
    ],
                    'tailTipIK_CTRL', ['base', 'FK', 'pelvis', 'world'],
                    type='parentConstraint')

    tailPointer = rig_control(name='tailPointer',
                              shape='pyramid',
                              scale=(1, 2, 1),
                              lockHideAttrs=['rx', 'ry', 'rz'],
                              colour='white',
                              parentOffset=tailModule.controls,
                              rotateOrder=2)
    pm.delete(pm.parentConstraint('tailHiJEnd_JNT', tailPointer.offset))
    constrainObject(
        tailPointer.offset,
        ['pelvisCon_GRP', 'spineFullBodyCon_GRP', 'worldSpace_GRP'],
        tailPointer.ctrl, ['pelvis', 'fullBody', 'world'],
        type='parentConstraint')

    tailPointerBase = rig_transform(0,
                                    name='tailPointerBase',
                                    type='locator',
                                    parent=tailModule.parts,
                                    target='tailFKA_CTRL').object
    tailPointerTip = rig_transform(0,
                                   name='tailPointerTip',
                                   type='locator',
                                   parent=tailModule.parts,
                                   target=tailPointer.con).object

    pm.rotate(tailPointerBase, 0, 0, -90, r=True, os=True)
    pm.rotate(tailPointerTip, 0, 0, -90, r=True, os=True)

    pm.parentConstraint('pelvisCon_GRP', tailPointerBase, mo=True)
    pm.parentConstraint(tailPointer.con, tailPointerTip, mo=True)

    tailPointerTop = mm.eval('rig_makePiston("' + tailPointerBase + '", "' +
                             tailPointerTip + '", "tailPointerAim");')

    pm.orientConstraint(tailPointerBase.replace('LOC', 'JNT'),
                        'tailFKAModify2_GRP',
                        mo=True)

    pm.parent('tailMidAIKOffset_GRP', 'tailMidBIKOffset_GRP',
              'tailTipIKOffset_GRP', tailModule.controls)
    pm.parent(tailJnts, tailModule.skeleton)
    pm.parent('tail_cMUS', 'tailBaseIKOffset_GRP', tailPointerTop,
              tailModule.parts)

    pm.setAttr(tailModule.skeleton + '.inheritsTransform', 0)

    # build facial

    facialModule = rig_module('facial')
    pm.parent(facialModule.top, 'rigModules_GRP')

    # build shape locators

    for side in ['l', 'r']:
        muzzleCtrl = fourWayShapeControl(
            side + '_muzzleShape_LOC',
            (side + 'MuzzleUp', side + 'MuzzleDown', side + 'MuzzleForward',
             side + 'MuzzleBack'),
            'headShapeWorld_GRP',
            ctrlSize=1)

        pm.rotate(muzzleCtrl.ctrl.cv, 0, 0, 90, r=True, os=True)
        pm.rotate(muzzleCtrl.ctrl.cv, -45, 0, 0, r=True, os=True)

        browCtrl = twoWayShapeControl(side + '_browShape_LOC',
                                      (side + 'BrowUp', side + 'BrowDown'),
                                      'headShapeWorld_GRP',
                                      ctrlSize=0.8)

        pm.rotate(browCtrl.ctrl.cv, 90, 0, 0, r=True, os=True)
        pm.rotate(browCtrl.ctrl.cv, 0, -75, 0, r=True, os=True)

        blinkCtrl = oneWayShapeControl(side + '_blinkShape_LOC',
                                       side + 'Blink',
                                       'headShapeWorld_GRP',
                                       ctrlSize=0.5)

        if side == 'r':
            pm.rotate(blinkCtrl.ctrl.cv, 0, 0, 180, r=True, os=True)
            #pm.move(blinkCtrl.ctrl.cv, 0, -0.4, 0, relative=True)

        #pm.parent( muzzleCtrl.offset, browCtrl.offset , blinkCtrl.offset ,facialModule.controls)

    pm.parent('headShapeWorld_GRP', facialModule.controls)
    pm.parentConstraint('headJA_JNT', 'headShapeWorld_GRP')

    # build simple controllers
    facialLocalWorldControllers(facialModule, 'headJAWorld_GRP', ctrlSize=0.1)

    pm.parentConstraint('headJA_JNT', 'headJAWorld_GRP')

    pm.parent('headJAWorld_GRP', facialModule.controlsSec)

    pm.move(pm.PyNode('noseTwk_CTRL').cv, 0.15, 0, 0, r=True, os=True)
    pm.scale(pm.PyNode('noseTwk_CTRL').cv, 2.5, 2.5, 2.5)

    # jaw control
    jawControl = rig_control(name='jaw',
                             shape='circle',
                             scale=(2, 2, 2),
                             lockHideAttrs=['rx'],
                             parentOffset=facialModule.controls,
                             colour='white')

    pm.rotate(jawControl.ctrl.cv, -90, 0, 0, r=True, os=True)
    pm.move(jawControl.ctrl.cv, 2, 0, 0, r=True, os=True)

    pm.delete(pm.parentConstraint('jawJA_JNT', jawControl.offset))
    pm.parentConstraint('headJA_JNT', jawControl.offset, mo=True)

    pm.parent('jawHeadOffset_LOC', jawControl.offset)
    pm.pointConstraint(jawControl.con, 'jawHeadOffset_LOC', mo=True)

    facialLoc = 'facialShapeDriver_LOC'

    rig_animDrivenKey(jawControl.ctrl.rotateY, (0, 35), facialLoc + '.jawOpen',
                      (0, 1))
    rig_animDrivenKey(jawControl.ctrl.rotateY, (0, -5),
                      facialLoc + '.jawClosed', (0, 1))
    rig_animDrivenKey(jawControl.ctrl.rotateZ, (0, -10),
                      facialLoc + '.rJawSide', (0, 1))
    rig_animDrivenKey(jawControl.ctrl.rotateZ, (0, 10),
                      facialLoc + '.lJawSide', (0, 1))

    pm.transformLimits(jawControl.ctrl, ry=(-5, 35), ery=(1, 1))
    pm.transformLimits(jawControl.ctrl, rz=(-10, 10), erz=(1, 1))
    pm.transformLimits(jawControl.ctrl, tx=(-0.1, 0.1), etx=(1, 1))
    pm.transformLimits(jawControl.ctrl, ty=(-0.1, 0.1), ety=(1, 1))
    pm.transformLimits(jawControl.ctrl, tz=(0, 0.1), etz=(1, 1))

    upperLipCtrls = pm.ls("*upperLip*Twk*CTRL")
    for c in upperLipCtrls:
        pm.scale(c.cv, 0.6, 0.6, 0.6, r=True)
        pm.move(c.cv, 0, 0, 0.3, r=True)
        pm.move(c.cv, 0, 0.1, 0, r=True)

    lowerLipCtrls = pm.ls("*lowerLip*Twk*CTRL")
    for c in lowerLipCtrls:
        pm.scale(c.cv, 0.6, 0.6, 0.6, r=True)
        pm.move(c.cv, 0, 0, 0.3, r=True)
        pm.move(c.cv, 0, -0.1, 0, r=True)

    pm.setAttr(facialModule.parts + '.inheritsTransform', 0)

    pm.parent('tongueControls_GRP', facialModule.controls)

    # eye controls

    eyeModule = rig_module('eye')
    pm.parent(eyeModule.top, 'rigModules_GRP')

    eyeControl = rig_control(name='eye',
                             shape='circle',
                             modify=1,
                             parentOffset=eyeModule.controls,
                             scale=(1, 1, 1),
                             rotateOrder=2,
                             lockHideAttrs=['rx', 'ry', 'rz'])

    pm.delete(pm.parentConstraint('eyeAim_LOC', eyeControl.offset))
    #pm.parentConstraint( 'headCon_GRP', eyeControl.offset, mo=True )

    pm.rotate(eyeControl.ctrl.cv, 90, 0, 0, r=True, os=True)

    pm.select(eyeControl.ctrl.cv[1], r=True)
    pm.select(eyeControl.ctrl.cv[5], add=True)
    pm.scale(0, 0, 0, r=True)

    constrainObject(eyeControl.offset, ['headCon_GRP', 'worldSpace_GRP'],
                    eyeControl.ctrl, ['head', 'world'],
                    type='parentConstraint')

    pm.parent('eyeAim_LOC', eyeControl.con)
    pm.hide('eyeAim_LOC')

    for side in ('l', 'r'):
        eyeBase = rig_transform(0,
                                name=side + '_eyeBase',
                                type='locator',
                                target=side + '_eyeJA_JNT',
                                parent=eyeModule.parts).object
        eyeTarget = rig_transform(0,
                                  name=side + '_eyeTarget',
                                  type='locator',
                                  target='eyeAim_LOC',
                                  parent=eyeModule.parts).object

        pm.parentConstraint('headJA_JNT', eyeBase, mo=True)
        pm.parentConstraint('eyeAim_LOC', eyeTarget, mo=True)

        eyeAimTop = mm.eval('rig_makePiston("' + eyeBase + '", "' + eyeTarget +
                            '", '
                            '"' + side + '_eyeAim");')

        pm.orientConstraint(side + '_eyeBase_JNT',
                            side + '_eyeJA_JNT',
                            mo=True)

        pm.parent(eyeAimTop, eyeModule.parts)

        upperEyeControl = rig_control(
            side=side,
            name='eyeUpper',
            shape='circle',
            modify=1,
            parentOffset=eyeModule.controlsSec,
            scale=(0.1, 0.1, 0.1),
            constrain=side + '_upperEyeLidRotateOffset_GRP',
            rotateOrder=2,
            directCon=1,
            lockHideAttrs=['tx', 'ty', 'tz', 'rx', 'ry'])

        pm.delete(
            pm.parentConstraint(side + '_eyeLocalOffset_GRP',
                                upperEyeControl.offset))
        pm.delete(
            pm.pointConstraint(side + '_eyeJA_JNT', upperEyeControl.offset))

        lowerEyeControl = rig_control(
            side=side,
            name='eyeLower',
            shape='circle',
            modify=1,
            parentOffset=eyeModule.controlsSec,
            scale=(0.1, 0.1, 0.1),
            constrain=side + '_lowerEyeLidRotateOffset_GRP',
            rotateOrder=2,
            directCon=1,
            lockHideAttrs=['tx', 'ty', 'tz', 'rx', 'ry'])

        pm.delete(
            pm.parentConstraint(side + '_eyeLocalOffset_GRP',
                                lowerEyeControl.offset))
        pm.delete(
            pm.pointConstraint(side + '_eyeJA_JNT', lowerEyeControl.offset))
        '''
		eyeControl = rig_control(side=side, name='eye', shape='circle', modify=1,
		                             parentOffset=eyeModule.controls, scale=(1,1,1),
		                             rotateOrder=2, lockHideAttrs=['rx', 'ry', 'rz'])
		'''

        # ear controls
        chainEars = rig_chain(side + '_earJA_JNT').chain
        earCtrls = fkControlChain(
            [side + '_earJA_JNT', side + '_earJB_JNT', side + '_earJC_JNT'],
            modify=0,
            scale=[0.8, 0.8, 0.8],
            directCon=0)

        # parent ears to headJA_JNT

        for ctrl in earCtrls:
            pm.parent(ctrl.parent, 'headControlsSecondary_GRP')
コード例 #24
0
ファイル: camera_tools.py プロジェクト: theomission/anima
def camera_film_offset_tool():
    """Adds a locator to the selected camera with which you can adjust the 2d
    pan and zoom.

    Usage :
    -------
    - to add it, select the camera and use oyCameraFilmOffsetTool
    - to remove it, set the transformations to 0 0 1 and then simply delete
    the curve
    """
    sel_list = pm.ls(sl=1)

    camera_shape = ""
    found_camera = 0

    for obj in sel_list:
        #if it is a transform node query for shapes
        if isinstance(obj, pm.nt.Transform):
            for shape in obj.listRelatives(s=True):
                if isinstance(shape, pm.nt.Camera):
                    camera_shape = shape
                    found_camera = 1
                    break
        elif isinstance(obj, pm.nt.Camera):
            camera_shape = obj
            found_camera = 1
            break

    if found_camera:
        pass
    else:
        raise RuntimeError("please select one camera!")

    #get the camera transform node
    temp = camera_shape.listRelatives(p=True)
    camera_transform = temp[0]

    pm.getAttr("defaultResolution.deviceAspectRatio")
    pm.getAttr("defaultResolution.pixelAspect")

    #create the outer box
    frame_curve = pm.curve(
        d=1,
        p=[(-0.5, 0.5, 0),
           (0.5, 0.5, 0),
           (0.5, -0.5, 0),
           (-0.5, -0.5, 0),
           (-0.5, 0.5, 0)],
        k=[0, 1, 2, 3, 4]
    )
    pm.parent(frame_curve, camera_transform, r=True)

    #transform the frame curve
    frame_curve.tz.set(-10.0)

    #create the locator
    temp = pm.spaceLocator()
    adj_locator = temp
    adj_locator_shape = temp

    adj_locator.addAttr('enable', at='bool', dv=True, k=True)

    pm.parent(adj_locator, frame_curve, r=True)

    pm.transformLimits(adj_locator, tx=(-0.5, 0.5), etx=(True, True))
    pm.transformLimits(adj_locator, ty=(-0.5, 0.5), ety=(True, True))
    pm.transformLimits(adj_locator, sx=(0.01, 2.0), esx=(True, True))

    #connect the locator tx and ty to film offset x and y
    adj_locator.tx >> camera_shape.pan.horizontalPan
    adj_locator.ty >> camera_shape.pan.verticalPan

    exp = 'float $flen = %s.focalLength;\n\n' \
          'float $hfa = %s.horizontalFilmAperture * 25.4;\n' \
          '%s.sx = %s.sy = -%s.translateZ * $hfa/ $flen;' % (
          camera_shape, camera_shape, frame_curve, frame_curve, frame_curve)
    pm.expression(s=exp, o='', ae=1, uc="all")

    adj_locator.sx >> adj_locator.sy
    adj_locator.sx >> adj_locator.sz
    adj_locator.sx >> camera_shape.zoom
    adj_locator.enable >> camera_shape.panZoomEnabled

    adj_locator_shape.localScaleZ.set(0)

    adj_locator.tz.set(lock=True, keyable=False)
    adj_locator.rx.set(lock=True, keyable=False)
    adj_locator.ry.set(lock=True, keyable=False)
    adj_locator.rz.set(lock=True, keyable=False)
    adj_locator.sy.set(lock=True, keyable=False)
    adj_locator.sz.set(lock=True, keyable=False)
コード例 #25
0
def createStereoSafePlanes(stereoCamera, base_percent=0.7, far1=0.5, far2=1.0, near1=-1.0, near2=-2.0):
    if not pm.objExists(stereoCamera):
        print 'Failed to find stereo camera: '+str(stereoCamera)
        return []
    else:
        stereoCamera = pm.PyNode(stereoCamera)

    try:
        pm.system.loadPlugin(safePlaneNodeType, quiet=True)
    except:
        print traceback.format_exc()
        return

    safePlane = []
    convergePlane = []
    safePlane = [s.getParent() for s in pm.listRelatives(stereoCamera, ad=True, pa=True, type=safePlaneNodeType)]
    convergePlane = [c.getParent() for c in pm.listRelatives(stereoCamera, ad=True, pa=True, type=convergePlaneNodeType)]
    if safePlane and convergePlane:
        return {'safePlane':safePlane[0], 'convergePlane':convergePlane[0]}

    try:
        if safePlane:
            pm.delete(safePlane)
        if convergePlane:
            pm.delete(convergePlane)
    except:
        print traceback.format_exc()

    # safe plane
    safePlaneShape = pm.createNode(safePlaneNodeType)
    safePlane = safePlaneShape.getParent()
    stereoCameraShape = stereoCamera.getShape()

    pm.transformLimits(safePlane, tz=(-999999,-0.001), etz=(False, True))
    safePlane.attr('translateZ').set(-20)
    safePlane.attr('translateZ') >> safePlaneShape.attr('translateZ')
    stereoCameraShape.attr('cameraAperture') >> safePlaneShape.attr('filmAperture')
    stereoCameraShape.attr('focalLength') >> safePlaneShape.attr('focalLength')
    stereoCameraShape.attr('zeroParallax') >> safePlaneShape.attr('zeroParallax')
    safePlaneShape.attr('outInterocular') >> stereoCameraShape.attr('interaxialSeparation')

    for a in ['translateX', 'translateY', 'rotateX', 'rotateY', 'rotateZ', 'scaleX', 'scaleZ']:
        safePlane.attr(a).lock()
        safePlane.attr(a).setKeyable(False)

    for a in ['localPositionX', 'localPositionY', 'localPositionZ', 'localScaleX', 'localScaleY', 'localScaleZ']:
        safePlane.attr(a).setKeyable(False)
        safePlane.attr(a).showInChannelBox(False)

    safePlane.attr('translateZ').set(-20)
    safePlaneShape.attr(safePlaneAttrMap['base']).set(base_percent)
    safePlaneShape.attr(safePlaneAttrMap['farthest']).set(far2)
    safePlaneShape.attr(safePlaneAttrMap['far']).set(far1)
    safePlaneShape.attr(safePlaneAttrMap['near']).set(near1)
    safePlaneShape.attr(safePlaneAttrMap['nearest']).set(near2)
    if safePlaneShape.hasAttr('versionSwitch'):
        safePlaneShape.attr('versionSwitch').set(2)

    pm.parent(safePlane, stereoCamera, relative=True)

    # converge plane
    convergePlaneShape = pm.createNode(convergePlaneNodeType)
    convergePlane = convergePlaneShape.getParent()

    pm.transformLimits(convergePlane, tz=(-999999,-0.001), etz=(False, True))
    convergePlane.attr('translateZ').set(-10)
    convergePlane.attr('translateZ') >> convergePlaneShape.attr('translateZ')
    stereoCameraShape.attr('cameraAperture') >> convergePlaneShape.attr('filmAperture')
    stereoCameraShape.attr('focalLength') >> convergePlaneShape.attr('focalLength')
    convergePlaneShape.attr('zeroParallax') >> stereoCameraShape.attr('zeroParallax')

    for a in ['translateX', 'translateY', 'rotateX', 'rotateY', 'rotateZ', 'scaleX', 'scaleZ']:
        convergePlane.attr(a).lock()
        convergePlane.attr(a).setKeyable(False)

    for a in ['localPositionX', 'localPositionY', 'localPositionZ', 'localScaleX', 'localScaleY', 'localScaleZ']:
        convergePlane.attr(a).setKeyable(False)
        convergePlane.attr(a).showInChannelBox(False)

    for a in ['focalLength', 'horizontalFilmAperture', 'verticalFilmAperture', 'translateZ']:
        convergePlaneShape.attr(a).setKeyable(False)
        convergePlaneShape.attr(a).showInChannelBox(False)

    pm.parent(convergePlane, stereoCamera, relative=True)

    return {'safePlane':safePlane, 'convergePlane':convergePlane}
コード例 #26
0
def limitJointsRadgoll:
    import pymel.core as pm
    rigname = 'female_doll'
    for side in ['Right', 'Left']:
        pm.transformLimits('%s_%sUpLeg'%(rigname, side), erx=(1, 1),  ery=(1, 1), erz=(1, 1), rx=(-12, 12), ry=(-90, 12), rz=(-90, 90))
        pm.transformLimits('%s_%sLeg'%(rigname, side), erx=(1, 1),  ery=(1, 1), erz=(1, 1), rx=(-12, 12), ry=(-90, 12), rz=(-90, 90))
        pm.transformLimits('%s_%sFoot'%(rigname, side), erx=(1, 1),  ery=(1, 1), erz=(1, 1), rx=(-12, 12), ry=(-90, 12), rz=(-90, 90))
        pm.transformLimits('%s_%sToeBase'%(rigname, side), erx=(1, 1),  ery=(1, 1), erz=(1, 1), rx=(-12, 12), ry=(-90, 12), rz=(-90, 90))
        pm.transformLimits('%s_%sShoulder'%(rigname, side), erx=(1, 1),  ery=(1, 1), erz=(1, 1), rx=(-12, 12), ry=(-90, 12), rz=(-90, 90))
        pm.transformLimits('%s_%sArm'%(rigname, side), erx=(1, 1),  ery=(1, 1), erz=(1, 1), rx=(-12, 12), ry=(-90, 100), rz=(-90, 90))
        pm.transformLimits('%s_%sForeArm'%(rigname, side), erx=(1, 1),  ery=(1, 1), erz=(1, 1), rx=(-12, 12), ry=(-90, 12), rz=(-90, 90))
        pm.transformLimits('%s_%sHand'%(rigname, side), erx=(1, 1),  ery=(1, 1), erz=(1, 1), rx=(-12, 12), ry=(-90, 12), rz=(-90, 90))
        pm.transformLimits('%s_Spine'%(rigname, side), erx=(1, 1),  ery=(1, 1), erz=(1, 1), rx=(-12, 12), ry=(-45, 45), rz=(-90, 90))
    
    pm.transformLimits('%s_Spine1'%rigname, erx=(1, 1),  ery=(1, 1), erz=(1, 1), rx=(-12, 12), ry=(-45, 45), rz=(-90, 90))
    pm.transformLimits('%s_Spine2'%rigname, erx=(1, 1),  ery=(1, 1), erz=(1, 1), rx=(-12, 12), ry=(-45, 45), rz=(-90, 90))
    pm.transformLimits('%s_Neck'%rigname, erx=(1, 1),  ery=(1, 1), erz=(1, 1), rx=(-45, 45), ry=(-45, 45), rz=(-40, 40))
    pm.transformLimits('%s_Head'%rigname, erx=(1, 1),  ery=(1, 1), erz=(1, 1), rx=(-45, 45), ry=(-45, 45), rz=(-90, 40))
コード例 #27
0
def limitTranform(objType="nurbsCurve", limits=['t'], maxVal=1, minVal=-1):
    """transformLimit 锁定目标的移动范围
    
    Parameters
    ----------
    objType : str, optional
        遍历物体的类型, by default "nurbsCurve"
    limits : list, optional
        锁定的属性 支持 ['t','r','s'], by default ['t']
    maxVal : int, optional
        锁定的最大值, by default 1
    minVal : int, optional
        锁定的最小值, by default -1
    """
    sel_list = pm.ls(sl=1, dag=1, ni=1, type=objType)

    for sel in sel_list:
        if hasattr(sel, "getTransform"):
            sel = sel.getTransform()

        for limit in limits:
            if limit == 't' or limit == 'translate':
                pm.transformLimits(sel, tx=(minVal, maxVal), etx=(1, 0))
                pm.transformLimits(sel, ty=(minVal, maxVal), ety=(1, 0))
                pm.transformLimits(sel, tz=(minVal, maxVal), etz=(1, 0))
                pm.transformLimits(sel, tx=(minVal, maxVal), etx=(1, 1))
                pm.transformLimits(sel, ty=(minVal, maxVal), ety=(1, 1))
                pm.transformLimits(sel, tz=(minVal, maxVal), etz=(1, 1))
            elif limit == 'r' or limit == 'rotate':
                pm.transformLimits(sel, rx=(minVal, maxVal), erx=(1, 0))
                pm.transformLimits(sel, ry=(minVal, maxVal), ery=(1, 0))
                pm.transformLimits(sel, rz=(minVal, maxVal), erz=(1, 0))
                pm.transformLimits(sel, rx=(minVal, maxVal), erx=(1, 1))
                pm.transformLimits(sel, ry=(minVal, maxVal), ery=(1, 1))
                pm.transformLimits(sel, rz=(minVal, maxVal), erz=(1, 1))
            elif limit == 's' or limit == 'scale':
                pm.transformLimits(sel, sx=(minVal, maxVal), esx=(1, 0))
                pm.transformLimits(sel, sy=(minVal, maxVal), esy=(1, 0))
                pm.transformLimits(sel, sz=(minVal, maxVal), esz=(1, 0))
                pm.transformLimits(sel, sx=(minVal, maxVal), esx=(1, 1))
                pm.transformLimits(sel, sy=(minVal, maxVal), esy=(1, 1))
                pm.transformLimits(sel, sz=(minVal, maxVal), esz=(1, 1))
コード例 #28
0
    def build(self,
              ankle,
              ball,
              toe,
              inner,
              outer,
              heel,
              settingsNode=None,
              blendAttr=None):
        # duplicate joints
        self.resultJoints = coreUtils.duplicateJoints([ankle, ball, toe],
                                                      name='%s_result_XX_jnt' %
                                                      self.name)
        self.fkJoints = coreUtils.duplicateJoints([ankle, ball, toe],
                                                  name='%s_fk_XX_jnt' %
                                                  self.name)
        self.ikJoints = coreUtils.duplicateJoints([ankle, ball, toe],
                                                  name='%s_ik_XX_jnt' %
                                                  self.name)

        self.resultBuffer = coreUtils.addChild(
            self.rigGrp, 'group', '%s_resultJoints_buffer_srt' % self.name)
        coreUtils.align(self.resultBuffer, self.resultJoints[0])
        self.resultJoints[0].setParent(self.resultBuffer)

        self.fkBuffer = coreUtils.addChild(
            self.rigGrp, 'group', '%s_fkJoints_buffer_srt' % self.name)
        coreUtils.align(self.fkBuffer, self.resultJoints[0])
        self.fkJoints[0].setParent(self.fkBuffer)

        self.ikBuffer = coreUtils.addChild(
            self.rigGrp, 'group', '%s_ikJoints_buffer_srt' % self.name)
        coreUtils.align(self.ikBuffer, self.resultJoints[0])
        self.ikJoints[0].setParent(self.ikBuffer)

        # set up blending
        if not blendAttr:
            pmc.addAttr(self.mainGrp,
                        ln='ik_fk_blend',
                        at='double',
                        minValue=0,
                        maxValue=1,
                        k=1,
                        h=0)
            blendAttr = self.mainGrp.ik_fk_blend
        for rj, ij, fj in zip([self.resultBuffer] + self.resultJoints,
                              [self.ikBuffer] + self.ikJoints,
                              [self.fkBuffer] + self.fkJoints):
            coreUtils.ikFkBlend(ij, fj, rj, blendAttr=blendAttr)

        ctrlSize = coreUtils.getDistance(self.resultJoints[0],
                                         self.resultJoints[1]) * .75

        # Orientation for controls and aim constraints
        axis = 'x'
        aimVec = (1, 0, 0)
        if self.resultJoints[1].tx.get() < 0.0:
            axis = '-x'
            aimVec = (-1, 0, 0)

        # FK ctrl
        self.toeCtrl = controls.circleBumpCtrl(axis='x',
                                               radius=ctrlSize,
                                               name='%s_fkToe_ctrl')
        self.toeCtrlBuffer = coreUtils.addParent(self.toeCtrl,
                                                 'group',
                                                 name='%s_fkToe_buffer_srt')
        coreUtils.align(self.toeCtrlBuffer, ball)
        self.toeCtrlBuffer.setParent(self.interfaceGrp)
        self.toeCtrl.r.connect(self.fkJoints[1].r)
        self.ctrls.append(self.toeCtrl)
        blendAttr.connect(self.toeCtrlBuffer.visibility)

        # ik Driving structure
        self.heel = coreUtils.createAlignedNode(heel, 'group',
                                                '%s_heel_srt' % self.name)
        self.heel.setParent(self.rigGrp)
        self.heelBuffer = coreUtils.addParent(self.heel, 'group',
                                              '%s_heel_buffer_srt' % self.name)

        self.toe = coreUtils.createAlignedNode(toe, 'group',
                                               '%s_toe_srt' % self.name)
        self.toe.setParent(self.heel)

        self.inner = coreUtils.createAlignedNode(inner, 'group',
                                                 '%s_inner_srt' % self.name)
        self.inner.setParent(self.toe)
        innerBuffer = coreUtils.addParent(self.inner, 'group',
                                          '%s_inner_buffer_srt' % self.name)

        self.outer = coreUtils.createAlignedNode(outer, 'group',
                                                 '%s_outer_srt' % self.name)
        self.outer.setParent(self.inner)
        outerBuffer = coreUtils.addParent(self.outer, 'group',
                                          '%s_outer_buffer_srt' % self.name)

        self.ballPivot = coreUtils.createAlignedNode(
            ball, 'group', '%s_ballPivot_srt' % self.name)
        self.ballPivot.setParent(self.outer)
        coreUtils.addParent(self.ballPivot, 'group',
                            '%s_ballPivot_buffer_srt' % self.name)

        pmc.transformLimits(self.inner, rx=(0, 0), erx=(1, 0))

        pmc.transformLimits(self.outer, rx=(0, 0), erx=(0, 1))

        self.ball = coreUtils.createAlignedNode(ball, 'group',
                                                '%s_ball_srt' % self.name)
        self.ball.setParent(self.ballPivot)
        self.ballBuffer = coreUtils.addParent(self.ball, 'group',
                                              '%s_ball_buffer_srt' % self.name)
        self.toeWiggle = coreUtils.addChild(self.ballBuffer, 'group',
                                            '%s_toeWiggle_srt' % self.name)

        componentUtils.connectIO(self.ikBuffer, self.ball, 'ball')

        # ikHandles
        ballIkHandle = pmc.ikHandle(solver='ikRPsolver',
                                    name='%s_ball_ikHandle' % self.name,
                                    startJoint=self.ikJoints[0],
                                    endEffector=self.ikJoints[1],
                                    setupForRPsolver=1)[0]
        ballIkHandle.setParent(self.ball)

        toeIkHandle = pmc.ikHandle(solver='ikRPsolver',
                                   name='%s_toe_ikHandle' % self.name,
                                   startJoint=self.ikJoints[1],
                                   endEffector=self.ikJoints[2],
                                   setupForRPsolver=1)[0]
        toeIkHandle.setParent(self.toeWiggle)

        # IK driving attributes
        if not settingsNode:
            settingsNode = self.mainGrp

        attrList = [
            'heel_roll', 'heel_pivot', 'ball_roll', 'ball_pivot', 'ball_twist',
            'ball_bend', 'toe_roll', 'toe_pivot', 'toe_twist', 'toe_wiggle',
            'toe_bend', 'edge_roll'
        ]

        pmc.addAttr(settingsNode,
                    ln='ik_foot_attributes',
                    k=0,
                    h=0,
                    at='enum',
                    enumName=' ')
        pmc.setAttr(settingsNode.ik_foot_attributes, cb=1, lock=1)

        for attr in attrList:
            pmc.addAttr(settingsNode, ln=attr, at='double', k=1, h=0)

        settingsNode.heel_roll.connect(self.heel.ry)
        settingsNode.heel_pivot.connect(self.heel.rz)
        settingsNode.ball_roll.connect(self.ball.ry)
        settingsNode.ball_pivot.connect(self.ballPivot.rz)
        settingsNode.ball_twist.connect(self.ball.rx)
        settingsNode.ball_bend.connect(self.ball.rz)
        settingsNode.toe_roll.connect(self.toe.ry)
        settingsNode.toe_pivot.connect(self.toe.rz)
        settingsNode.toe_twist.connect(self.toeWiggle.rx)
        settingsNode.toe_wiggle.connect(self.toeWiggle.ry)
        settingsNode.toe_bend.connect(self.toeWiggle.rz)
        settingsNode.edge_roll.connect(self.inner.rx)
        settingsNode.edge_roll.connect(self.outer.rx)

        # Deform joints
        self.dfmJoints = coreUtils.duplicateJoints([ankle, ball, toe],
                                                   name='%s_XX_dfm' %
                                                   self.name)
        self.dfmBufferGrp = coreUtils.addChild(
            self.deformGrp, 'group', '%s_dfmJoints_buffer_srt' % self.name)
        coreUtils.align(self.dfmBufferGrp, self.resultJoints[0])
        self.resultBuffer.t.connect(self.dfmBufferGrp.t)
        self.resultBuffer.r.connect(self.dfmBufferGrp.r)
        self.resultBuffer.s.connect(self.dfmBufferGrp.s)

        self.dfmJoints[0].setParent(self.dfmBufferGrp)
        for i in range(3):
            self.resultJoints[i].t.connect(self.dfmJoints[i].t)
            self.resultJoints[i].r.connect(self.dfmJoints[i].r)
            self.resultJoints[i].s.connect(self.dfmJoints[i].s)
コード例 #29
0
ファイル: rig_flex.py プロジェクト: ziltz/riggingTools
def rig_flexControl(name,
                    shapeDriverLoc,
                    shapes=[],
                    flexLoc='flexShapes_LOC',
                    **kwds):

    scale = defaultReturn(5, 'scale', param=kwds)
    shape = defaultReturn('sphere', 'shape', param=kwds)
    colour = defaultReturn('red', 'colour', param=kwds)

    flexCenter = rig_control(
        name=name + 'FlexCenter',
        shape='box',
        scale=(scale, scale, scale),
        colour='white',
        lockHideAttrs=['tx', 'ty', 'tz', 'rx', 'ry', 'rz'])
    pm.delete(pm.parentConstraint(shapeDriverLoc, flexCenter.offset))

    flexCtrl = rig_control(name=name + 'Flex',
                           shape=shape,
                           scale=(scale / 2, scale / 2, scale / 2),
                           parentOffset=flexCenter.con,
                           colour=colour,
                           lockHideAttrs=['tx', 'tz', 'rx', 'ry', 'rz'])
    pm.delete(pm.parentConstraint(flexCenter.con, flexCtrl.offset))

    rig_curveBetweenTwoPoints(flexCenter.con,
                              flexCtrl.con,
                              name=name + '_curveBetween',
                              degree=1,
                              colour=colour,
                              parent=flexCenter.offset)

    i = 0
    bi = 10
    for shape in shapes:
        if cmds.objExists(flexLoc + '.' + shape):
            rig_animDrivenKey(flexCtrl.ctrl.translateY, (0, bi),
                              flexLoc + '.' + shape, (0, 1))
            pm.transformLimits(flexCtrl.ctrl, ty=(i, 10), ety=(i, 1))
            i = -10
            bi = -10

    pm.setAttr(flexCenter.ctrl.overrideDisplayType, 1)

    pm.select(flexCtrl.ctrl.cv[1],
              flexCtrl.ctrl.cv[27],
              flexCtrl.ctrl.cv[36],
              flexCtrl.ctrl.cv[46],
              flexCtrl.ctrl.cv[54],
              r=True)
    pm.move(0, 3, 0, r=True, os=True, wd=True)

    pm.select(flexCtrl.ctrl.cv[22],
              flexCtrl.ctrl.cv[32],
              flexCtrl.ctrl.cv[41],
              flexCtrl.ctrl.cv[50],
              flexCtrl.ctrl.cv[61],
              r=True)
    pm.move(0, -1, 0, r=True, os=True, wd=True)

    return (flexCenter, flexCtrl)
コード例 #30
0
mantContr = pm.rename(mantContr, 'mantle_Control')
pm.addAttr(mantContr, longName = 'Drag', attributeType = 'short', keyable = True, defaultValue = 5, minValue = 0) #adding drag attribute


pm.select(deselect = True)#deselect so it won't be the child of anything
mantleParent = pm.joint(name = 'mantleParent', position = pm.xform('locM', query = True, worldSpace = True, translation = True), radius = 2.5)#creating mantle parent

#main joints
jointList = {}
for i in locList:
    pm.select(deselect = True)#deselect so it is parented to world
    j = pm.joint(name = 'joint' + i[3:], position = pm.xform(i, query = True, worldSpace = True, translation = True), radius = 2.5)
    jointList[j] = None
    #setting transform and rotation limits
    if i[2:5] == 'cR':
        pm.transformLimits(j, rotationX = [-5, 90], rotationY = [-45, 45], rotationZ = [-45, 35], erx = [True, True], ery = [True, True], erz = [True, True])
    if i[2:5] == 'cM':
        pm.transformLimits(j, rotationX = [-5, 90], rotationY = [-45, 45], rotationZ = [-15, 15], erx = [True, True], ery = [True, True], erz = [True, True])
    if i[2:5] == 'cL':
        pm.transformLimits(j, rotationX = [-5, 90], rotationY = [-45, 45], rotationZ = [-35, 45], erx = [True, True], ery = [True, True], erz = [True, True])

#main sims
for i in jointList:
    pm.select(i) #selecting so it is parented to parent joint
    sim = pm.joint(name = 'sim' + i[5:], position = pm.xform('loc_sim'+i[5:], query = True, worldSpace = True, translation = True), radius = 1.5)
    jointList[i] = sim

pm.select(deselect = True)

for i in jointList: #selecting joints
    pm.select(i, add = True)
コード例 #31
0
def bodySimpleControls(module):
    sc = simpleControls('missileJA_JNT',
                        colour='white',
                        scale=(7, 6, 8),
                        parentOffset=module.controls,
                        lockHideAttrs=['tx', 'ty', 'tz', 'ry', 'rz'])
    missile = sc['missileJA_JNT']
    pm.move(0, 2.1, 2.5, missile.ctrl.cv, os=True, r=True)
    pm.addAttr(missile.ctrl,
               ln='MOTION',
               at='enum',
               enumName='___________',
               k=True)
    missile.ctrl.MOTION.setLocked(True)
    pm.addAttr(missile.ctrl,
               longName='cockFlaps',
               at='float',
               k=True,
               dv=0,
               min=0,
               max=10)
    pm.addAttr(missile.ctrl,
               longName='offsetLeftFlaps',
               at='float',
               k=True,
               dv=0,
               min=-10,
               max=10)
    pm.addAttr(missile.ctrl,
               longName='offsetRightFlaps',
               at='float',
               k=True,
               dv=0,
               min=-10,
               max=10)

    ABC = list(string.ascii_uppercase)
    missileBayJnts = []
    missileBay = []
    missileBayHingeJnts = []
    missileBayHinge = []
    missileBayFlapJnts = []
    missileBayFlap = []
    for i in range(0, 5):
        missileBayJnts.append('missileBay' + ABC[i] + 'JA_JNT')
        missileBayHingeJnts.append('missileBayHinge' + ABC[i] + 'JA_JNT')
        missileBayFlapJnts.append('missileBayFlap' + ABC[i] + 'JA_JNT')

    scBay = simpleControls(missileBayJnts,
                           colour='red',
                           scale=(0.3, 0.3, 0.3),
                           parentOffset=module.controls,
                           modify=3,
                           lockHideAttrs=['tx', 'tz', 'rx', 'ry', 'rz'])

    sc = simpleControls(missileBayHingeJnts + missileBayFlapJnts,
                        colour='yellow',
                        scale=(0.1, 0.3, 0.1),
                        modify=3,
                        shape='cylinder',
                        parentOffset=module.controls,
                        lockHideAttrs=['tx', 'tz', 'ty', 'ry', 'rx'])

    for i in range(0, 5):
        missileBay.append(scBay[missileBayJnts[i]])
        missileBayHinge.append(sc[missileBayHingeJnts[i]])
        missileBayFlap.append(sc[missileBayFlapJnts[i]])

    missileBayHingeMods1 = []
    missileBayHingeMods2 = []
    missileBayFlapMods1 = []
    missileBayFlapMods2 = []
    for i in range(0, 5):

        pm.move(0.2, 0, 0, missileBay[i].ctrl.cv, os=True, r=True)
        pm.rotate(missileBayHinge[i].ctrl.cv, -90, 0, 0, os=True, r=True)
        pm.rotate(missileBayFlap[i].ctrl.cv, -90, 0, 0, os=True, r=True)

        pm.transformLimits(missileBay[i].ctrl, ty=(-2.315, 0), ety=(1, 1))
        pm.transformLimits(missileBayHinge[i].ctrl, rz=(0, 0), erz=(0, 1))
        pm.transformLimits(missileBayFlap[i].ctrl, rz=(0, 0), erz=(0, 1))

        rig_animDrivenKey(missile.ctrl.cockFlaps, (2, 10),
                          missileBay[i].modify[0] + '.translateY', (0, -2.315))
        rig_animDrivenKey(missile.ctrl.cockFlaps, (0, 5),
                          missileBayHinge[i].modify[0] + '.rotateZ', (0, -45))
        rig_animDrivenKey(missile.ctrl.cockFlaps, (0, 5),
                          missileBayFlap[i].modify[0] + '.rotateZ', (0, -45))
        missileBayHingeMods1.append(missileBayHinge[i].modify[1])
        missileBayHingeMods2.append(missileBayHinge[i].modify[2])
        missileBayFlapMods1.append(missileBayFlap[i].modify[1])
        missileBayFlapMods2.append(missileBayFlap[i].modify[2])

    offsetSDKControls(missile.ctrl,
                      missileBayHingeMods1,
                      transformAttr='rz',
                      attr='offsetRightFlaps',
                      sdkVal=-45)
    offsetSDKControls(missile.ctrl,
                      missileBayFlapMods1,
                      transformAttr='rz',
                      attr='offsetRightFlaps',
                      sdkVal=-45)
    offsetSDKControls(missile.ctrl,
                      missileBayHingeMods2,
                      transformAttr='rz',
                      attr='offsetLeftFlaps',
                      sdkVal=-45,
                      reverse=1)
    offsetSDKControls(missile.ctrl,
                      missileBayFlapMods2,
                      transformAttr='rz',
                      attr='offsetLeftFlaps',
                      sdkVal=-45,
                      reverse=1)

    simpleControls('l_buckleJA_JNT',
                   colour='white',
                   scale=(2, 2, 2),
                   parentOffset=module.controls,
                   lockHideAttrs=['tx', 'ty', 'tz', 'ry', 'rz'])

    simpleControls('radarJA_JNT',
                   colour='white',
                   scale=(6, 4, 6),
                   parentOffset=module.controls,
                   lockHideAttrs=['tx', 'ty', 'tz', 'ry', 'rz'])

    simpleControls('securityCamJA_JNT',
                   colour='white',
                   scale=(1.5, 0.5, 1.5),
                   parentOffset=module.controls,
                   shape='cylinder',
                   lockHideAttrs=['tx', 'ty', 'tz', 'rx', 'rz'])

    sc = simpleControls('topHatchJA_JNT',
                        colour='red',
                        scale=(4, 0.3, 4),
                        parentOffset=module.controls,
                        shape='cylinder',
                        lockHideAttrs=['tx', 'ty', 'tz', 'rx', 'rz'])

    topHatch = sc['topHatchJA_JNT']
    pm.move(0, 0.5, 0, topHatch.ctrl.cv, os=True, r=True)

    sc = simpleControls(('cockpitTopJA_JNT', 'cockpitBottomJA_JNT'),
                        colour='yellow',
                        scale=(7, 3, 10),
                        parentOffset=module.controls,
                        shape='circle',
                        lockHideAttrs=['tx', 'ty', 'tz', 'ry', 'rz'])

    cockpitTop = sc['cockpitTopJA_JNT']
    pm.move(0, 0, 10, cockpitTop.ctrl.cv, os=True, r=True)
    cockpitBottom = sc['cockpitBottomJA_JNT']
    pm.rotate(cockpitBottom.ctrl.cv, 40, 0, 0, os=True, r=True)
    pm.scale(cockpitBottom.ctrl.cv, 1, 1, 0.6, os=True, r=True)

    # engine controls
    colour = 'blue'
    for side in ('l', 'r'):
        sc = simpleControls(side + '_engineJA_JNT',
                            colour='white',
                            scale=(4, 3, 4),
                            parentOffset=module.controls,
                            shape='cylinder',
                            lockHideAttrs=['tx', 'ty', 'tz', 'rx', 'rz'])
        engine = sc[side + '_engineJA_JNT']
        pm.addAttr(engine.ctrl,
                   ln='MOTION',
                   at='enum',
                   enumName='___________',
                   k=True)
        engine.ctrl.MOTION.setLocked(True)

        pm.addAttr(engine.ctrl,
                   longName='engineRPM',
                   at='float',
                   k=True,
                   dv=15)
        pm.addAttr(engine.ctrl,
                   longName='reverseRPM',
                   at='long',
                   k=True,
                   dv=0,
                   min=0,
                   max=1)
        pm.addAttr(engine.ctrl,
                   longName='rotateFlaps',
                   at='float',
                   k=True,
                   dv=0)

        if side == 'r':
            colour = 'red'
        sc = simpleControls(
            (side + '_engineFlapAJA_JNT', side + '_engineFlapBJA_JNT',
             side + '_engineFlapCJA_JNT'),
            modify=1,
            colour=colour,
            scale=(3, 1.5, 0.5),
            parentOffset=module.controls,
            lockHideAttrs=['tx', 'ty', 'tz', 'ry', 'rz'])
        for jnt in sc:
            engineFlap = sc[jnt]
            pm.connectAttr(engine.ctrl.rotateFlaps,
                           engineFlap.modify + '.rotateX')

        mayaTime = pm.PyNode('time1')
        engineRotMD = multiplyDivideNode(side + '_engineRotate',
                                         'multiply',
                                         input1=[mayaTime.outTime, 0, 0],
                                         input2=[0.25, 0, 0],
                                         output=[])
        multiplyDivideNode(side + '_engineRpm',
                           'multiply',
                           input1=[engineRotMD.outputX, 0, 0],
                           input2=[engine.ctrl.engineRPM, 0, 0],
                           output=[side + '_engineSpinJA_JNT.rotateY'])
        pm.setDrivenKeyframe(engineRotMD.input2X,
                             cd=engine.ctrl.reverseRPM,
                             dv=0,
                             v=1)
        pm.setDrivenKeyframe(engineRotMD.input2X,
                             cd=engine.ctrl.reverseRPM,
                             dv=1,
                             v=-1)
コード例 #32
0
def removeRotLimits(node):
    for child in node.getChildren():
        pm.transformLimits(child, erx=(0, 0), ery=(0, 0), erz=(0, 0))
        if child.numChildren() > 0:
            removeRotLimits(child)
コード例 #33
0
    def placement(self):
        grp2 = pm.ls("*offSet*")
        fols = pm.ls("*_fol")
        for num, fol in enumerate(fols):
            pos = pm.xform(fol, query=True, worldSpace=True, translation=True)
            oldName = fol.split("_")
            newName = oldName[0] + "_" + oldName[1] + "_"

            self.fControl(newName, num)
            pm.xform(grp2, worldSpace=True, translation=pos)
            loc = pm.spaceLocator(name="loc_{}".format(num))
            pm.setAttr(loc + ".visibility", 0)
            pm.xform(loc, worldSpace=True, translation=pos)

            pm.pointConstraint(fol, loc)
            pm.orientConstraint(fol, loc)
        
        ctls = pm.ls("*fCTL", type="transform")
        for x in ctls:
            pm.transformLimits(x, translationX=(-1,1), enableTranslationX=(1,0))
            pm.transformLimits(x, translationX=(-1,1), enableTranslationX=(1,1))
            pm.transformLimits(x, translationY=(-1,1), enableTranslationY=(1,0))
            pm.transformLimits(x, translationY=(-1,1), enableTranslationY=(1,1))
            pm.transformLimits(x, translationZ=(-1,1), enableTranslationZ=(1,0))
            pm.transformLimits(x, translationZ=(-1,1), enableTranslationZ=(1,1))

        grp3 = pm.ls("*woldSpace*", type="transform")
        locs = pm.ls("loc_?", "loc_??", type="transform")

        for x, y in sorted(zip(grp3, locs)):
            pm.parent(y,x)

        grp2 = pm.ls("*offSet*")

        for x, y in sorted(zip(grp2, locs)):
            pm.connectAttr(y + ".translate", x + ".translate", force=True)
            pm.connectAttr(y + ".rotate", x + ".rotate", force=True)

        pm.group(grp3, name="bsMan_faceRig_low_control_GRP")
コード例 #34
0
ファイル: reverseFoot.py プロジェクト: duncanrudd/drTools
    def buildFoot(self, ankle, foot, ball, toe, inner, outer, heel,
                  settingsNode, blendAttr, colour, cleanup):

        # Make duplicate joint chains
        self.tripleChain = systemUtils.tripleChain(joints=[ankle, foot, toe],
                                                   name=self.name,
                                                   flip=0)
        ikConst_grp = coreUtils.addParent(self.tripleChain['ikChain'][0],
                                          'group',
                                          '%s_ikConst_GRP' % self.name)
        fkConst_grp = coreUtils.addParent(self.tripleChain['fkChain'][0],
                                          'group',
                                          '%s_fkConst_GRP' % self.name)
        resultConst_grp = coreUtils.addParent(
            self.tripleChain['resultChain'][0], 'group',
            '%s_resultConst_GRP' % self.name)

        self.tripleChain['main_grp'].setParent(self.rig_grp)

        if blendAttr:
            par = pmc.parentConstraint(ikConst_grp,
                                       fkConst_grp,
                                       resultConst_grp,
                                       mo=0)
            attr = pmc.Attribute('%s.%sW1' % (par.name(), fkConst_grp.name()))
            blendAttr.connect(attr)
            attr = pmc.Attribute('%s.%sW0' % (par.name(), ikConst_grp.name()))
            blend_rev = coreUtils.reverse(blendAttr,
                                          'reverse_%s_blend, UTL' % self.name)
            blend_rev.outputX.connect(attr)

            for bc in self.tripleChain['blendColors']:
                blendAttr.connect(bc.blender)

        # Orientation for controls
        axis = 'x'
        if self.tripleChain['resultChain'][1].tx.get() < 0.0:
            axis = '-x'
        ctrlSize = coreUtils.getDistance(
            self.tripleChain['resultChain'][0],
            self.tripleChain['resultChain'][1]) * .5

        # ikHandles
        ballIkHandle = pmc.ikHandle(solver='ikRPsolver',
                                    name='%s_ball_ikHandle' % self.name,
                                    startJoint=self.tripleChain['ikChain'][0],
                                    endEffector=self.tripleChain['ikChain'][1],
                                    setupForRPsolver=1)[0]
        ballIkHandle.setParent(self.rig_grp)
        ballIkHandleConst = coreUtils.addParent(
            ballIkHandle, 'group', '%s_ballIkHandle_CONST' % self.name)

        toeIkHandle = pmc.ikHandle(solver='ikRPsolver',
                                   name='%s_toe_ikHandle' % self.name,
                                   startJoint=self.tripleChain['ikChain'][1],
                                   endEffector=self.tripleChain['ikChain'][2],
                                   setupForRPsolver=1)[0]
        toeIkHandle.setParent(self.rig_grp)
        toeIkHandleConst = coreUtils.addParent(
            toeIkHandle, 'group', '%s_toeIkHandle_CONST' % self.name)

        # ikCtrls
        self.heelLoc = coreUtils.createAlignedNode(heel, 'group',
                                                   '%s_heel_GRP' % self.name)
        self.heelLoc.setParent(self.rig_grp)
        self.ikRig_grp = coreUtils.addParent(self.heelLoc, 'group',
                                             '%s_heel_ZERO' % self.name)

        self.toeLoc = coreUtils.createAlignedNode(toe, 'group',
                                                  '%s_toe_GRP' % self.name)
        self.toeLoc.setParent(self.heelLoc)

        self.innerLoc = coreUtils.createAlignedNode(inner, 'group',
                                                    '%s_inner_GRP' % self.name)
        self.innerLoc.setParent(self.toeLoc)
        innerZero = coreUtils.addParent(self.innerLoc, 'group',
                                        '%s_inner_ZERO' % self.name)

        self.outerLoc = coreUtils.createAlignedNode(outer, 'group',
                                                    '%s_outer_GRP' % self.name)
        self.outerLoc.setParent(self.innerLoc)
        outerZero = coreUtils.addParent(self.outerLoc, 'group',
                                        '%s_outer_ZERO' % self.name)

        self.ballPivotLoc = coreUtils.createAlignedNode(
            ball, 'group', '%s_ballPivot_GRP' % self.name)
        self.ballPivotLoc.setParent(self.outerLoc)
        coreUtils.addParent(self.ballPivotLoc, 'group',
                            '%s_ballPivot_ZERO' % self.name)

        pmc.transformLimits(self.innerLoc, rx=(-45, 0), erx=(0, 1))

        pmc.transformLimits(self.outerLoc, rx=(0, 45), erx=(1, 0))

        self.ballLoc = coreUtils.createAlignedNode(foot, 'group',
                                                   '%s_ball_GRP' % self.name)
        self.ballLoc.setParent(self.ballPivotLoc)
        self.ballZero = coreUtils.addParent(self.ballLoc, 'group',
                                            '%s_ball_ZERO' % self.name)
        self.toeWiggleLoc = coreUtils.addChild(self.ballZero, 'group',
                                               '%s_toeWiggle_GRP' % self.name)
        pmc.parentConstraint(self.ballLoc, ballIkHandleConst, mo=1)
        pmc.parentConstraint(self.toeWiggleLoc, toeIkHandleConst, mo=1)

        # driver attributes
        for attrName in [
                'roll_heel', 'roll_ball', 'roll_toe', 'pivot_heel',
                'pivot_ball', 'pivot_toe', 'tilt_side', 'lean_ankle',
                'wiggle_toe', 'lean_toe'
        ]:
            pmc.addAttr(settingsNode, ln=attrName, at='double', k=1, h=0)

        attr = pmc.Attribute('%s.roll_heel' % settingsNode.name())
        attr.connect(self.heelLoc.ry)

        attr = pmc.Attribute('%s.roll_ball' % settingsNode.name())
        attr.connect(self.ballLoc.ry)

        attr = pmc.Attribute('%s.roll_toe' % settingsNode.name())
        attr.connect(self.toeLoc.ry)

        attr = pmc.Attribute('%s.pivot_heel' % settingsNode.name())
        attr.connect(self.heelLoc.rz)

        attr = pmc.Attribute('%s.pivot_ball' % settingsNode.name())
        attr.connect(self.ballPivotLoc.rz)

        attr = pmc.Attribute('%s.pivot_toe' % settingsNode.name())
        attr.connect(self.toeLoc.rz)

        attr = pmc.Attribute('%s.tilt_side' % settingsNode.name())
        attr.connect(self.innerLoc.rx)
        attr.connect(self.outerLoc.rx)

        attr = pmc.Attribute('%s.lean_ankle' % settingsNode.name())
        attr.connect(self.ballLoc.rx)

        attr = pmc.Attribute('%s.wiggle_toe' % settingsNode.name())
        attr.connect(self.toeWiggleLoc.ry)

        attr = pmc.Attribute('%s.lean_toe' % settingsNode.name())
        attr.connect(self.toeWiggleLoc.rx)

        # fkCtrl
        self.ballFkCtrl = controls.pinCtrl(name='%s_ball_fk_CTRL' % self.name,
                                           axis=axis,
                                           radius=ctrlSize)
        coreUtils.align(self.ballFkCtrl, self.tripleChain['fkChain'][1])
        self.ballFkCtrl.setParent(self.ctrls_grp)
        self.ballFkCtrlZero = coreUtils.addParent(
            self.ballFkCtrl, 'group', '%s_ballFkCtrl_ZERO' % self.name)
        pmc.parentConstraint(self.ballFkCtrl, self.tripleChain['fkChain'][1])

        coreUtils.colorize(colour, [self.ballFkCtrl])

        pmc.parentConstraint(self.ballFkCtrlZero, fkConst_grp, mo=1)

        for joint in self.tripleChain['resultChain']:
            self.joints.append(joint)

        # connections
        self.exposeSockets({'ikFoot': self.tripleChain['ikChain'][0]})

        if cleanup:
            self.cleanup()
コード例 #35
0
ファイル: cyroPuppet.py プロジェクト: ziltz/riggingTools
def cyroShoulderUpgrade(side='', ctrlSize=1):
    name = side + '_quadShoulder'

    module = rig_module(name)

    ctrlSizeHalf = [ctrlSize / 2.0, ctrlSize / 2.0, ctrlSize / 2.0]
    ctrlSize = [ctrlSize, ctrlSize, ctrlSize]

    shoulderControl = rig_control(side=side,
                                  name='quadShoulder',
                                  shape='pyramid',
                                  targetOffset=side + '_clavicleJA_JNT',
                                  modify=1,
                                  parentOffset=module.controls,
                                  lockHideAttrs=['rx', 'ry', 'rz'],
                                  scale=ctrlSize,
                                  rotateOrder=0)

    clavPos = pm.xform(side + '_clavicleJA_JNT',
                       translation=True,
                       query=True,
                       ws=True)
    armPos = pm.xform(side + '_scapulaJA_JNT',
                      translation=True,
                      query=True,
                      ws=True)
    clavLength = lengthVector(armPos, clavPos)
    if side == 'l':
        pm.move(pm.PyNode(shoulderControl.offset),
                clavLength,
                0,
                0,
                r=True,
                os=True)
    else:
        pm.move(pm.PyNode(shoulderControl.offset),
                -1 * clavLength,
                0,
                0,
                r=True,
                os=True)
    pm.rotate(pm.PyNode(shoulderControl.offset), 0, 0, -90, r=True, os=True)

    pm.parentConstraint('spineJF_JNT', shoulderControl.offset, mo=True)

    clavicleAim = rig_transform(0,
                                name=side + '_clavicleAim',
                                type='locator',
                                parent=module.parts,
                                target=side + '_clavicleJA_JNT').object
    armAim = rig_transform(0,
                           name=side + '_quadShoulderAim',
                           type='locator',
                           parent=module.parts).object

    pm.pointConstraint('spineJF_JNT', clavicleAim, mo=True)
    pm.pointConstraint(shoulderControl.con, armAim)

    quadShoulderAimTop = mm.eval('rig_makePiston("' + clavicleAim + '", "' +
                                 armAim + '", "' + side +
                                 '_quadShoulderAim");')

    #pm.orientConstraint( clavicleAim, side+'_shoulder_CTRL', mo=True )

    pm.delete(pm.listRelatives(side + '_shoulderOffset_GRP',
                               type='constraint'))
    pm.parentConstraint(clavicleAim, side + '_shoulderOffset_GRP', mo=True)

    pm.addAttr(shoulderControl.ctrl,
               longName='followArm',
               at='float',
               k=True,
               min=0,
               max=10,
               defaultValue=1)

    pm.connectAttr(shoulderControl.ctrl.followArm,
                   side + '_shoulder_CTRL.followArm')

    baseLimit = 15
    pm.transformLimits(shoulderControl.ctrl,
                       tx=(-1 * baseLimit, baseLimit),
                       etx=(1, 1))
    pm.transformLimits(shoulderControl.ctrl,
                       ty=(-1 * baseLimit, baseLimit),
                       ety=(1, 1))
    pm.transformLimits(shoulderControl.ctrl,
                       tz=(-1 * baseLimit, baseLimit),
                       etz=(1, 1))

    scapulaControl = rig_control(side=side,
                                 name='quadScapula',
                                 shape='box',
                                 targetOffset=side + '_scapulaJEnd_JNT',
                                 modify=1,
                                 parentOffset=module.controls,
                                 lockHideAttrs=['rx', 'ry', 'rz'],
                                 scale=ctrlSize,
                                 rotateOrder=0)

    pm.delete(
        pm.orientConstraint(side + '_scapulaJA_JNT', scapulaControl.offset))

    scapulaAim = rig_transform(0,
                               name=side + '_quadScapulaAim',
                               type='locator',
                               parent=module.parts).object
    scapulaEndAim = rig_transform(0,
                                  name=side + '_quadScapulaEndAim',
                                  type='locator',
                                  parent=module.parts).object

    pm.delete(pm.parentConstraint(side + '_scapulaJA_JNT', scapulaAim))
    pm.pointConstraint(side + '_clavicleJA_JNT', scapulaAim, mo=True)
    pm.pointConstraint(scapulaControl.con, scapulaEndAim)
    pm.delete(pm.orientConstraint(side + '_scapulaJA_JNT', scapulaEndAim))

    quadScapulaAimTop = mm.eval('rig_makePiston("' + scapulaAim + '", "' +
                                scapulaEndAim + '", "' + side +
                                '_quadScapulaAim");')

    #pm.parentConstraint( side+'_clavicleJA_JNT', 'spineJE_JNT', scapulaControl.offset, mo=True )

    constrainObject(scapulaControl.offset,
                    [side + '_clavicleJA_JNT', 'spineJE_JNT'],
                    '', [],
                    type='parentConstraint',
                    doSpace=0,
                    setVal=(0.5, 1))

    baseLimit = 5
    pm.transformLimits(scapulaControl.ctrl,
                       tx=(-1 * baseLimit, baseLimit),
                       etx=(1, 1))
    pm.transformLimits(scapulaControl.ctrl,
                       ty=(-1 * baseLimit, baseLimit),
                       ety=(1, 1))
    pm.transformLimits(scapulaControl.ctrl,
                       tz=(-1 * baseLimit, baseLimit),
                       etz=(1, 1))

    pm.orientConstraint(scapulaAim, side + '_scapulaJA_JNT', mo=True)

    pm.hide(side + '_shoulderOffset_GRP')

    pm.parent(quadShoulderAimTop, quadScapulaAimTop, module.parts)
コード例 #36
0
ファイル: reverse_foot.py プロジェクト: duncanrudd/rooftops
def build(name="", side="rt", settingsNode=""):
    main_grp = pmc.group(empty=1, name=name + "_grp")

    const_grp = pmc.group(empty=1, name=name + "_const_grp")
    const_grp.setParent(main_grp)
    const_grp.tz.set(-4)

    outer_grp = pmc.group(empty=1, name=name + "_outer_grp")
    outer_grp.setParent(const_grp)
    outer_loc = pmc.spaceLocator(name=name + "_outer_loc")
    outer_loc.setParent(outer_grp)
    if side == "lf":
        outer_grp.tx.set(2)
    else:
        outer_grp.tx.set(-2)

    inner_grp = pmc.group(empty=1, name=name + "_inner_grp")
    inner_grp.setParent(outer_loc)
    inner_loc = pmc.spaceLocator(name=name + "_inner_loc")
    inner_loc.setParent(inner_grp)
    inner_grp.tx.set(outer_grp.tx.get() * -2)

    heel_grp = pmc.group(empty=1, name=name + "_heel_grp")
    heel_grp.setParent(inner_loc)
    heel_loc = pmc.spaceLocator(name=name + "_heel_loc")
    heel_loc.setParent(heel_grp)
    heel_grp.tz.set(-4)
    heel_grp.tx.set(inner_grp.tx.get() * -0.5)

    toe_loc = pmc.spaceLocator(name=name + "_toe_loc")
    toe_loc.setParent(heel_loc)
    toe_loc.tz.set(8)

    ballPivot_loc = pmc.spaceLocator(name=name + "_ballPivot_loc")
    ballPivot_loc.setParent(toe_loc)
    ballPivot_loc.tz.set(-2)

    toeFlex_loc = pmc.spaceLocator(name=name + "_toeFlex_loc")
    toeFlex_loc.setParent(ballPivot_loc)
    toeFlex_loc.tz.set(0)

    ball_loc = pmc.spaceLocator(name=name + "_ball_loc")
    ball_loc.setParent(ballPivot_loc)
    ball_loc.tz.set(0)

    if not settingsNode:
        settingsNode = main_grp

    attrs = ["rock_ball", "rock_toe", "rock_side", "pivot_ball", "pivot_toe", "flex_toe", "lean"]

    for attr in attrs:
        pmc.addAttr(settingsNode, ln=attr, keyable=1, hidden=0)

    settingsNode.rock_ball.connect(ball_loc.rx)
    settingsNode.rock_toe.connect(toe_loc.rx)
    settingsNode.flex_toe.connect(toeFlex_loc.rx)

    if side == "rt":
        settingsNode.rock_side.connect(outer_loc.rz)
        settingsNode.rock_side.connect(inner_loc.rz)
        pmc.transformLimits(outer_loc, rz=(0, 45), erz=(1, 0))
        pmc.transformLimits(inner_loc, rz=(-45, 0), erz=(0, 1))
        settingsNode.pivot_ball.connect(ballPivot_loc.ry)
        settingsNode.pivot_toe.connect(toe_loc.ry)
        settingsNode.lean.connect(ball_loc.rz)
    else:
        uc = common.convert(settingsNode.rock_side, -0.018, name + "_rock_side_uc")
        uc.output.connect(outer_loc.rz)
        uc.output.connect(inner_loc.rz)
        pmc.transformLimits(outer_loc, rz=(-45, 0), erz=(0, 1))
        pmc.transformLimits(inner_loc, rz=(0, 45), erz=(1, 0))
        uc = common.convert(settingsNode.pivot_ball, -0.018, name + "_pivot_ball_uc")
        uc.output.connect(ballPivot_loc.ry)
        uc = common.convert(settingsNode.pivot_toe, -0.018, name + "_pivot_toe_uc")
        uc.output.connect(toe_loc.ry)
        uc = common.convert(settingsNode.lean, -0.018, name + "_lean_uc")
        uc.output.connect(ball_loc.rz)