def playerTurn(num): if num in myList: cmds.headsUpMessage('This block was already removed') else: #call the game function to create MASH network game() #parts of the string for the MASH Python node endStr = "\n\nmd.setData()" s = "import openMASH\n\nmd = openMASH.MASHData(thisNode)\n\n" #getting the visibility command strCommand = visCommand(num) #putting the string together pyStr = s + strCommand + endStr #adding the code to the MASH Python node cmds.select(pfx + "test") cmds.addAttr(longName="code", dataType="string") cmds.connectAttr(pfx + "test.code", pfx + "tower_Python.pyScript") cmds.setAttr(pfx + "test.code", pyStr, type="string") cmds.hide(pfx + "test") #another mash network to show number of turns cmds.duplicate(pfx + "brick") cmds.select(pfx + "brick1") cmds.rotate(90, 0, 0) mashNetwork = mapi.Network() mashNetwork.createNetwork(name=pfx + "turns", distributionStyle=2) cmds.setAttr(pfx + "turns_Distribute.modelAxis", 3) cmds.setAttr(pfx + "turns_Distribute.pointCount", len(myList)) transNode = mashNetwork.addNode("MASH_Dynamics") cmds.headsUpMessage('Turn #' + str(len(myList)))
def createMashNetwork(node, node2, transformNode): # create a new MASH network mashNetwork = mapi.Network() mashNetwork.createNetwork(name="MASH") # connect object to repro node for instancing repro.connect_mesh_group('MASH_Repro', node) AErepro.refresh_all_aetemplates( ) # Refresh the attribute editor for all repro nodes #change attribute on distribute node to make object follow curve #cmds.setAttr( 'MASH_Distribute.arrangement', 7 ) cmds.setAttr('MASH_Distribute.amplitudeX', 0) #Create Curve Node with Curve Curvenode = mashNetwork.addNode("MASH_Curve") #change curve node attribute to having object duplicate around entire curve cmds.setAttr("MASH_Curve.timeStep", 1) bug = "MASH_Curve" cmds.connectAttr(node2[0] + '.worldSpace[0]', bug + ".inCurves[0]", force=1) cmds.showHidden(node2) cmds.showHidden(transformNode)
def mashSignal(): ''' Create a sphere filled with cubes and when the a signal passes throught, the cube on te surface grow 1. create ofbjects and a Mash network 2. add a signal node: Adds either 4D Noise or Trigonometric animation to the network. 3. add falloff the the signal node 4. distribute node comes with the Mash network, in this case we distribute the cubes on the surface ''' # create Objects sphereToDistributeOn = cmds.polySphere(r=12) cmds.polyCube() # create a new MASH network mashNetwork = mapi.Network() mashNetwork.createNetwork(name="HelloWorld") # print out the default node names print mashNetwork.waiter print mashNetwork.distribute print mashNetwork.instancer # add Node: Signal node = mashNetwork.addNode("MASH_Signal") # set Attribute: Signal/Scale/ScaleX cmds.setAttr(node.name + ".scaleX", 10) # print: name of the signal node print node.name # add Attribute: Signal/Falloff Object/ create:FallOff falloff = node.addFalloff() # list command list of DAG object, p= Returns the parent of this dag node falloffParent = cmds.listRelatives(falloff, p=True)[0] # set Attribute: Falloff Object/translateX cmds.setAttr(falloffParent + ".translateX", 8) # distributs the cubes on the sphere surface mashNetwork.meshDistribute(sphereToDistributeOn[0]) # set Attribute: Distribute/Number of Points mashNetwork.setPointCount(1000) # print all nodes in the network nodes = mashNetwork.getAllNodesInNetwork() print "All nodes in network: []".format( nodes ) # set([u'Falloff_HelloWorld_SignalShape', u'HelloWorld_Signal', u'HelloWorld_ReproMesh', u'HelloWorld_Distribute', u'HelloWorld_Repro', u'HelloWorld', u'Falloff_HelloWorld_Signal']) # find all the falloffs in the network for node in nodes: mashNode = mapi.Node(node) falloffs = mashNode.getFalloffs() # found falloff if falloffs: print node + " has the following falloffs: " + str( falloffs) # [u'Falloff_HelloWorld_SignalShape']
def continuousConstrains(): ''' Create an instances of cubes, = equal to current tine (basicly emitting cubes) When cube are created constrain them to local cubes 1. create file: force a new file on default location 2. set perspective view 3. create object 4. create Mash network/Instancer: 5. set number of points equals current time 6. create Note: dynamics 7. create node: constain ''' # 1. create cmds.file(force=True, new=True) # 2. set perspective view cmds.setAttr('persp.translateX', 40) cmds.setAttr('persp.translateY', 25) cmds.setAttr('persp.translateZ', 40) cmds.setAttr('persp.rotateX', -30) cmds.setAttr('persp.rotateY', 45) # 3. create object cmds.polyCube() # 4. create a new MASH network mashNetwork = mapi.Network() mashNetwork.createNetwork(name="DymamicsNetwork", geometry="Instancer") # set Attribute: arrangement cmds.setAttr(mashNetwork.distribute + ".arrangement", 9) # 9 = volume # 5. number of points equals time cmds.setKeyframe(mashNetwork.distribute, attribute='pointCount', t=['0sec'], v=0.0) cmds.setKeyframe(mashNetwork.distribute, attribute='pointCount', t=['20sec'], v=200.0) # 6. create Note: dynamics dynamicsNode = mashNetwork.addNode("MASH_Dynamics") # 7. create node: constain constraintNode = mashNetwork.addConstraint(dynamicsNode) #tell Maya to finish what it's doing before we continue cmds.flushIdleQueue() #playblast cmds.playbackOptions(maxTime='20sec') cmds.playblast(format="qt", viewer=True, p=100)
def staggerTime(): ''' Animate a serie of planes and animed them 1. create file: force a new file on default location 2. set perspective view 3. create object 4. create Mash network: fills inside with instances 5. animation offset components ''' # 1. new file cmds.file(force=True, new=True) # 2. move the camera cmds.setAttr('persp.translateX', 25) cmds.setAttr('persp.translateY', 20) cmds.setAttr('persp.translateZ', 20) # 3. create a poly cube pcube = cmds.polyPlane(sx=1, sy=1) cmds.setKeyframe(pcube[0], attribute='rotateX', t=['0sec'], v=-180.0) cmds.setKeyframe(pcube[0], attribute='rotateX', t=['0.5sec'], v=0.0) # 4. create a new MASH network mashNetwork = mapi.Network() mashNetwork.createNetwork(name="TimeNetwork", geometry="Repro") cmds.setAttr(mashNetwork.distribute + '.arrangement', 6) # 6=Grid cmds.setAttr(mashNetwork.distribute + '.gridAmplitudeX', 30) cmds.setAttr(mashNetwork.distribute + '.gridx', 30) cmds.setAttr(mashNetwork.distribute + '.gridz', 6) # 5. create node: timeNode timeNode = mashNetwork.addNode("MASH_Time") cmds.setAttr(timeNode.name + '.animationEnd', 1000) #one attribute way to turn off looping cmds.setAttr(timeNode.name + '.staggerFrames', 120) cmds.setAttr(timeNode.name + '.timeOffset', -120) reproMesh = cmds.listConnections(mashNetwork.instancer + '.outMesh', d=True, s=False)[0] cmds.flushIdleQueue() cmds.select(clear=True) cmds.select(reproMesh) bendDeformer = cmds.nonLinear(type='bend', curvature=179.5)[1] #handle cmds.setAttr(bendDeformer + '.rotateX', 90) cmds.setAttr(bendDeformer + '.rotateY', 90) cmds.playbackOptions(animationEndTime='6sec') cmds.playblast(format="qt", viewer=True, p=100)
def CreateVisualizer(wavPath): '''Create a MASH visualizer in Maya given a Wav file path. Will create a new MASH network named "testNetwork", change the distribution type to 'grid' mode, add an audio node, set up the audio node, then change some variables to make it look interesting. Check module docstring for usage examples. Args: wavPath (str): The path to the Wav file to be used Notes: * Must be used in mayapy.exe ''' mc.file(new=True, force=True) fileNameWithExtention = ntpath.basename(wavPath) fileName= fileNameWithExtention[:fileNameWithExtention.find(".")] cube = mc.polySphere() networkName = "testNetwork" mashNetwork = mapi.Network() mashNetwork.createNetwork(networkName) audioNode = AudioNode(mashNetwork, wavPath) #print(mc.getAttr(audioNode.name+".eqOutput")) mc.setAttr(audioNode.name+".scaleY", 100) mc.setAttr(networkName+"_Distribute"+".arrangement", 6) # 6 is Grid mc.setAttr(networkName+"_Distribute"+".gridAmplitudeX", 30) mc.setAttr(networkName+"_Distribute"+".gridAmplitudeZ", 10) mc.setAttr(networkName+"_Distribute"+".gridx", 30) colorNode = mashNetwork.addNode("MASH_Color") mc.setAttr(colorNode.name+".color", 0.222,0.222,0.888) colorFalloff = colorNode.addFalloff() mc.setAttr(colorFalloff+".falloffShape", 2) # 2 is Cube
def worldIgnoreSlope(): #new file cmds.file(force=True, new=True) #move the camera cmds.setAttr('persp.translateX', 133.600) cmds.setAttr('persp.translateY', 97.700) cmds.setAttr('persp.translateZ', 133.600) #create a poly cube ptorus = cmds.polyTorus(r=80, sr=6, sh=15, sx=100) pcube = cmds.polyCube(w=0.1, h=2, d=0.1) #create a new MASH network mashNetwork = mapi.Network() mashNetwork.createNetwork("CurlNoiseNetwork") shape = cmds.listRelatives(ptorus[0], s=True)[0] mashNetwork.meshDistribute(shape, 1) cmds.setAttr(mashNetwork.distribute + '.floodMesh', 1) cmds.setAttr(mashNetwork.distribute + '.pointCount', 20) #add a World node node = mashNetwork.addNode("MASH_World") #set some attributes on the world node using the .name of the node instance cmds.setAttr(node.name + ".clusterMode", 7) cmds.setAttr(node.name + ".sparsity", 0.5) cmds.setKeyframe(node.name, attribute='ecosystemAge', t=['0sec'], v=0.0) cmds.setKeyframe(node.name, attribute='ecosystemAge', t=['5sec'], v=120.0) cmds.setAttr(node.name + ".ignoreSlope", 1) node.addGroundPlane(ptorus[0]) jsonString = '[{"Slope": 0.6, "colorBar": [255, 255, 255], "Id Min": 0, "Name": "Default Genotype", "Seed Count": 4, "Resiliance": 0.2, "Age": 100, "Soil Quality": 0.5, "Id": 0, "Temperature": 0.5, "Rate": 0.12, "Id Max": 0, "Id Color": [0.0, 0.0, 0.0], "Moisture": 0.5, "Variance": 0.2, "Seed Age": 10, "Size": 1.0}]' # cmds.setAttr(node.name + '.genotypeJSON', jsonString, type='string') cmds.hide(ptorus[0]) cmds.flushIdleQueue() #playblast cmds.playbackOptions(animationEndTime='5sec') cmds.playblast(format="qt", viewer=True, p=100)
def overlappingMash( targetList ): cmds.select(cl=True) mashNetwork = mapi.Network() mashNetwork.createNetwork( name='MASH1', distributionStyle=7 ) mashNetwork.setPointCount( len(targetList) ) for x in range( len(targetList) ): locatorName = cmds.spaceLocator()[0] cmds.parentConstraint( targetList[x], locatorName ) cmds.connectAttr( '%s.worldMatrix[0]' % locatorName, '%s.initialStateMatrix[%s]' % ( mashNetwork.distribute, x ) ) idNode = mashNetwork.addNode( 'MASH_ID' ) cmds.setAttr( idNode.name + '.numObjects', len(targetList) ) pointNode = mashNetwork.addNode( 'MASH_Points' ) delayNode = mashNetwork.addNode( 'MASH_Delay' ) cmds.setAttr( delayNode.name + '.timeStep', 1) springNode = mashNetwork.addNode( 'MASH_Spring' ) # output node create breakoutNode = mashNetwork.addNode( 'MASH_Breakout' ) outputList = [] for x in range( len(targetList) ): outputLocator = cmds.spaceLocator( name=targetList[x].replace( 'JNT', 'mashLoc' ) )[0] outputList.append( outputLocator ) cmds.connectAttr( '%s.outputs[%s].translate' % ( breakoutNode.name, x ), outputLocator + '.translate' ) for x in range( len(outputList)-1 ): cmds.aimConstraint( outputList[x+1], outputList[x], aimVector=[ 1, 0, 0 ], upVector=[ 0, 1, 0 ], worldUpType='objectrotation', worldUpObject=targetList[0] ) cmds.orientConstraint( outputList[-2], outputList[-1] )
def runPreset(): cmds.select(clear=True) cmds.promptDialog(message='Nome do sistema MASH:') mashName = cmds.promptDialog(query=True, text=True) if not mashName: mashName = '#' else: mashName = '_' + mashName ############################################################################################ steps = [ 'Selecione as instancias | n >= 2 (arraste com o botao do meio)', 'Selecione a superficie | n = 1 (arraste com o botao do meio)' ] accepts = [['mesh'], ['mesh']] ############################################################################################ fx.DropWindow.getDrop(steps, lambda data: smartPreset.send(data), accepts=accepts) node = yield nodes = node.split('\n') ############################################################################################ cmds.promptDialog(message='Numero de pontos:') pointCount = cmds.promptDialog(query=True, text=True) try: pointCount = int(pointCount) except: pointCount = 10 mash = mapi.Network() mash.createNetwork(name='MASH' + mashName, geometry='Instancer') node = yield node = node.split('\n')[0] mash.meshDistribute(node) ############################################################################################ distNodeName = mash.waiter + '_Distribute' cmds.setAttr(distNodeName + '.pointCount', pointCount) idNodeName = mash.waiter + '_ID' cmds.setAttr(idNodeName + '.idtype', 2) count = cmds.getAttr(idNodeName + '.numObjects') pyNode = mash.addNode('MASH_Python') cmds.addAttr(pyNode.name, longName='countID', attributeType='long', defaultValue=count) expr = '{0}.countID = {1}.numObjects'.format(pyNode.name, idNodeName) cmds.expression(s=expr) cmds.addAttr(pyNode.name, longName='seed', attributeType='long', defaultValue=1234) scriptID = ''.join([ 'p[{0}] = 1 # {1} prob.\n'.format(i, e) for i, e in enumerate(nodes) ]) cmds.setAttr(pyNode.name + '.pyScript', SCRIPT.format(scriptID), type='string') randNode = mash.addNode('MASH_Random') cmds.setAttr(randNode.name + '.positionX', 0) cmds.setAttr(randNode.name + '.positionY', 0) cmds.setAttr(randNode.name + '.positionZ', 0) cmds.setAttr(randNode.name + '.rotationY', 180) cmds.setAttr(randNode.name + '.scaleX', 1) cmds.setAttr(randNode.name + '.uniformRandom', 1) strengthNode = mash.addNode('MASH_Strength') yield
__date__ = '2020-08-26 23:23:27' import MASH.api as mapi from maya import OpenMaya import pymel.core as pm # NOTE 删除之前生成的 loc pm.delete([grp for grp in pm.ls(assemblies=1) if grp.startswith("frame")]) data = {} min_time = pm.playbackOptions(q=1, min=1) max_time = pm.playbackOptions(q=1, max=1) for i in range(int(min_time), int(max_time) + 1): pm.currentTime(i, update=1) mashNetwork = mapi.Network("MASH1") # NOTE 这个是 MASH1_Repro 节点 node = pm.PyNode(mashNetwork.instancer) # NOTE 获取 MPlug 属性 obj = node.inputPoints.__apiobject__().asMObject() inputPointsData = OpenMaya.MFnArrayAttrsData(obj) positions = inputPointsData.getVectorData("position") loc_list = [] # TODO 不能直接 for 循环 | 会导致 Maya 崩溃 for i in range(positions.length()): pt = positions[i] loc = pm.spaceLocator() loc.t.set((pt.x, pt.y, pt.z)) loc_list.append(loc) pm.group(loc_list, n="frame_%s" % i)
def colourOffsetMesh(): ''' Inhabit on object surface with a instance of cubes and make them transfom bases on the surface color The surface color is a animated noise texture 1. create file: force a new file on default location 2. set perspective view 3. create object 4. create Mash network/Repro: Repro node is used to control various aspects of the meshes created when Geometry Type is set to Mesh during a MASH network's creation. 5. Disturube Instances on Surface 6. offset position, scale, transformation space 7. add noise shader & animate noise 8. create color node 9. create falloff for the color node ''' # 1. new file cmds.file(force=True, new=True) # 2. move the camera cmds.setAttr('persp.translateX', 50) cmds.setAttr('persp.translateY', 35) cmds.setAttr('persp.translateZ', 50) # 3. create a poly cube ptorus = cmds.polyTorus(r=20, sr=2, sh=60, sx=400) pcube = cmds.polyCube(w=0.4, h=1.0, d=0.4) # 4. create a new MASH network mashNetwork = mapi.Network() mashNetwork.createNetwork(name="OffsetMapNetwork", geometry="Repro") # use Mash Repro node # 5. Disturube Instances on Surface shape = cmds.listRelatives(ptorus[0], s=True)[0] # select Torus object mashNetwork.meshDistribute( shape, 4) # Sets the MASH Network distribution method to mesh based. 4 = Face cmds.setAttr( mashNetwork.distribute + '.floodMesh', 1 ) # Flood Mesh Automatically fills the mesh with instances of the object, overriding the Number of Points. # 6. add a World node offsetNode = mashNetwork.addNode("MASH_Offset") cmds.setAttr(offsetNode.name + '.positionOffsetY', 5) cmds.setAttr(offsetNode.name + '.scaleOffset1', 5) cmds.setAttr(offsetNode.name + '.transformationSpace', 2) # 7. add noise shader & animate noise noiseShader = cmds.shadingNode('noise', asTexture=True) place2dTexture = cmds.shadingNode('place2dTexture', asUtility=True) cmds.connectAttr(place2dTexture + '.outUV', noiseShader + '.uv') cmds.connectAttr(noiseShader + '.outColor', offsetNode.name + '.mColour') cmds.setAttr(noiseShader + '.noiseType', 2) cmds.setKeyframe(noiseShader, attribute='time', t=['0sec'], v=0.0) cmds.setKeyframe(noiseShader, attribute='time', t=['5sec'], v=1.0) # 8. create color node colorNode = mashNetwork.addNode("MASH_Color") # set Attribute: color, add background/ background color cmds.setAttr(colorNode.name + '.color', 0.859, 0.31, 0.251, type='double3') cmds.setAttr(colorNode.name + '.enableBackgroundColor', 1) cmds.setAttr(colorNode.name + '.backgroundColor', 0.239, 0.663, 0.576, type='double3') # 9. create color/falloff node colourFalloff = colorNode.addFalloff() cmds.connectAttr(shape + '.worldMesh[0]', colourFalloff + '.shapeIn') cmds.setAttr(colourFalloff + '.falloffShape', 6) cmds.setAttr(colourFalloff + '.searchRadius', 4) cmds.setAttr(colourFalloff + '.innerRadius', 0) #tell Maya to finish what it's doing before we continue cmds.flushIdleQueue() #playblast cmds.playbackOptions(animationEndTime='5sec') cmds.playblast(format="qt", viewer=True)
def signalColour(): ''' create a matrix of cubes, effected by a signal, rotate, scale and color 1. create file: force a new file on default location 2. set perspective view 3. create object 4. create Mash network: fills inside with instances 5. create node: signal 6. create node: Signal/Falloff 7. create node: colorNode ''' # 1. new file cmds.file(force=True, new=True) # 2. move the camera cmds.setAttr('persp.translateX', 50) cmds.setAttr('persp.translateY', 48) cmds.setAttr('persp.translateZ', 50) # 3. create a poly cube pcube = cmds.polyCube(w=1.0, h=1.0, d=1.0) # 4. create a new MASH network mashNetwork = mapi.Network() mashNetwork.createNetwork( name="OffsetMapNetwork", geometry="Repro" ) # Repro node is used to control various aspects of the meshes created when Geometry Type is set to Mesh during a MASH network's creation. cmds.setAttr(mashNetwork.distribute + '.arrangement', 6) # 6=grid cmds.setAttr(mashNetwork.distribute + '.gridAmplitudeX', 30) # set grid size cmds.setAttr(mashNetwork.distribute + '.gridAmplitudeY', 30) cmds.setAttr(mashNetwork.distribute + '.gridAmplitudeZ', 30) cmds.setAttr(mashNetwork.distribute + '.gridx', 30) cmds.setAttr(mashNetwork.distribute + '.gridy', 30) cmds.setAttr(mashNetwork.distribute + '.gridz', 30) # 5. create node: signal signalNode = mashNetwork.addNode("MASH_Signal") # set attributes cmds.setAttr(signalNode.name + '.positionX', 0) # signal transform cmds.setAttr(signalNode.name + '.positionY', 0) cmds.setAttr(signalNode.name + '.positionZ', 0) cmds.setAttr(signalNode.name + '.rotationX', 360) cmds.setAttr(signalNode.name + '.rotationY', 360) cmds.setAttr(signalNode.name + '.rotationZ', 360) cmds.setAttr(signalNode.name + '.scaleX', 5) cmds.setAttr(signalNode.name + '.timeScale', 0.2) # 6. create node: Signal/Falloff signalFalloff = signalNode.addFalloff() falloffTransform = cmds.listRelatives(signalFalloff, allParents=True)[0] cmds.setAttr(falloffTransform + '.translateX', 15.7) cmds.setAttr(falloffTransform + '.translateY', 14) cmds.setAttr(falloffTransform + '.scaleX', 25) cmds.setAttr(falloffTransform + '.scaleY', 25) cmds.setAttr(falloffTransform + '.scaleZ', 25) # 7. create node: colorNode colorNode = mashNetwork.addNode("MASH_Color") cmds.setAttr(colorNode.name + '.color', 1.0, 0.188, 0.192, type='double3') cmds.setAttr(colorNode.name + '.enableBackgroundColor', 1) cmds.setAttr(colorNode.name + '.backgroundColor', 0.086, 0.247, 0.282, type='double3') cmds.connectAttr(signalFalloff + '.falloffOut', colorNode.name + '.strengthPP[0]') colorNodeHotSpot = mashNetwork.addNode("MASH_Color") cmds.setAttr(colorNodeHotSpot.name + '.blendMode', 2) cmds.setAttr(colorNodeHotSpot.name + '.color', 0.626, 0.626, 0.238, type='double3') # create node: falloff hotspotFalloff = colorNodeHotSpot.addFalloff() cmds.setAttr(hotspotFalloff + '.innerRadius', 0) falloffTransform = cmds.listRelatives(hotspotFalloff, allParents=True)[0] cmds.setAttr(falloffTransform + '.translateX', 15.7) cmds.setAttr(falloffTransform + '.translateY', 14) cmds.setAttr(falloffTransform + '.scaleX', 15) cmds.setAttr(falloffTransform + '.scaleY', 15) cmds.setAttr(falloffTransform + '.scaleZ', 15) #tell Maya to finish what it's doing before we continue cmds.flushIdleQueue() #playblast cmds.playbackOptions(animationEndTime='3sec') cmds.playblast(format="qt", viewer=True, p=100)
def dynamicChain(): ''' create a dynamic chain object 1. create file: force a new file on default location 2. set perspective view 3. create object 4. create Mash network: fills inside with instances 5. create node: Dynamics 6. create node: dynamics/channelRandom 7. setup a falloff area, where dynamics are active ''' # 1. create file cmds.file(force=True, new=True) # 2. set perspective view cmds.setAttr('persp.translateX', 53) cmds.setAttr('persp.translateY', 26) cmds.setAttr('persp.translateZ', 36) cmds.setAttr('persp.rotateX', -30) cmds.setAttr('persp.rotateY', 45) # 3. create object cmds.polyTorus(r=2.5) # 4. create a new MASH network mashNetwork = mapi.Network() mashNetwork.createNetwork(name="DymamicsNetwork", geometry="Instancer") # set Attriubtes cmds.setAttr(mashNetwork.distribute + ".pointCount", 10) cmds.setAttr(mashNetwork.distribute + ".rotateX", 800) cmds.setAttr(mashNetwork.distribute + ".amplitudeX", 32) # 5. create node: Dynamics dynamicsNode = mashNetwork.addNode("MASH_Dynamics") # 6. create node: dynamics/channelRandom channelRandom = mashNetwork.addChannelRandom(dynamicsNode) cmds.setAttr(channelRandom.name + ".dynamicsChannelName", 11) # Channel Name: 9=Mass # 7 creaete node: dynamics/channelRandom/falloff falloff = channelRandom.addFalloff() cmds.setAttr(falloff + ".falloffShape", 2) # 2=Cube cmds.setAttr(falloff + ".innerRadius", 1) # inner radius =1 # set falloff cube area falloffParent = cmds.listRelatives(falloff, parent=True)[0] cmds.setAttr(falloffParent + ".translateX", 15.8) cmds.setAttr(falloffParent + ".scaleX", 15) cmds.setAttr(falloffParent + ".scaleY", 15) cmds.setAttr(falloffParent + ".scaleZ", 15) # select all bullet type objects solver = cmds.ls(type="MASH_BulletSolver")[0] #tell Maya to finish what it's doing before we continue cmds.flushIdleQueue() #playblast cmds.playbackOptions(animationEndTime='5sec') cmds.playblast(format="qt", viewer=True, p=100)
def curlNoise(): ''' create a swarm of cube with a tail behind 1. create file: force a new file on default location 2. set perspective view 3. create object 4. create Mash network: fills inside with instances 5. playblast 6. Signal: animate points with Noise 7. Trail: moving instances get a trail behind them ''' # 1. new file cmds.file(force=True, new=True) # 2. move the camera cmds.setAttr('persp.translateX', 50) cmds.setAttr('persp.translateY', 35) cmds.setAttr('persp.translateZ', 50) # 3. create a poly cube ptorus = cmds.polyTorus(r=20, sr=2, sh=15, sx=100) pcube = cmds.polyCube(w=0.1, h=0.1, d=0.1) # 4. create a new MASH network mashNetwork = mapi.Network() mashNetwork.createNetwork("CurlNoiseNetwork") shape = cmds.listRelatives(ptorus[0], s=True)[0] # select torus object mashNetwork.meshDistribute(shape, 4) # 4=Mesh cmds.setAttr( mashNetwork.distribute + '.floodMesh', 1 ) # Flood Mesh Automatically fills the mesh with instances of the object, overriding the Number of Points. # 5. playblast cmds.playbackOptions(animationEndTime='5sec') # 6. create node: Signal signalNode = mashNetwork.addNode("MASH_Signal") # set attributes cmds.setAttr(signalNode.name + '.signalType', 5) cmds.setAttr(signalNode.name + '.transformationSpace', 2) cmds.setAttr(signalNode.name + '.positionX', 5) cmds.setAttr(signalNode.name + '.positionZ', 5) cmds.setAttr(signalNode.name + '.timeScale', 3) # 7. create node: Trail trailsNode = mashNetwork.addNode("MASH_Trails") # set Atrribute: trail length cmds.setAttr(trailsNode.name + '.maxTrails', 1500) # hide object cmds.hide(ptorus) cmds.setAttr('lambert1.incandescence', 1, 1, 1, type='double3') #tell Maya to finish what it's doing before we continue cmds.flushIdleQueue() #playblast cmds.playbackOptions(animationEndTime='5sec') cmds.playblast(format="qt", viewer=True, p=100)
def game(): cmds.file(force=True, new=True) #length of playback for game cmds.playbackOptions(maxTime='20sec') #lights cmds.directionalLight() cmds.scale(4.910268, 4.910268, 4.910268, r=True) cmds.move(17.938379, 12.193473, 0, r=True) cmds.rotate(0, 98.271943, 0, r=True, os=True, fo=True) cmds.rotate(-23.925408, 0, 0, r=True, os=True, fo=True) cmds.move(0, 0, -0.622877, r=True) cmds.move(0, 0, -3.289271, r=True) cmds.duplicate() #// Result: directionalLight2 // cmds.move(-20.838684, 0, 0, r=True) cmds.rotate(0, 24.509822, 0, r=True, os=True, fo=True) cmds.rotate(0, 103.346384, 0, r=True, os=True, fo=True) cmds.rotate(-44.285251, 0, 0, r=True, os=True, fo=True) cmds.move(-14.586563, 0, 0, r=True) cmds.move(0, 0, -5.104265, r=True) cmds.move(0, 0, -4.284069, r=True) cmds.pointLight() cmds.move(0, 0, 5.003762, r=True) cmds.move(0, 0, 11.322471, r=True) cmds.move(0, 0, 3.520321, r=True) cmds.duplicate() #// Result: pointLight2 // cmds.move(0, 0, -62.281584, r=True) cmds.move(0, 0, 20.779332, r=True) cmds.setAttr("pointLightShape1.intensity", 0.2) #prefix for parts pfx = "jenga_" #the jenga brick cmds.polyCube(d=3, h=0.5, n=pfx + "brick") myBlinn = cmds.shadingNode('blinn', asShader=True) cmds.select(pfx + "brick") cmds.hyperShade(assign=myBlinn) cmds.select(cl=True) cmds.hyperShade(objects=myBlinn) cmds.setAttr("blinn1.color", 0.243, 0.155, 0.101, type="double3") cmds.setAttr("blinn1.ambientColor", 1, 1, 1, type="double3") # create a new MASH network with grid distribution mashNetwork = mapi.Network() mashNetwork.createNetwork(name=pfx + "tower", distributionStyle=6, geometry="Repro") #adjust the distribution cmds.setAttr(mashNetwork.distribute + ".gridz", 1) cmds.setAttr(mashNetwork.distribute + ".gridx", 3) cmds.setAttr(mashNetwork.distribute + ".gridy", 1) cmds.setAttr(mashNetwork.distribute + ".gridAmplitudeZ", 0) cmds.setAttr(mashNetwork.distribute + ".gridAmplitudeY", 0) cmds.setAttr(mashNetwork.distribute + ".gridAmplitudeX", 2.05) # add a Replicator node rep = mashNetwork.addNode("MASH_Replicator") # add a Dyanmics node dyn = mashNetwork.addNode("MASH_Dynamics") # add a Python node py = mashNetwork.addNode("MASH_Python") #adjust the Replicator settings to make a tower cmds.setAttr(pfx + "tower_Replicator.replicants", 17) cmds.setAttr(pfx + "tower_Replicator.offsetPositionY", 0.5) cmds.setAttr(pfx + "tower_Replicator.offsetPositionX", 0) cmds.setAttr(pfx + "tower_Replicator.offsetPositionZ", 0) cmds.setAttr(pfx + "tower_Replicator.rotatePointsY", 1530) #ajust the bullet solver ground plane cmds.setAttr(pfx + "tower_BulletSolverShape.groundPlanePositionY", -0.25) #ajust the Dynamics settings cmds.setAttr(pfx + "tower_Dynamics.friction", 1) #add the python code cmds.polyCube(n=pfx + "test")
def export(mash_nodes=None, scene_path=''): ''' Export MASH node to alembic ''' if not mash_nodes: mash_nodes = cmds.ls(type=['MASH_Waiter']) if not isinstance(mash_nodes, list): mash_nodes = [mash_nodes] fps = 24.0 for node_name in mash_nodes: print 'Processing MASH node: "{node}"'.format(node=node_name) mash_network = mapi.Network(node_name) node_ins = mash_network.instancer if cmds.objExists(node_name) and cmds.attributeQuery( 'anim', node=node_name, exists=True): anim_script = cmds.getAttr(node_name + '.anim') if anim_script is not None: # main:1-200 frame_match = re.match( r'(?P<name>\w+):(?P<in>\d+)-(?P<out>\d+)', anim_script) if frame_match: frame_in = int(frame_match.group('in')) frame_out = int(frame_match.group('out')) list_frames = range(frame_in, frame_out + 1) print '"{node}" has an animation sequence: "{script}"'.format( node=node_name, script=anim_script) else: print '"{node}" node does not have an animation'.format( node=node_name) i = 0 if node_ins.lower().endswith('_instancer'): input_name = '{node}.inputHierarchy'.format(node=node_ins) input_template = input_name + '[{index}]' else: input_name = '{node}.instancedGroup'.format(node=node_ins) input_template = input_name + '[{index}].instancedMesh[0].mesh' instance_indices = sorted(cmds.getAttr(input_name, multiIndices=True)) obj_list = [] for i in instance_indices: instance_obj = cmds.listConnections(input_template.format(index=i)) obj_list.append(str(instance_obj[0])) node_name_abc = re.sub(r'^MASH_?', '', node_name, flags=re.IGNORECASE) # mash_cpp = cpp.call(str(node_name), str(abc_path), obj_list, lib='write_alembic', func="mash2abc") mash_cpp = cpp.call( str(node_name), str('/home/v.lavrentev/project/speedtree/scene/mash/forest.abc'), obj_list, lib='/home/v.lavrentev/project/rnd/write_alembic/write_alembic.so', func="mash2abc") print obj_list print node_name # print abc_path print 'Export complete!'
def get_mash_network(node_name): if maya.cmds.objExists(node_name): return mapi.Network(node_name) return None
def dynamicConstraints(): ''' create an array of plane, and position them in a circle. Duplicate them next to each other, and give them some Dynamics constraines 1. create file 2. set perspective view 3. create object 4. create Mash network 5. create replicator: duplicate network and position in positionZ 6. create dynamics: add Maya Bullut to Mash Network 7. create constain: enable 'Breakable', and set 'constainer Distance' 8. create channelRandom 9. create falloff: Area where contrain breaksoff 10. show constainers 11. playbast simulation ''' # force a new file on default location cmds.file(force=True, new=True) # set Attributes: perspective view cmds.setAttr('persp.translateX', 35) cmds.setAttr('persp.translateY', 20) cmds.setAttr('persp.translateZ', 35) cmds.setAttr('persp.rotateX', -30) cmds.setAttr('persp.rotateY', 45) # create Object: Plane cmds.polyPlane() # create MASH network mashNetwork = mapi.Network() mashNetwork.createNetwork("DymamicsNetwork") # set Attributes: distribute cmds.setAttr(mashNetwork.distribute + ".arrangement", 2) # Type: Radial cmds.setAttr(mashNetwork.distribute + ".pointCount", 30) # number of points # create Node: Replictor replicantsNode = mashNetwork.addNode("MASH_Replicator") # set Attributes: Replictor cmds.setAttr(replicantsNode.name + ".replicants", 4) # duplicate number of times cmds.setAttr(replicantsNode.name + ".offsetPositionZ", -1.5) # offsett duplicates in posiztion Z # create Node: Dynamics dynamicsNode = mashNetwork.addNode("MASH_Dynamics") # create Node: Dynamics/Constains constraintNode = mashNetwork.addConstraint(dynamicsNode) # set Attributes: Constrain cmds.setAttr(constraintNode.name + ".constraintBreakable", 1) cmds.setAttr(constraintNode.name + ".constraintDistance", 2.5) #create Node: Dynamics/Constains/ChannelRandom channelRandom = mashNetwork.addChannelRandom(constraintNode) # set Attributes: ChannelRandom cmds.setAttr(channelRandom.name + ".dynamicsChannelName", 0) cmds.setAttr(channelRandom.name + ".constraintChannelName", 3) cmds.setAttr(channelRandom.name + ".startValue", 30) # create Node:Dynamics/Constains/ChannelRandom/Falloff falloff = channelRandom.addFalloff() # set Attributes: Falloff cmds.setAttr(falloff + ".falloffShape", 2) cmds.setAttr(falloff + ".innerRadius", 1) cmds.setAttr(falloff + ".falloffRamp[0].falloffRamp_FloatValue", 0.9) # select Node: falloff falloffParent = cmds.listRelatives(falloff, parent=True)[0] # set Attributes: Falloff cmds.setAttr(falloffParent + ".invertFalloff", 1) cmds.setAttr(falloffParent + ".translateY", -10) cmds.setAttr(falloffParent + ".translateZ", -3) # list: ButtelSolver solver = cmds.ls(type="MASH_BulletSolver")[0] # select object type # set Attributes: BulletSolver cmds.setAttr(solver + ".displayConstraints", 1) # display container of all selected # playblast cmds.playbackOptions(maxTime='10sec') cmds.playblast(format="qt", viewer=True, p=100)