Animating with Python in Maya
Final result:
Step by step:

1. Creating and Manipulating Objects

2. Working with Selections and Constraints

3. Creating a Scripted Animation

4. Generating a User Interface

5. Custom Attributes and Expressions

The script:
randomCubes.py
import maya.cmds as cmds
import random
random.seed( 1234 )
”’
cubeList = cmds.ls( ‘myCube*’ )
if len( cubeList ) > 0:
cmds.delete( cubeList )
”’
result = cmds.polyCube( w=1, h=1, d=1, name=’myCube#’ )
print ‘result: ‘ + str( result )
transformName = result[0]
instanceGroupName = cmds.group( empty=True, name=transformName + ‘_instance_grp#’ )
for i in range( 0, 50 ):
instanceResult = cmds.instance( transformName, name=transformName + '_instance#' )
cmds.parent( instanceResult, instanceGroupName )
#print 'instanceResult: ' + str( instanceResult )
x = random.uniform( -10, 10 )
y = random.uniform( 0, 20 )
z = random.uniform( -10, 10 )
cmds.move( x, y, z, instanceResult )
xRot = random.uniform( 0, 360 )
yRot = random.uniform( 0, 360 )
zRot = random.uniform( 0, 360 )
cmds.rotate( xRot, yRot, zRot, instanceResult )
scalingFactor = random.uniform( 0.3, 1.5 )
cmds.scale( scalingFactor, scalingFactor, scalingFactor, instanceResult )
cmds.hide( transformName )
cmds.xform( instanceGroupName, centerPivots=True )
randomInstances.py
import maya.cmds as cmds
import random
random.seed( 1234 )
result = cmds.ls( orderedSelection=True )
print ‘result: %s’ % ( result )
transformName = result[0]
instanceGroupName = cmds.group( empty=True, name=transformName + ‘_instance_grp#’ )
for i in range( 0, 50 ):
instanceResult = cmds.instance( transformName, name=transformName + '_instance#' )
cmds.parent( instanceResult, instanceGroupName )
#print 'instanceResult: ' + str( instanceResult )
x = random.uniform( -10, 10 )
y = random.uniform( 0, 20 )
z = random.uniform( -10, 10 )
cmds.move( x, y, z, instanceResult )
xRot = random.uniform( 0, 360 )
yRot = random.uniform( 0, 360 )
zRot = random.uniform( 0, 360 )
cmds.rotate( xRot, yRot, zRot, instanceResult )
scalingFactor = random.uniform( 0.3, 1.5 )
cmds.scale( scalingFactor, scalingFactor, scalingFactor, instanceResult )
cmds.hide( transformName )
cmds.xform( instanceGroupName, centerPivots=True )
aimAtFirst.py
import maya.cmds as cmds
selectionList = cmds.ls( orderedSelection=True )
if len( selectionList ) >= 2:
print 'Selected items: %s' % ( selectionList )
targetName = selectionList[0]
selectionList.remove( targetName )
for objectName in selectionList:
print 'Constraining %s towards %s' % ( objectName, targetName )
cmds.aimConstraint( targetName, objectName, aimVector=[0,1,0] )
else:
print 'Please select two or more objects.'
keyRotation.py
import maya.cmds as cmds
def keyFullRotation( pObjectName, pStartTime, pEndTime, pTargetAttribute ):
cmds.cutKey( pObjectName, time=(pStartTime, pEndTime), attribute=pTargetAttribute )
cmds.setKeyframe( pObjectName, time=pStartTime, attribute=pTargetAttribute, value=0 )
cmds.setKeyframe( pObjectName, time=pEndTime, attribute=pTargetAttribute, value=360 )
cmds.selectKey( pObjectName, time=(pStartTime, pEndTime), attribute=pTargetAttribute, keyframe=True )
cmds.keyTangent( inTangentType='linear', outTangentType='linear' )
selectionList = cmds.ls( selection=True, type=’transform’ )
if len( selectionList ) >= 1:
# print 'Selected items: %s' % ( selectionList )
startTime = cmds.playbackOptions( query=True, minTime=True )
endTime = cmds.playbackOptions( query=True, maxTime=True )
for objectName in selectionList:
# objectTypeResult = cmds.objectType( objectName )
# print '%s type: %s' % ( objectName, objectTypeResult )
keyFullRotation( objectName, startTime, endTime, 'rotateY' )
else:
print 'Please select at least one object'
keyRotationWithUI.py
import maya.cmds as cmds
import functools
def createUI( pWindowTitle, pApplyCallback ):
windowID = 'myWindowID'
if cmds.window( windowID, exists=True ):
cmds.deleteUI( windowID )
cmds.window( windowID, title=pWindowTitle, sizeable=False, resizeToFitChildren=True )
cmds.rowColumnLayout( numberOfColumns=3, columnWidth=[ (1,75), (2,60), (3,60) ], columnOffset=[ (1,'right',3) ] )
cmds.text( label='Time Range:' )
startTimeField = cmds.intField( value=cmds.playbackOptions( q=True, minTime=True ) )
endTimeField = cmds.intField( value=cmds.playbackOptions( q=True, maxTime=True ) )
cmds.text( label='Attribute:' )
targetAttributeField = cmds.textField( text='rotateY' )
cmds.separator( h=10, style='none' )
cmds.separator( h=10, style='none' )
cmds.separator( h=10, style='none' )
cmds.separator( h=10, style='none' )
cmds.separator( h=10, style='none' )
cmds.button( label='Apply', command=functools.partial( pApplyCallback,
startTimeField,
endTimeField,
targetAttributeField ) )
def cancelCallback( *pArgs ):
if cmds.window( windowID, exists=True ):
cmds.deleteUI( windowID )
cmds.button( label='Cancel', command=cancelCallback )
cmds.showWindow()
def keyFullRotation( pObjectName, pStartTime, pEndTime, pTargetAttribute ):
cmds.cutKey( pObjectName, time=(pStartTime, pEndTime), attribute=pTargetAttribute )
cmds.setKeyframe( pObjectName, time=pStartTime, attribute=pTargetAttribute, value=0 )
cmds.setKeyframe( pObjectName, time=pEndTime, attribute=pTargetAttribute, value=360 )
cmds.selectKey( pObjectName, time=(pStartTime, pEndTime), attribute=pTargetAttribute, keyframe=True )
cmds.keyTangent( inTangentType='linear', outTangentType='linear' )
def applyCallback( pStartTimeField, pEndTimeField, pTargetAttributeField, *pArgs ):
# print 'Apply button pressed.'
startTime = cmds.intField( pStartTimeField, query=True, value=True )
endTime = cmds.intField( pEndTimeField, query=True, value=True )
targetAttribute = cmds.textField( pTargetAttributeField, query=True, text=True )
print 'Start Time: %s' % ( startTime )
print 'End Time: %s' % ( endTime )
print 'Attribute: %s' % ( targetAttribute )
selectionList = cmds.ls( selection=True, type='transform' )
for objectName in selectionList:
keyFullRotation( objectName, startTime, endTime, targetAttribute )
createUI( ‘My Title’, applyCallback )
------------------------------------------------------------------------------------
expandFromFirst.py
import maya.cmds as cmds
selectionList = cmds.ls( orderedSelection=True, type=’transform’ )
if len( selectionList ) >= 2:
targetName = selectionList[0]
selectionList.remove( targetName )
locatorGroupName = cmds.group( empty=True, name='expansion_locator_grp#' )
maxExpansion = 100
newAttributeName = 'expansion'
if not cmds.objExists( '%s.%s' % ( targetName, newAttributeName ) ):
cmds.select( targetName )
cmds.addAttr( longName=newAttributeName, shortName='exp',
attributeType='double', min=0, max=maxExpansion,
defaultValue=maxExpansion, keyable=True )
for objectName in selectionList:
coords = cmds.getAttr( '%s.translate' % ( objectName ) )[0]
locatorName = cmds.spaceLocator( position=coords, name='%s_loc#' % ( objectName ) )[0]
cmds.xform( locatorName, centerPivots=True )
cmds.parent( locatorName, locatorGroupName )
pointConstraintName = cmds.pointConstraint( [ targetName, locatorName ], objectName, name='%s_pointConstraint#' % ( objectName ) )[0]
cmds.expression( alwaysEvaluate=True,
name='%s_attractWeight' % ( objectName ),
object=pointConstraintName,
string='%sW0=%s-%s.%s' % ( targetName, maxExpansion, targetName, newAttributeName ) )
cmds.connectAttr( '%s.%s' % ( targetName, newAttributeName ),
'%s.%sW1' % ( pointConstraintName, locatorName ) )
cmds.xform( locatorGroupName, centerPivots=True )
else:
print 'Please select two or more objects.'