dbest41385@yahoo.com
512 • 826 • 2701
Resume

 

Wing Joint Setup Tool

 

This is a tool I made in Maya 2012 using python. I had made 3 wing setups like this before using 3 custom attributes and driven keyframes so I figured it was time to automate the process and save some time. The three attributes are adjustable in scale before the joints are created. The number denotes the degrees traveled by the pointer finger of the wing at the extremes of each attribute. All the other fingers scale up and down in relation to the pointer finger.

 

            
import maya.cmds as mc
T = True
F = False

#temporary shaders for the widgets
if not mc.objExists('rMat'):
    mc.shadingNode('lambert', n='rMat', asShader=T)
    mc.shadingNode('lambert', n='gMat', asShader=T)
    mc.shadingNode('lambert', n='bMat', asShader=T)
    mc.shadingNode('lambert', n='grayMat', asShader=T)

    mc.setAttr('rMat.color', 1, 0, 0, type='double3')
    mc.setAttr('gMat.color', 0, 1, 0, type='double3')
    mc.setAttr('bMat.color', 0, 0, 1, type='double3')
    mc.setAttr('grayMat.color', 0.5, 0.5, 0.5, type='double3')

#make gizmo chain
def makeGizmoChain(*args):
    #basic arrow shape
    mc.polyCylinder(name='gizmo01', sx=6, sy=3)
    mc.select('gizmo01.vtx[0:11]', r=T)
    mc.scale(0.5, 0.5, 0.5, r=T)
    mc.select('gizmo01.vtx[0:23]', r=T)
    mc.move(0, 0.5, 0, r=T, os=T, wd=T)
    mc.select('gizmo01.vtx[18:23]', r=T)
    mc.MergeToCenter()
    mc.move(0, 2.0, 0, r=T, os=T, wd=T)
    mc.select('gizmo01.vtx[6:11]', r=T)
    mc.move(0, 0.4, 0, r=T, os=T, wd=T)
    mc.select('gizmo01.vtx[6:18]', r=T)
    mc.move(0, 1.0, 0, r=T, os=T, wd=T)
    mc.polySoftEdge('gizmo01.e[18:35]', a=180, ch=T)
    mc.polySoftEdge('gizmo01.e[6:17]', a=0, ch=T)

    #make more of them
    mc.select('gizmo01', r=T)

    for i in xrange(0,2):
        if(i==0):
            mc.duplicate(rr=T)
            mc.rotate(0, 0, 90, r=T, eu=T)
    
        else:
            mc.select('gizmo01', r=T)
            mc.duplicate(rr=T)
            mc.rotate(90, 0, 0, r=T, eu=T)
    
    mc.select('gizmo01.vtx[6:18]', r=T)
    mc.move(0, 4.0, 0, r=T, os=T, wd=T)
    mc.polySphere(name='gizmo04', sh=3, sx=6, sy=6)
    mc.polySoftEdge('gizmo04.e[0:65]', a=180, ch=T)

    #color them
    mc.select('gizmo04', 'gizmo01', r=T)
    mc.hyperShade(a='rMat')
    mc.select('gizmo02', r=T)
    mc.hyperShade(a='gMat')
    mc.select('gizmo03', r=T)
    mc.hyperShade(a='bMat')

    #smoosh them together
    mc.polyUnite('gizmo01', 'gizmo02', 'gizmo03', 'gizmo04', n='gizmo')
    mc.rotate(0, 0, -90, os=T, r=T)
    mc.scale(0.15, 0.15, 0.15, r=T)
    mc.makeIdentity(a=T, t=1, r=1, s=1, n=2)
    firstGizmo = mc.duplicate(rr=T)
    mc.delete('gizmo', 'gizmo01', 'gizmo02', 'gizmo03', 'gizmo04')
    mc.polyCube(n='LWingUp', w=0.5, h=0.5, d=0.5)

    #make a chain of widgets with adjustable X rotation
    for i in xrange(1,21):
        if(i==1):
            mc.select(firstGizmo)
            mc.duplicate(rr=T)
            mc.move(7.0, 0.0, -1.5, r=T, os=T, wd=T)
        if(i==2):
            mc.select(firstGizmo)            
            mc.duplicate(rr=T)
            mc.move(12.0, 0.0, 0.0, r=T, os=T, wd=T)
        if(i==3):
            mc.select(firstGizmo)
            mc.duplicate(rr=T)
            mc.move(13.0, 0.0, 1.0, r=T, os=T, wd=T)
        if(i==4):
            mc.select(firstGizmo)
            mc.duplicate(rr=T)
            mc.move(13.0, 0.0, 2.0, r=T, os=T, wd=T)
        if(i==5):
            mc.select(firstGizmo)
            mc.duplicate(rr=T)
            mc.move(13.5, 0.0, 0.25, r=T, os=T, wd=T)
        if(i==6):
            mc.select(firstGizmo)
            mc.duplicate(rr=T)
            mc.move(17.0, 0.0, -1.5, r=T, os=T, wd=T)
        if(i==7):
            mc.select(firstGizmo)
            mc.duplicate(rr=T)
            mc.move(19.0, 0.0, -3.75, r=T, os=T, wd=T)
        if(i==8):
            mc.select(firstGizmo)
            mc.duplicate(rr=T)
            mc.move(21.0, 0.0, -6.25, r=T, os=T, wd=T)
        if(i==9):
            mc.select(firstGizmo)
            mc.duplicate(rr=T)
            mc.move(13.0, 0.0, 0.0, r=T, os=T, wd=T)
        if(i==10):
            mc.select(firstGizmo)
            mc.duplicate(rr=T)
            mc.move(15.5, 0.0, -3.0, r=T, os=T, wd=T)
        if(i==11):
            mc.select(firstGizmo)
            mc.duplicate(rr=T)
            mc.move(17.0, 0.0, -6.25, r=T, os=T, wd=T)
        if(i==12):
            mc.select(firstGizmo)
            mc.duplicate(rr=T)
            mc.move(18.0, 0.0, -9.0, r=T, os=T, wd=T)
        if(i==13):
            mc.select(firstGizmo)
            mc.duplicate(rr=T)
            mc.move(12.75, 0.0, -0.25, r=T, os=T, wd=T)
        if(i==14):
            mc.select(firstGizmo)
            mc.duplicate(rr=T)
            mc.move(13.5, 0.0, -4.0, r=T, os=T, wd=T)
        if(i==15):
            mc.select(firstGizmo)
            mc.duplicate(rr=T)
            mc.move(14.0, 0.0, -7.25, r=T, os=T, wd=T)
        if(i==16):
            mc.select(firstGizmo)
            mc.duplicate(rr=T)
            mc.move(14.25, 0.0, -10.25, r=T, os=T, wd=T)
        if(i==17):
            mc.select(firstGizmo)
            mc.duplicate(rr=T)
            mc.move(12.25, 0.0, -0.25, r=T, os=T, wd=T)
        if(i==18):
            mc.select(firstGizmo)
            mc.duplicate(rr=T)
            mc.move(11.5, 0.0, -4.0, r=T, os=T, wd=T)
        if(i==19):
            mc.select(firstGizmo)
            mc.duplicate(rr=T)
            mc.move(10.5, 0.0, -7.25, r=T, os=T, wd=T)
        if(i==20):
            mc.select(firstGizmo)
            mc.duplicate(rr=T)
            mc.move(9.25, 0.0, -10.0, r=T, os=T, wd=T)
        
    mc.select(firstGizmo)
    mc.move(2.0, 0.0, 0.0, r=T, os=T, wd=T)
    
    #movable wing     
    for i in xrange(1,5):
        mc.select('gizmo'+str(i+1), 'gizmo'+str(i))
        mc.aimConstraint(o=(0, 0, 0), w=1.0, aim=(1, 0 ,0), u=(0, 1, 0), wut='objectrotation', wuo='LWingUp', wu=(0, 1, 0))
        if(i==4):
            mc.select('gizmo'+str(i), 'gizmo'+str(i+1))
            mc.orientConstraint(o=(0, 0, 0), w=1)
    for i in xrange(6,9):
        mc.select('gizmo'+str(i+1), 'gizmo'+str(i))
        mc.aimConstraint(o=(0, 0, 0), w=1.0, aim=(1, 0 ,0), u=(0, 1, 0), wut='objectrotation', wuo='LWingUp', wu=(0, 1, 0))
        if(i==8):
            mc.select('gizmo'+str(i), 'gizmo'+str(i+1))
            mc.orientConstraint(o=(0, 0, 0), w=1)
    for i in xrange(10,13):
        mc.select('gizmo'+str(i+1), 'gizmo'+str(i))
        mc.aimConstraint(o=(0, 0, 0), w=1.0, aim=(1, 0 ,0), u=(0, 1, 0), wut='objectrotation', wuo='LWingUp', wu=(0, 1, 0))
        if(i==12):
            mc.select('gizmo'+str(i), 'gizmo'+str(i+1))
            mc.orientConstraint(o=(0, 0, 0), w=1)
    for i in xrange(14,17):
        mc.select('gizmo'+str(i+1), 'gizmo'+str(i))
        mc.aimConstraint(o=(0, 0, 0), w=1.0, aim=(1, 0 ,0), u=(0, 1, 0), wut='objectrotation', wuo='LWingUp', wu=(0, 1, 0))
        if(i==16):
            mc.select('gizmo'+str(i), 'gizmo'+str(i+1))
            mc.orientConstraint(o=(0, 0, 0), w=1)
    for i in xrange(18,21):
        mc.select('gizmo'+str(i+1), 'gizmo'+str(i))
        mc.aimConstraint(o=(0, 0, 0), w=1.0, aim=(1, 0 ,0), u=(0, 1, 0), wut='objectrotation', wuo='LWingUp', wu=(0, 1, 0))
        if(i==20):
            mc.select('gizmo'+str(i), 'gizmo'+str(i+1))
            mc.orientConstraint(o=(0, 0, 0), w=1)
    rootGizmoPos = []
    gizmoPosL = mc.xform('gizmo1', q=T, ws=T, t=T)
    rootGizmoPos.append([gizmoPosL[0], gizmoPosL[1], gizmoPosL[2]])
    mc.move(rootGizmoPos[0][0], rootGizmoPos[0][1], rootGizmoPos[0][2], 'LWingUp', a=T)
    mc.parent('gizmo1', 'gizmo2', 'gizmo3', 'gizmo4', 'gizmo5', 'gizmo6', 'gizmo7', 'gizmo8', 'gizmo9', 'gizmo10', 'gizmo11', 'gizmo12', 'gizmo13', 'gizmo14', 'gizmo15', 'gizmo16', 'gizmo17', 'gizmo18', 'gizmo19', 'gizmo20', 'gizmo21', 'LWingUp')
    mc.select(cl=T)
    
def makeJointChain(*args):
    #get values from sliders
    bendVal = mc.floatSliderGrp('bendSldr', q=T, v=T)
    curlVal = mc.floatSliderGrp('curlSldr', q=T, v=T)
    foldVal = mc.floatSliderGrp('foldSldr', q=T, v=T)
    #get all gizmo positions
    allGizmoPos = []
    for i in xrange(1,22):
        currentGizmo = mc.getAttr('gizmo'+str(i)+'.wm')
        allGizmoPos.append([currentGizmo[12], currentGizmo[13], currentGizmo[14]])
    mc.select(cl=T)
    #arm bones
    mc.select(cl=T)
    armBones = []
    for i in xrange(1,6):
        currentJoint = mc.joint(p=(allGizmoPos[i-1][0], allGizmoPos[i-1][1], allGizmoPos[i-1][2]))
        armBones.append(currentJoint)    
    for i in xrange(0,5):
        mc.joint(armBones[i], e=True, zso=True, oj='xyz', sao='yup')        
    #pointer finger
    mc.select(cl=T)        
    poFinger = []
    for i in xrange(6,10):
        currentJoint = mc.joint(p=(allGizmoPos[i-1][0], allGizmoPos[i-1][1], allGizmoPos[i-1][2]))
        poFinger.append(currentJoint)
    for i in xrange(0,4):
        mc.joint(poFinger[i], e=True, zso=True, oj='xyz', sao='yup')    
    #middle finger
    mc.select(cl=T)        
    miFinger = []
    for i in xrange(10,14):
        currentJoint = mc.joint(p=(allGizmoPos[i-1][0], allGizmoPos[i-1][1], allGizmoPos[i-1][2]))
        miFinger.append(currentJoint)
    for i in xrange(0,4):
        mc.joint(miFinger[i], e=True, zso=True, oj='xyz', sao='yup')
    #ring finger
    mc.select(cl=T)   
    riFinger = []
    for i in xrange(14,18):
        currentJoint = mc.joint(p=(allGizmoPos[i-1][0], allGizmoPos[i-1][1], allGizmoPos[i-1][2]))
        riFinger.append(currentJoint)
    for i in xrange(0,4):
        mc.joint(riFinger[i], e=True, zso=True, oj='xyz', sao='yup')
    #pinky finger
    mc.select(cl=T) 
    piFinger = []
    for i in xrange(18,22):
        currentJoint = mc.joint(p=(allGizmoPos[i-1][0], allGizmoPos[i-1][1], allGizmoPos[i-1][2]))
        piFinger.append(currentJoint)
    for i in xrange(0,4):
        mc.joint(piFinger[i], e=True, zso=True, oj='xyz', sao='yup')        
    
    #orient the bones
    for i in xrange(1,6):
        mc.select('gizmo'+str(i), armBones[i-1])
        mc.orientConstraint(o=(0, 0, 0), w=1)
    for i in xrange(6,10):
        mc.select('gizmo'+str(i), poFinger[i-6])
        mc.orientConstraint(o=(0, 0, 0), w=1) 
    for i in xrange(10,14):
        mc.select('gizmo'+str(i), miFinger[i-10])
        mc.orientConstraint(o=(0, 0, 0), w=1)
    for i in xrange(14,18):
        mc.select('gizmo'+str(i), riFinger[i-14])
        mc.orientConstraint(o=(0, 0, 0), w=1)
    for i in xrange(18,22):
        mc.select('gizmo'+str(i), piFinger[i-18])
        mc.orientConstraint(o=(0, 0, 0), w=1)
    #cleanup
    mc.delete('LWingUp')
    for i in xrange(1,6):
        mc.select(armBones[i-1])    
        mc.makeIdentity(a=T, t=1, r=1, s=1, n=2)
    for i in xrange(6,10):
        mc.select(poFinger[i-6])    
        mc.makeIdentity(a=T, t=1, r=1, s=1, n=2)
    for i in xrange(10,14):
        mc.select(miFinger[i-10])    
        mc.makeIdentity(a=T, t=1, r=1, s=1, n=2)
    for i in xrange(14,18):
        mc.select(riFinger[i-14])    
        mc.makeIdentity(a=T, t=1, r=1, s=1, n=2)
    for i in xrange(18,22):
        mc.select(piFinger[i-18])    
        mc.makeIdentity(a=T, t=1, r=1, s=1, n=2)
    mc.select(cl=T)
    mc.parent(poFinger[0], miFinger[0], riFinger[0], piFinger[0], armBones[2])
    mc.select(cl=T)
    #add custom attributes
    mc.addAttr(armBones[2], ln='bend', nn='Bend', at='double', min=-50, max=50, dv=0)
    mc.setAttr(armBones[2]+'.bend', e=T, k=T)
    mc.addAttr(armBones[2], ln='curl', nn='Curl', at='double', min=-50, max=50, dv=0)
    mc.setAttr(armBones[2]+'.curl', e=T, k=T)
    mc.addAttr(armBones[2], ln='fold', nn='Fold', at='double', min=-50, max=50, dv=0)
    mc.setAttr(armBones[2]+'.fold', e=T, k=T)
    #mirror the joints
    mc.select(armBones[0])
    mirArmBones = (mc.mirrorJoint(myz=T, mb=T))
    mirPoFinger = []
    mirMiFinger = []
    mirRiFinger = []
    mirPiFinger = []
    for i in xrange(5,8):
        mirPoFinger.append(mirArmBones[i])
    for i in xrange(9,12):
        mirMiFinger.append(mirArmBones[i])
    for i in xrange(13,16):
        mirRiFinger.append(mirArmBones[i])
    for i in xrange(17,20):
        mirPiFinger.append(mirArmBones[i])

#driven keyframes
#==============|
#BEND attribute|
#==============|
#zeroed out
    #set pointer finger
    mc.setDrivenKeyframe(poFinger[0]+'.rz' ,cd=armBones[2]+'.bend')
    mc.setDrivenKeyframe(mirPoFinger[0]+'.rz' ,cd=mirArmBones[2]+'.bend')
    mc.setDrivenKeyframe(poFinger[1]+'.rz' ,cd=armBones[2]+'.bend')
    mc.setDrivenKeyframe(mirPoFinger[1]+'.rz' ,cd=mirArmBones[2]+'.bend')
    mc.setDrivenKeyframe(poFinger[2]+'.rz' ,cd=armBones[2]+'.bend')
    mc.setDrivenKeyframe(mirPoFinger[2]+'.rz' ,cd=mirArmBones[2]+'.bend')
    #set middle finger
    mc.setDrivenKeyframe(miFinger[0]+'.rz' ,cd=armBones[2]+'.bend')
    mc.setDrivenKeyframe(mirMiFinger[0]+'.rz' ,cd=mirArmBones[2]+'.bend')
    mc.setDrivenKeyframe(miFinger[1]+'.rz' ,cd=armBones[2]+'.bend')
    mc.setDrivenKeyframe(mirMiFinger[1]+'.rz' ,cd=mirArmBones[2]+'.bend')
    mc.setDrivenKeyframe(miFinger[2]+'.rz' ,cd=armBones[2]+'.bend')
    mc.setDrivenKeyframe(mirMiFinger[2]+'.rz' ,cd=mirArmBones[2]+'.bend')
    #set ring finger
    mc.setDrivenKeyframe(riFinger[0]+'.rz' ,cd=armBones[2]+'.bend')
    mc.setDrivenKeyframe(mirRiFinger[0]+'.rz' ,cd=mirArmBones[2]+'.bend')
    mc.setDrivenKeyframe(riFinger[1]+'.rz' ,cd=armBones[2]+'.bend')
    mc.setDrivenKeyframe(mirRiFinger[1]+'.rz' ,cd=mirArmBones[2]+'.bend')
    mc.setDrivenKeyframe(riFinger[2]+'.rz' ,cd=armBones[2]+'.bend')
    mc.setDrivenKeyframe(mirRiFinger[2]+'.rz' ,cd=mirArmBones[2]+'.bend')
    #set pinky finger
    mc.setDrivenKeyframe(piFinger[0]+'.rz' ,cd=armBones[2]+'.bend')
    mc.setDrivenKeyframe(mirPiFinger[0]+'.rz' ,cd=mirArmBones[2]+'.bend')
    mc.setDrivenKeyframe(piFinger[1]+'.rz' ,cd=armBones[2]+'.bend')
    mc.setDrivenKeyframe(mirPiFinger[1]+'.rz' ,cd=mirArmBones[2]+'.bend')
    mc.setDrivenKeyframe(piFinger[2]+'.rz' ,cd=armBones[2]+'.bend')
    mc.setDrivenKeyframe(mirPiFinger[2]+'.rz' ,cd=mirArmBones[2]+'.bend')

#////////////////////////////////////////////////////////////////////////////////////////////////////////////
#max upwards
    mc.setAttr(armBones[2]+'.bend', 50.0)
    mc.setAttr(mirArmBones[2]+'.bend', 50.0)
    #adjust pointer finger
    mc.setAttr(poFinger[0]+'.rz', bendVal)
    mc.setAttr(mirPoFinger[0]+'.rz', bendVal)
    mc.setAttr(poFinger[1]+'.rz', bendVal)
    mc.setAttr(mirPoFinger[1]+'.rz', bendVal)
    mc.setAttr(poFinger[2]+'.rz', bendVal)
    mc.setAttr(mirPoFinger[2]+'.rz', bendVal)
    #adjust middle finger
    mc.setAttr(miFinger[0]+'.rz', bendVal)
    mc.setAttr(mirMiFinger[0]+'.rz', bendVal)
    mc.setAttr(miFinger[1]+'.rz', bendVal)
    mc.setAttr(mirMiFinger[1]+'.rz', bendVal)
    mc.setAttr(miFinger[2]+'.rz', bendVal)
    mc.setAttr(mirMiFinger[2]+'.rz', bendVal)
    #adjust ring finger
    mc.setAttr(riFinger[0]+'.rz', bendVal)
    mc.setAttr(mirRiFinger[0]+'.rz', bendVal)
    mc.setAttr(riFinger[1]+'.rz', bendVal)
    mc.setAttr(mirRiFinger[1]+'.rz', bendVal)
    mc.setAttr(riFinger[2]+'.rz', bendVal)
    mc.setAttr(mirRiFinger[2]+'.rz', bendVal)
    #adjust pinky finger
    mc.setAttr(piFinger[0]+'.rz', bendVal)
    mc.setAttr(mirPiFinger[0]+'.rz', bendVal)
    mc.setAttr(piFinger[1]+'.rz', bendVal)
    mc.setAttr(mirPiFinger[1]+'.rz', bendVal)
    mc.setAttr(piFinger[2]+'.rz', bendVal)
    mc.setAttr(mirPiFinger[2]+'.rz', bendVal)
    #set pointer finger
    mc.setDrivenKeyframe(poFinger[0]+'.rz' ,cd=armBones[2]+'.bend')
    mc.setDrivenKeyframe(mirPoFinger[0]+'.rz' ,cd=mirArmBones[2]+'.bend')
    mc.setDrivenKeyframe(poFinger[1]+'.rz' ,cd=armBones[2]+'.bend')
    mc.setDrivenKeyframe(mirPoFinger[1]+'.rz' ,cd=mirArmBones[2]+'.bend')
    mc.setDrivenKeyframe(poFinger[2]+'.rz' ,cd=armBones[2]+'.bend')
    mc.setDrivenKeyframe(mirPoFinger[2]+'.rz' ,cd=mirArmBones[2]+'.bend')
    #set middle finger
    mc.setDrivenKeyframe(miFinger[0]+'.rz' ,cd=armBones[2]+'.bend')
    mc.setDrivenKeyframe(mirMiFinger[0]+'.rz' ,cd=mirArmBones[2]+'.bend')
    mc.setDrivenKeyframe(miFinger[1]+'.rz' ,cd=armBones[2]+'.bend')
    mc.setDrivenKeyframe(mirMiFinger[1]+'.rz' ,cd=mirArmBones[2]+'.bend')
    mc.setDrivenKeyframe(miFinger[2]+'.rz' ,cd=armBones[2]+'.bend')
    mc.setDrivenKeyframe(mirMiFinger[2]+'.rz' ,cd=mirArmBones[2]+'.bend')
    #set ring finger
    mc.setDrivenKeyframe(riFinger[0]+'.rz' ,cd=armBones[2]+'.bend')
    mc.setDrivenKeyframe(mirRiFinger[0]+'.rz' ,cd=mirArmBones[2]+'.bend')
    mc.setDrivenKeyframe(riFinger[1]+'.rz' ,cd=armBones[2]+'.bend')
    mc.setDrivenKeyframe(mirRiFinger[1]+'.rz' ,cd=mirArmBones[2]+'.bend')
    mc.setDrivenKeyframe(riFinger[2]+'.rz' ,cd=armBones[2]+'.bend')
    mc.setDrivenKeyframe(mirRiFinger[2]+'.rz' ,cd=mirArmBones[2]+'.bend')
    #set pinky finger
    mc.setDrivenKeyframe(piFinger[0]+'.rz' ,cd=armBones[2]+'.bend')
    mc.setDrivenKeyframe(mirPiFinger[0]+'.rz' ,cd=mirArmBones[2]+'.bend')
    mc.setDrivenKeyframe(piFinger[1]+'.rz' ,cd=armBones[2]+'.bend')
    mc.setDrivenKeyframe(mirPiFinger[1]+'.rz' ,cd=mirArmBones[2]+'.bend')
    mc.setDrivenKeyframe(piFinger[2]+'.rz' ,cd=armBones[2]+'.bend')
    mc.setDrivenKeyframe(mirPiFinger[2]+'.rz' ,cd=mirArmBones[2]+'.bend')
    mc.setAttr(armBones[2]+'.bend', 0.0)
    mc.setAttr(mirArmBones[2]+'.bend', 0.0)

#////////////////////////////////////////////////////////////////////////////////////////////////////////////    
#max downwards
    mc.setAttr(armBones[2]+'.bend', -50.0)
    mc.setAttr(mirArmBones[2]+'.bend', -50.0)
    #adjust pointer finger
    mc.setAttr(poFinger[0]+'.rz', -bendVal)
    mc.setAttr(mirPoFinger[0]+'.rz', -bendVal)
    mc.setAttr(poFinger[1]+'.rz', -bendVal)
    mc.setAttr(mirPoFinger[1]+'.rz', -bendVal)
    mc.setAttr(poFinger[2]+'.rz', -bendVal)
    mc.setAttr(mirPoFinger[2]+'.rz', -bendVal)
    #adjust middle finger
    mc.setAttr(miFinger[0]+'.rz', -bendVal)
    mc.setAttr(mirMiFinger[0]+'.rz', -bendVal)
    mc.setAttr(miFinger[1]+'.rz', -bendVal)
    mc.setAttr(mirMiFinger[1]+'.rz', -bendVal)
    mc.setAttr(miFinger[2]+'.rz', -bendVal)
    mc.setAttr(mirMiFinger[2]+'.rz', -bendVal)
    #adjust ring finger
    mc.setAttr(riFinger[0]+'.rz', -bendVal)
    mc.setAttr(mirRiFinger[0]+'.rz', -bendVal)
    mc.setAttr(riFinger[1]+'.rz', -bendVal)
    mc.setAttr(mirRiFinger[1]+'.rz', -bendVal)
    mc.setAttr(riFinger[2]+'.rz', -bendVal)
    mc.setAttr(mirRiFinger[2]+'.rz', -bendVal)
    #adjust pinky finger
    mc.setAttr(piFinger[0]+'.rz', -bendVal)
    mc.setAttr(mirPiFinger[0]+'.rz', -bendVal)
    mc.setAttr(piFinger[1]+'.rz', -bendVal)
    mc.setAttr(mirPiFinger[1]+'.rz', -bendVal)
    mc.setAttr(piFinger[2]+'.rz', -bendVal)
    mc.setAttr(mirPiFinger[2]+'.rz', -bendVal)
    #set pointer finger
    mc.setDrivenKeyframe(poFinger[0]+'.rz' ,cd=armBones[2]+'.bend')
    mc.setDrivenKeyframe(mirPoFinger[0]+'.rz' ,cd=mirArmBones[2]+'.bend')
    mc.setDrivenKeyframe(poFinger[1]+'.rz' ,cd=armBones[2]+'.bend')
    mc.setDrivenKeyframe(mirPoFinger[1]+'.rz' ,cd=mirArmBones[2]+'.bend')
    mc.setDrivenKeyframe(poFinger[2]+'.rz' ,cd=armBones[2]+'.bend')
    mc.setDrivenKeyframe(mirPoFinger[2]+'.rz' ,cd=mirArmBones[2]+'.bend')
    #set middle finger
    mc.setDrivenKeyframe(miFinger[0]+'.rz' ,cd=armBones[2]+'.bend')
    mc.setDrivenKeyframe(mirMiFinger[0]+'.rz' ,cd=mirArmBones[2]+'.bend')
    mc.setDrivenKeyframe(miFinger[1]+'.rz' ,cd=armBones[2]+'.bend')
    mc.setDrivenKeyframe(mirMiFinger[1]+'.rz' ,cd=mirArmBones[2]+'.bend')
    mc.setDrivenKeyframe(miFinger[2]+'.rz' ,cd=armBones[2]+'.bend')
    mc.setDrivenKeyframe(mirMiFinger[2]+'.rz' ,cd=mirArmBones[2]+'.bend')
    #set ring finger
    mc.setDrivenKeyframe(riFinger[0]+'.rz' ,cd=armBones[2]+'.bend')
    mc.setDrivenKeyframe(mirRiFinger[0]+'.rz' ,cd=mirArmBones[2]+'.bend')
    mc.setDrivenKeyframe(riFinger[1]+'.rz' ,cd=armBones[2]+'.bend')
    mc.setDrivenKeyframe(mirRiFinger[1]+'.rz' ,cd=mirArmBones[2]+'.bend')
    mc.setDrivenKeyframe(riFinger[2]+'.rz' ,cd=armBones[2]+'.bend')
    mc.setDrivenKeyframe(mirRiFinger[2]+'.rz' ,cd=mirArmBones[2]+'.bend')
    #set pinky finger
    mc.setDrivenKeyframe(piFinger[0]+'.rz' ,cd=armBones[2]+'.bend')
    mc.setDrivenKeyframe(mirPiFinger[0]+'.rz' ,cd=mirArmBones[2]+'.bend')
    mc.setDrivenKeyframe(piFinger[1]+'.rz' ,cd=armBones[2]+'.bend')
    mc.setDrivenKeyframe(mirPiFinger[1]+'.rz' ,cd=mirArmBones[2]+'.bend')
    mc.setDrivenKeyframe(piFinger[2]+'.rz' ,cd=armBones[2]+'.bend')
    mc.setDrivenKeyframe(mirPiFinger[2]+'.rz' ,cd=mirArmBones[2]+'.bend')
    mc.setAttr(armBones[2]+'.bend', 0.0)
    mc.setAttr(mirArmBones[2]+'.bend', 0.0)

#==============|
#CURL attribute|
#==============|
#zeroed out
    #set pointer finger
    mc.setDrivenKeyframe(poFinger[0]+'.rz' ,cd=armBones[2]+'.curl')
    mc.setDrivenKeyframe(mirPoFinger[0]+'.rz' ,cd=mirArmBones[2]+'.curl')
    mc.setDrivenKeyframe(poFinger[1]+'.rz' ,cd=armBones[2]+'.curl')
    mc.setDrivenKeyframe(mirPoFinger[1]+'.rz' ,cd=mirArmBones[2]+'.curl')
    mc.setDrivenKeyframe(poFinger[2]+'.rz' ,cd=armBones[2]+'.curl')
    mc.setDrivenKeyframe(mirPoFinger[2]+'.rz' ,cd=mirArmBones[2]+'.curl')
    #set middle finger
    mc.setDrivenKeyframe(miFinger[0]+'.rz' ,cd=armBones[2]+'.curl')
    mc.setDrivenKeyframe(mirMiFinger[0]+'.rz' ,cd=mirArmBones[2]+'.curl')
    mc.setDrivenKeyframe(miFinger[1]+'.rz' ,cd=armBones[2]+'.curl')
    mc.setDrivenKeyframe(mirMiFinger[1]+'.rz' ,cd=mirArmBones[2]+'.curl')
    mc.setDrivenKeyframe(miFinger[2]+'.rz' ,cd=armBones[2]+'.curl')
    mc.setDrivenKeyframe(mirMiFinger[2]+'.rz' ,cd=mirArmBones[2]+'.curl')
    #set ring finger
    mc.setDrivenKeyframe(riFinger[0]+'.rz' ,cd=armBones[2]+'.curl')
    mc.setDrivenKeyframe(mirRiFinger[0]+'.rz' ,cd=mirArmBones[2]+'.curl')
    mc.setDrivenKeyframe(riFinger[1]+'.rz' ,cd=armBones[2]+'.curl')
    mc.setDrivenKeyframe(mirRiFinger[1]+'.rz' ,cd=mirArmBones[2]+'.curl')
    mc.setDrivenKeyframe(riFinger[2]+'.rz' ,cd=armBones[2]+'.curl')
    mc.setDrivenKeyframe(mirRiFinger[2]+'.rz' ,cd=mirArmBones[2]+'.curl')
    #set pinky finger
    mc.setDrivenKeyframe(piFinger[0]+'.rz' ,cd=armBones[2]+'.curl')
    mc.setDrivenKeyframe(mirPiFinger[0]+'.rz' ,cd=mirArmBones[2]+'.curl')
    mc.setDrivenKeyframe(piFinger[1]+'.rz' ,cd=armBones[2]+'.curl')
    mc.setDrivenKeyframe(mirPiFinger[1]+'.rz' ,cd=mirArmBones[2]+'.curl')
    mc.setDrivenKeyframe(piFinger[2]+'.rz' ,cd=armBones[2]+'.curl')
    mc.setDrivenKeyframe(mirPiFinger[2]+'.rz' ,cd=mirArmBones[2]+'.curl')

#////////////////////////////////////////////////////////////////////////////////////////////////////////////
#max upwards
    mc.setAttr(armBones[2]+'.curl', 50.0)
    mc.setAttr(mirArmBones[2]+'.curl', 50.0)
    #adjust pointer finger
    mc.setAttr(poFinger[0]+'.rz', curlVal)
    mc.setAttr(mirPoFinger[0]+'.rz', curlVal)
    mc.setAttr(poFinger[1]+'.rz', curlVal)
    mc.setAttr(mirPoFinger[1]+'.rz', curlVal)
    mc.setAttr(poFinger[2]+'.rz', curlVal)
    mc.setAttr(mirPoFinger[2]+'.rz', curlVal)
    #adjust middle finger
    mc.setAttr(miFinger[0]+'.rz', (curlVal*0.5))
    mc.setAttr(mirMiFinger[0]+'.rz', (curlVal*0.5))
    mc.setAttr(miFinger[1]+'.rz', (curlVal*0.5))
    mc.setAttr(mirMiFinger[1]+'.rz', (curlVal*0.5))
    mc.setAttr(miFinger[2]+'.rz', (curlVal*0.5))
    mc.setAttr(mirMiFinger[2]+'.rz', (curlVal*0.5))
    #adjust ring finger
    mc.setAttr(riFinger[0]+'.rz', 0.0)
    mc.setAttr(mirRiFinger[0]+'.rz', 0.0)
    mc.setAttr(riFinger[1]+'.rz', (curlVal*0.25))
    mc.setAttr(mirRiFinger[1]+'.rz', (curlVal*0.25))
    mc.setAttr(riFinger[2]+'.rz', (curlVal*0.25))
    mc.setAttr(mirRiFinger[2]+'.rz', (curlVal*0.25))
    #adjust pinky finger
    mc.setAttr(piFinger[0]+'.rz', (curlVal*-0.25))
    mc.setAttr(mirPiFinger[0]+'.rz', (curlVal*-0.25))
    mc.setAttr(piFinger[1]+'.rz', (curlVal*0.25))
    mc.setAttr(mirPiFinger[1]+'.rz', (curlVal*0.25))
    mc.setAttr(piFinger[2]+'.rz', (curlVal*0.25))
    mc.setAttr(mirPiFinger[2]+'.rz', (curlVal*0.25))
    #set pointer finger
    mc.setDrivenKeyframe(poFinger[0]+'.rz' ,cd=armBones[2]+'.curl')
    mc.setDrivenKeyframe(mirPoFinger[0]+'.rz' ,cd=mirArmBones[2]+'.curl')
    mc.setDrivenKeyframe(poFinger[1]+'.rz' ,cd=armBones[2]+'.curl')
    mc.setDrivenKeyframe(mirPoFinger[1]+'.rz' ,cd=mirArmBones[2]+'.curl')
    mc.setDrivenKeyframe(poFinger[2]+'.rz' ,cd=armBones[2]+'.curl')
    mc.setDrivenKeyframe(mirPoFinger[2]+'.rz' ,cd=mirArmBones[2]+'.curl')
    #set middle finger
    mc.setDrivenKeyframe(miFinger[0]+'.rz' ,cd=armBones[2]+'.curl')
    mc.setDrivenKeyframe(mirMiFinger[0]+'.rz' ,cd=mirArmBones[2]+'.curl')
    mc.setDrivenKeyframe(miFinger[1]+'.rz' ,cd=armBones[2]+'.curl')
    mc.setDrivenKeyframe(mirMiFinger[1]+'.rz' ,cd=mirArmBones[2]+'.curl')
    mc.setDrivenKeyframe(miFinger[2]+'.rz' ,cd=armBones[2]+'.curl')
    mc.setDrivenKeyframe(mirMiFinger[2]+'.rz' ,cd=mirArmBones[2]+'.curl')
    #set ring finger
    mc.setDrivenKeyframe(riFinger[0]+'.rz' ,cd=armBones[2]+'.curl')
    mc.setDrivenKeyframe(mirRiFinger[0]+'.rz' ,cd=mirArmBones[2]+'.curl')
    mc.setDrivenKeyframe(riFinger[1]+'.rz' ,cd=armBones[2]+'.curl')
    mc.setDrivenKeyframe(mirRiFinger[1]+'.rz' ,cd=mirArmBones[2]+'.curl')
    mc.setDrivenKeyframe(riFinger[2]+'.rz' ,cd=armBones[2]+'.curl')
    mc.setDrivenKeyframe(mirRiFinger[2]+'.rz' ,cd=mirArmBones[2]+'.curl')
    #set pinky finger
    mc.setDrivenKeyframe(piFinger[0]+'.rz' ,cd=armBones[2]+'.curl')
    mc.setDrivenKeyframe(mirPiFinger[0]+'.rz' ,cd=mirArmBones[2]+'.curl')
    mc.setDrivenKeyframe(piFinger[1]+'.rz' ,cd=armBones[2]+'.curl')
    mc.setDrivenKeyframe(mirPiFinger[1]+'.rz' ,cd=mirArmBones[2]+'.curl')
    mc.setDrivenKeyframe(piFinger[2]+'.rz' ,cd=armBones[2]+'.curl')
    mc.setDrivenKeyframe(mirPiFinger[2]+'.rz' ,cd=mirArmBones[2]+'.curl')
    mc.setAttr(armBones[2]+'.curl', 0.0)
    mc.setAttr(mirArmBones[2]+'.curl', 0.0)

#////////////////////////////////////////////////////////////////////////////////////////////////////////////    
#max downwards
    mc.setAttr(armBones[2]+'.curl', -50.0)
    mc.setAttr(mirArmBones[2]+'.curl', -50.0)
    #adjust pointer finger
    mc.setAttr(poFinger[0]+'.rz', -curlVal)
    mc.setAttr(mirPoFinger[0]+'.rz', -curlVal)
    mc.setAttr(poFinger[1]+'.rz', -curlVal)
    mc.setAttr(mirPoFinger[1]+'.rz', -curlVal)
    mc.setAttr(poFinger[2]+'.rz', -curlVal)
    mc.setAttr(mirPoFinger[2]+'.rz', -curlVal)
    #adjust middle finger
    mc.setAttr(miFinger[0]+'.rz', (curlVal*-0.5))
    mc.setAttr(mirMiFinger[0]+'.rz', (curlVal*-0.5))
    mc.setAttr(miFinger[1]+'.rz', (curlVal*-0.5))
    mc.setAttr(mirMiFinger[1]+'.rz', (curlVal*-0.5))
    mc.setAttr(miFinger[2]+'.rz', (curlVal*-0.5))
    mc.setAttr(mirMiFinger[2]+'.rz', (curlVal*-0.5))
    #adjust ring finger
    mc.setAttr(riFinger[0]+'.rz', 0.0)
    mc.setAttr(mirRiFinger[0]+'.rz', 0.0)
    mc.setAttr(riFinger[1]+'.rz', (curlVal*-0.25))
    mc.setAttr(mirRiFinger[1]+'.rz', (curlVal*-0.25))
    mc.setAttr(riFinger[2]+'.rz', (curlVal*-0.25))
    mc.setAttr(mirRiFinger[2]+'.rz', (curlVal*-0.25))
    #adjust pinky finger
    mc.setAttr(piFinger[0]+'.rz', (curlVal*0.25))
    mc.setAttr(mirPiFinger[0]+'.rz', (curlVal*0.25))
    mc.setAttr(piFinger[1]+'.rz', (curlVal*-0.25))
    mc.setAttr(mirPiFinger[1]+'.rz', (curlVal*-0.25))
    mc.setAttr(piFinger[2]+'.rz', (curlVal*-0.25))
    mc.setAttr(mirPiFinger[2]+'.rz', (curlVal*-0.25))
    #set pointer finger
    mc.setDrivenKeyframe(poFinger[0]+'.rz' ,cd=armBones[2]+'.curl')
    mc.setDrivenKeyframe(mirPoFinger[0]+'.rz' ,cd=mirArmBones[2]+'.curl')
    mc.setDrivenKeyframe(poFinger[1]+'.rz' ,cd=armBones[2]+'.curl')
    mc.setDrivenKeyframe(mirPoFinger[1]+'.rz' ,cd=mirArmBones[2]+'.curl')
    mc.setDrivenKeyframe(poFinger[2]+'.rz' ,cd=armBones[2]+'.curl')
    mc.setDrivenKeyframe(mirPoFinger[2]+'.rz' ,cd=mirArmBones[2]+'.curl')
    #set middle finger
    mc.setDrivenKeyframe(miFinger[0]+'.rz' ,cd=armBones[2]+'.curl')
    mc.setDrivenKeyframe(mirMiFinger[0]+'.rz' ,cd=mirArmBones[2]+'.curl')
    mc.setDrivenKeyframe(miFinger[1]+'.rz' ,cd=armBones[2]+'.curl')
    mc.setDrivenKeyframe(mirMiFinger[1]+'.rz' ,cd=mirArmBones[2]+'.curl')
    mc.setDrivenKeyframe(miFinger[2]+'.rz' ,cd=armBones[2]+'.curl')
    mc.setDrivenKeyframe(mirMiFinger[2]+'.rz' ,cd=mirArmBones[2]+'.curl')
    #set ring finger
    mc.setDrivenKeyframe(riFinger[0]+'.rz' ,cd=armBones[2]+'.curl')
    mc.setDrivenKeyframe(mirRiFinger[0]+'.rz' ,cd=mirArmBones[2]+'.curl')
    mc.setDrivenKeyframe(riFinger[1]+'.rz' ,cd=armBones[2]+'.curl')
    mc.setDrivenKeyframe(mirRiFinger[1]+'.rz' ,cd=mirArmBones[2]+'.curl')
    mc.setDrivenKeyframe(riFinger[2]+'.rz' ,cd=armBones[2]+'.curl')
    mc.setDrivenKeyframe(mirRiFinger[2]+'.rz' ,cd=mirArmBones[2]+'.curl')
    #set pinky finger
    mc.setDrivenKeyframe(piFinger[0]+'.rz' ,cd=armBones[2]+'.curl')
    mc.setDrivenKeyframe(mirPiFinger[0]+'.rz' ,cd=mirArmBones[2]+'.curl')
    mc.setDrivenKeyframe(piFinger[1]+'.rz' ,cd=armBones[2]+'.curl')
    mc.setDrivenKeyframe(mirPiFinger[1]+'.rz' ,cd=mirArmBones[2]+'.curl')
    mc.setDrivenKeyframe(piFinger[2]+'.rz' ,cd=armBones[2]+'.curl')
    mc.setDrivenKeyframe(mirPiFinger[2]+'.rz' ,cd=mirArmBones[2]+'.curl')
    mc.setAttr(armBones[2]+'.curl', 0.0)
    mc.setAttr(mirArmBones[2]+'.curl', 0.0)

#==============|
#FOLD attribute|
#==============|
#zeroed out
    #set pointer finger
    mc.setDrivenKeyframe(poFinger[0]+'.ry' ,cd=armBones[2]+'.fold')
    mc.setDrivenKeyframe(mirPoFinger[0]+'.ry' ,cd=mirArmBones[2]+'.fold')
    #set middle finger
    mc.setDrivenKeyframe(miFinger[0]+'.ry' ,cd=armBones[2]+'.fold')
    mc.setDrivenKeyframe(mirMiFinger[0]+'.ry' ,cd=mirArmBones[2]+'.fold')
    #set ring finger
    mc.setDrivenKeyframe(riFinger[0]+'.ry' ,cd=armBones[2]+'.fold')
    mc.setDrivenKeyframe(mirRiFinger[0]+'.ry' ,cd=mirArmBones[2]+'.fold')
    #set pinky finger
    mc.setDrivenKeyframe(piFinger[0]+'.ry' ,cd=armBones[2]+'.fold')
    mc.setDrivenKeyframe(mirPiFinger[0]+'.ry' ,cd=mirArmBones[2]+'.fold')
    
#////////////////////////////////////////////////////////////////////////////////////////////////////////////
#unfolded
    mc.setAttr(armBones[2]+'.fold', 50.0)
    mc.setAttr(mirArmBones[2]+'.fold', 50.0)
    #adjust pointer finger
    mc.setAttr(poFinger[0]+'.ry', (foldVal*-0.357))
    mc.setAttr(mirPoFinger[0]+'.ry', (foldVal*-0.357))
    #adjust middle finger
    mc.setAttr(miFinger[0]+'.ry', (foldVal*-0.286))
    mc.setAttr(mirMiFinger[0]+'.ry', (foldVal*-0.286))
    #adjust ring finger
    mc.setAttr(riFinger[0]+'.ry', (foldVal*-0.214))
    mc.setAttr(mirRiFinger[0]+'.ry', (foldVal*-0.214))
    #adjust pinky finger
    mc.setAttr(piFinger[0]+'.ry', (foldVal*-0.143))
    mc.setAttr(mirPiFinger[0]+'.ry', (foldVal*-0.143))
    #set pointer finger
    mc.setDrivenKeyframe(poFinger[0]+'.ry' ,cd=armBones[2]+'.fold')
    mc.setDrivenKeyframe(mirPoFinger[0]+'.ry' ,cd=mirArmBones[2]+'.fold')
    #set middle finger
    mc.setDrivenKeyframe(miFinger[0]+'.ry' ,cd=armBones[2]+'.fold')
    mc.setDrivenKeyframe(mirMiFinger[0]+'.ry' ,cd=mirArmBones[2]+'.fold')
    #set ring finger
    mc.setDrivenKeyframe(riFinger[0]+'.ry' ,cd=armBones[2]+'.fold')
    mc.setDrivenKeyframe(mirRiFinger[0]+'.ry' ,cd=mirArmBones[2]+'.fold')
    #set pinky finger
    mc.setDrivenKeyframe(piFinger[0]+'.ry' ,cd=armBones[2]+'.fold')
    mc.setDrivenKeyframe(mirPiFinger[0]+'.ry' ,cd=mirArmBones[2]+'.fold')
    mc.setAttr(armBones[2]+'.fold', 0.0)
    mc.setAttr(mirArmBones[2]+'.fold', 0.0)

#////////////////////////////////////////////////////////////////////////////////////////////////////////////    
#folded
    mc.setAttr(armBones[2]+'.fold', -50.0)
    mc.setAttr(mirArmBones[2]+'.fold', -50.0)
    #adjust pointer finger
    mc.setAttr(poFinger[0]+'.ry', foldVal)
    mc.setAttr(mirPoFinger[0]+'.ry', foldVal)
    #adjust middle finger
    mc.setAttr(miFinger[0]+'.ry', (foldVal*0.929))
    mc.setAttr(mirMiFinger[0]+'.ry', (foldVal*0.929))
    #adjust ring finger
    mc.setAttr(riFinger[0]+'.ry', (foldVal*0.857))
    mc.setAttr(mirRiFinger[0]+'.ry', (foldVal*0.857))
    #adjust pinky finger
    mc.setAttr(piFinger[0]+'.ry', (foldVal*0.714))
    mc.setAttr(mirPiFinger[0]+'.ry', (foldVal*0.714))
    #set pointer finger
    mc.setDrivenKeyframe(poFinger[0]+'.ry' ,cd=armBones[2]+'.fold')
    mc.setDrivenKeyframe(mirPoFinger[0]+'.ry' ,cd=mirArmBones[2]+'.fold')
    #set middle finger
    mc.setDrivenKeyframe(miFinger[0]+'.ry' ,cd=armBones[2]+'.fold')
    mc.setDrivenKeyframe(mirMiFinger[0]+'.ry' ,cd=mirArmBones[2]+'.fold')
    #set ring finger
    mc.setDrivenKeyframe(riFinger[0]+'.ry' ,cd=armBones[2]+'.fold')
    mc.setDrivenKeyframe(mirRiFinger[0]+'.ry' ,cd=mirArmBones[2]+'.fold')
    #set pinky finger
    mc.setDrivenKeyframe(piFinger[0]+'.ry' ,cd=armBones[2]+'.fold')
    mc.setDrivenKeyframe(mirPiFinger[0]+'.ry' ,cd=mirArmBones[2]+'.fold')
    mc.setAttr(armBones[2]+'.fold', 0.0)
    mc.setAttr(mirArmBones[2]+'.fold', 0.0)
            
    print('done setting')
    mc.delete('rMat')
    mc.delete('gMat')
    mc.delete('bMat')
    mc.select(cl=T)
    
if mc.window('DB Quick Wing!', exists=F):
    quickWingWin = mc.window(title='DB Quick Wing!', iconName='testWin', w=(500), h=(200), s=F, ret=T)
    mc.columnLayout(adjustableColumn=T)
    mc.floatSliderGrp('bendSldr', label='Bend Amount', field=True, minValue=0, maxValue=50.0, value=25, cal=(1, 'left'), cw3=(80, 50, 100) )
    mc.floatSliderGrp('curlSldr', label='Curl Amount', field=True, minValue=0, maxValue=45.0, value=20, cal=(1, 'left'), cw3=(80, 50, 100) )
    mc.floatSliderGrp('foldSldr', label='Fold Amount', field=True, minValue=0, maxValue=80.0, value=70, cal=(1, 'left'), cw3=(80, 50, 100) )
    mc.button(label='Make Gizmo Chain', c=makeGizmoChain)
    mc.button(label='Make Joint Chain', c=makeJointChain)
def quickwing():
    mc.showWindow(quickWingWin)

 

Simple Enemy Space Ship AI

 

Phoenix (3 Artist Team):

In order for artists to get acquainted with game scripting and coding, we were placed in small teams and tasked with making a Unity game using its Javascript based language. A movement system with a full 6 degrees of freedom was implemented, which was particularly tricky with the AI. Quaternions were used rather than Euler angles to avoid Gimbal lock. The AI is designed so that they prefer to circle the player by changing their yaw rather than their pitch, so they tend to stay on a horizontal plane rather than taking steep pitch angles. This works rather well in practice, as the ships appear to be very agile.

What I Did:

  • AI

  • Ship Movement

  • Various Scripting (ex: Timing Explosions)

  • Particle Systems

  • Shader Work

  • Integration of the team scripts into the final build

 

            
//for finding the player location and other important locations
var missionZoneCenter : Transform;
var myTransform : Transform;
var playerShip : GameObject;
var delayedBlast2 : Transform;
//for moving
var turnSpeed : int = 4;
var thrust : int = 25;
private var fullThrottle : boolean = true;
//for finding angle to the player
private var positionDifference;
private var rotateToPlayer;
//AI variables
var canShoot : boolean = true;
var distToMissionZone : float;
var distToPlayer : float;
var playerVelocity : float;
var enemyVelocity : float;
var thinking : int = 3;
var randomize : boolean = true;
var randomizer : int;
//for positions in space relative to the player. The offset is to make it less straight forward forcing the player to maneuver since the enemy is tracking points in space around the player. Also, it greatly reduces the chance the player will ever collide with an enemy.
var xOffset : int = 300;
var yOffset : int = 300;
var zOffset : int = 300;
var aboveFront : Vector3;
var farBehind : Vector3;
var farLeft : Vector3;
var leadPlayer : Transform;
var playerPosition : Vector3;
var offsetPosition : Vector3;

function Awake () {
	myTransform = transform;
}

function Start (){
	RandomNumber ();
	//fill in name of player ship here \/
	playerShip = GameObject.Find("aTridentB");
	//tell it where those positions relative to the player are
	aboveFront = Vector3(0, -yOffset+randomizer, zOffset);
	farBehind = Vector3(0, randomizer, -zOffset*10);
	farLeft = Vector3(xOffset, 0, 0);
	gameObject.BroadcastMessage ("GunOnOff", false);
}

function Update (){
	distToPlayer = Vector3.Distance(playerShip.transform.position, myTransform.position);
	distToMissionZone = Vector3.Distance(missionZoneCenter.position, myTransform.position);
	playerPosition = playerShip.transform.localPosition;
	//pick a random number every 5 seconds goes to the function to do this
	if (randomize) {
		randomize = false;
		RandomNumber ();
	}
}


function FixedUpdate (){
	//for determining AI state look at a random number and the distance from the player
	if(distToPlayer > 300) {
		thinking = 4;
	}
	
	else if( randomizer >= 20)
	{
		if( distToPlayer < 20 ){
			thinking = 4;
		}
		if( distToMissionZone > 400 && randomizer < 27) {
			thinking = 4;
		}
		if( distToPlayer > 125 ){
			thinking = 3;
		}
		if( randomizer >= 28 && distToPlayer < 110 ){
			thinking = 2;
		}
		else if( randomizer < 27 && distToPlayer < 80 ){
			thinking = 3;
		}
		else if( randomizer == 27 && distToPlayer < 80 ){
			thinking = 0;
		}
	}
	else
	{
		if( distToPlayer < 20 ){
			thinking = 4;
		}
		if( distToMissionZone > 400 && randomizer <= 7) {
			thinking = 4;
		}
		if( distToPlayer > 125 ){
			thinking = 3;
		}
		if( randomizer <= 7 && distToPlayer < 80 ){
			thinking = 3;
		}
		else if( randomizer >= 8 && distToPlayer < 110 ){
			thinking = 1;
		}
	}
	//functions to call on the different states
	switch(thinking){
		case 0 : GetBehind ();
		break;
		case 1 : GetFront ();
		break;
		case 2 : GetLeft ();
		break;
		case 3 : Attack ();
		break;
		case 4 : MissionZone ();
		break;
		default:
		break;
	}
	
	if ( fullThrottle ) {
		rigidbody.AddRelativeForce( 0,0,thrust );
	}
	rotateToPlayer = Quaternion.LookRotation( positionDifference );
	transform.rotation = Quaternion.Slerp ( myTransform.rotation, rotateToPlayer, 
Mathf.Lerp(0, turnSpeed, Time.deltaTime/10) );
	//debug for fine tuning the behavior
	//print ("Distance to player: " + distToPlayer);
	//print( rotateToPlayer.eulerAngles - myTransform.rotation.eulerAngles );
}

function RandomNumber (){
	randomizer = Random.Range( 1, 30 );
	//print(randomizer);
	yield WaitForSeconds(7);
	randomize = true;
}

function GetBehind (){
	gameObject.BroadcastMessage ("GunOnOff", false);
	offsetPosition = playerPosition + farBehind;
	positionDifference = offsetPosition - myTransform.position;
}

function GetFront (){
	gameObject.BroadcastMessage ("GunOnOff", false);
	offsetPosition = playerPosition + aboveFront;
	positionDifference = offsetPosition - myTransform.position;
}

function GetLeft (){
	gameObject.BroadcastMessage ("GunOnOff", false);
	offsetPosition = playerPosition + farLeft;
	positionDifference = offsetPosition - myTransform.position;
}

function Attack (){
	if (distToPlayer < 300) {
		//talk to the gun :)
		gameObject.BroadcastMessage ("GunOnOff", true);
	}
	//very rough method for leading the player, works best when the enemy is approaching from behind. For every enemy the player is tracking infront of them at least one enemy will be in a state to attack from behind.
	offsetPosition = leadPlayer.position;
	positionDifference = offsetPosition - myTransform.position;
}

function MissionZone (){
	//you're off the grid! get back!
	gameObject.BroadcastMessage ("GunOnOff", false);
	offsetPosition = missionZoneCenter.position;
	positionDifference = offsetPosition - myTransform.position;
}

function BigBoom() {
	//fall down go boom :(
	Instantiate(delayedBlast2, myTransform.position, myTransform.rotation);
}