def killer(listIds, particlesIds, lifespanMode): print "Killing ", len(listIds) , " particles." if listIds: if lifespanMode != 3: cmds.setAttr(Psel[0] + '.lifespanMode', 3) print "lifespanMode changed to 'lifespanPP only'" for particleId in listIds: try: if particleId in particlesIds: cmds.nParticle( Psel[0], e=True, attribute='lifespanPP', id = particleId, fv=0 ) except: print "The selected method can't kill more particles please select another." #if lifespanMode != 3: # cmds.setAttr(Psel[0] + '.lifespanMode', lifespanMode) print "Particles killed: ", listIds
def createNParticle(ptList=[],nucleus='',prefix=''): ''' Create an nParticle object. @param ptList: Mesh to create nCloth from @type ptList: str @param nucleus: nucleus to attach nCloth to @type nucleus: str @param prefix: Name prefix for created nodes @type prefix: str ''' # Check prefix if prefix: nParticle = prefix+'_nParticle' else: nParticle = 'nParticle#' # Check nucleus if nucleus: if not isNucleus(nucleus): print('Object "'+nucleus+'" is not a valid nucleus. Using current active nucleus!') getActiveNucleus(nucleus) # Set active nucleus setActiveNucleus(nucleus) # Create nParticles nParticle = mc.nParticle(p=ptList,n=nParticle)
def xformToNParticles(xformList=[]): """ Create nParticles from the specified list of transforms @param xformList: List of transforms to create nParticles from @type xformList: list """ if not xformList: xformList = cmds.ls(sl=True, type='transform') ptList = [cmds.xform(i, q=True, ws=True, rp=True) for i in xformList] particle = cmds.nParticle(p=ptList) return particle
def createParticleSystem_2(): # Creates a point emitter, with a collide plane and some PP attributes cmds.playbackOptions(maxTime=180) emitter = cmds.emitter(dx=1, dy=0, dz=0, sp=0.1, pos=(0, 5, 0),rate=20)[0] # nParticle creation depends on an optionVar value, make sure we use the default one cmds.optionVar( sv=("NParticleStyle","Points") ) particleSystem, particleSystemShape = cmds.nParticle(n="nParticle_test_2") cmds.setAttr('%s.lfm' % particleSystemShape, 2.0) # random range cmds.setAttr('%s.lifespan' % particleSystemShape, 3) cmds.setAttr('%s.lifespanRandom' % particleSystemShape, 4) cmds.setAttr('%s.friction' % particleSystemShape, 0.01) cmds.setAttr('%s.bounce' % particleSystemShape, 0.5) cmds.setAttr('%s.rotationFriction' % particleSystemShape, 0.98) cmds.setAttr('%s.pointMass' % particleSystemShape, 4) cmds.setAttr('%s.computeRotation' % particleSystemShape, True) cmds.setAttr('%s.particleRenderType' % particleSystemShape, 7) # Blobby, to see radius cmds.setAttr('%s.selfCollide' % particleSystemShape, True) cmds.connectDynamic( particleSystemShape, em=emitter) # add Custom Attributes # rgb if not cmds.objExists( "%s.rgbPP" % particleSystemShape): cmds.addAttr( particleSystemShape ,ln="rgbPP",dt="vectorArray") else: # Disconnect possible thing in rgbPP input = cmds.connectionInfo("%s.rgbPP" % particleSystemShape,sourceFromDestination=True) if input: cmds.disconnectAttr(input,"%s.rgbPP" % particleSystemShape) cmds.dynExpression( particleSystem, s="\nfloat $r = rand(1.0);float $g = rand(1.0);float $b = rand(1.0);\n%s.rgbPP = <<$r,$g,$b>>;" % particleSystemShape, c=True) # radius if not cmds.objExists( "%s.radiusPP" % particleSystemShape): cmds.addAttr( particleSystemShape, ln="radiusPP",dt="doubleArray") cmds.dynExpression( particleSystem, s="seed(%s.id);\n%s.radiusPP = .2 + time * .2 * rand(.2,1.5)" % (particleSystemShape,particleSystemShape), runtimeAfterDynamics=True) # rotatePP (enabled by "compute rotation", the attribute would be created by attribut editor's first constrcution in a gui maya) if not cmds.objExists( "%s.rotationPP" % particleSystemShape): cmds.addAttr( particleSystemShape, ln="rotationPP",dt="vectorArray") # add collision plane plane = cmds.polyPlane( w=30,h=30,sx=10,sy=10,ax=[0, 1, .5], cuv=2) cmds.select(plane[0]) maya.mel.eval("makePassiveCollider") cmds.select(clear=True) cmds.setAttr( "nRigidShape1.friction", 0.25) cmds.setAttr( "nRigidShape1.stickiness", 0.0) return particleSystem, particleSystemShape
def createParticleSystem_1(): # Creates a very basic particle system with custom attribute cmds.playbackOptions(maxTime=180) emitter = cmds.emitter(dx=1, dy=0, dz=0, sp=0.1, pos=(0, 5, 0),rate=20)[0] # nParticle creation depends on an optoinVar value, make sure we use the default one cmds.optionVar( sv=("NParticleStyle","Points") ) particleSystem, particleSystemShape = cmds.nParticle(n="nParticle_test_1") cmds.setAttr('%s.lfm' % particleSystemShape, 0) # live forever cmds.setAttr('%s.particleRenderType' % particleSystemShape, 7) # Blobby, to see radius cmds.connectDynamic( particleSystemShape, em=emitter) # Keyframe the radius parametter to have a single sample but varying in time ( abc kUniformScope ) cmds.setKeyframe( "%s.radius" % particleSystem, v=.2, t=1) cmds.setKeyframe( "%s.radius" % particleSystem, v=1.0, t=24) cmds.setKeyframe( "%s.radius" % particleSystem, v=2.0, t=50) cmds.setKeyframe( "%s.radius" % particleSystem, v=.5, t=100) # Create a custom attribute that will be handled by AbcExport as uniform double cmds.addAttr( particleSystemShape, ln="abcTestUniformDoublePP", at="double") exp = "%s.abcTestUniformDoublePP = frame;\n" % particleSystemShape # Create a custom attribute that will be handled by AbcExport as constant double cmds.addAttr( particleSystemShape, ln="abcTestConstantDoublePP", at="double") cmds.setAttr( "%s.abcTestConstantDoublePP" % particleSystemShape, 0x2697 ) # Create a custom attribute that will be handled by AbcExport as a uniform vector cmds.addAttr( particleSystemShape, ln="abcTestUniformVectorPP", at="double3") cmds.addAttr( particleSystemShape, ln="abcTestUniformVectorPPX", p="abcTestUniformVectorPP") cmds.addAttr( particleSystemShape, ln="abcTestUniformVectorPPY", p="abcTestUniformVectorPP") cmds.addAttr( particleSystemShape, ln="abcTestUniformVectorPPZ", p="abcTestUniformVectorPP") exp += "%s.abcTestUniformVectorPPX = frame;\n" % particleSystemShape exp += "%s.abcTestUniformVectorPPY = time;\n" % particleSystemShape exp += "%s.abcTestUniformVectorPPZ = 9.81;\n" % particleSystemShape # Create a custom attribute that will be handled by AbcExport as a constant vector cmds.addAttr( particleSystemShape, ln="abcTestConstantVectorPP", at="double3") cmds.addAttr( particleSystemShape, ln="abcTestConstantVectorPPX", p="abcTestConstantVectorPP") cmds.addAttr( particleSystemShape, ln="abcTestConstantVectorPPY", p="abcTestConstantVectorPP") cmds.addAttr( particleSystemShape, ln="abcTestConstantVectorPPZ", p="abcTestConstantVectorPP") cmds.setAttr( "%s.abcTestConstantVectorPP" % particleSystemShape, 0x2697, 3.141592654, 6.02e23 ) cmds.expression( particleSystemShape, s=exp, o="", ae=1, uc="all" ) return particleSystem, particleSystemShape
def softBody(geometry, nucleus='', prefix=''): """ Create an nParticle softBody from the specified geoemtry @param geometry: Mesh to create nRigid from @type geometry: str @param nucleus: nucleus to attach nRigid to @type nucleus: str @param prefix: Name prefix for created nodes @type prefix: str """ # Check prefix if not prefix: prefix = geometry # Check geometry geometryType = cmds.objectType(geometry) if geometryType == 'transform': geometryTransform = geometry geometryShapes = glTools.utils.shape.getShapes(geometry, nonIntermediates=True, intermediates=False) if not geometryShapes: raise Exception('No valid geometry shapes found!') geometryShape = geometryShapes[0] else: geometryTransform = cmds.listRelatives(geometry, p=True)[0] geometryShape = geometry # Check geometry type geometryType = cmds.objectType(geometryShape) if geometryType == 'mesh': geometryAttribute = 'inMesh' elif geometryType == 'nurbsCurve': geometryAttribute = 'create' elif geometryType == 'nurbsSurface': geometryAttribute = 'create' else: raise Exception('Invalid geometry type (' + geometryType + ')!') # Get geometry points mPtList = glTools.utils.base.getMPointArray(geometry) ptList = [(i[0], i[1], i[2]) for i in mPtList] # Create nParticles nParticle = cmds.nParticle(p=ptList, n=prefix + '_nParticle') # Connect to geometry cmds.connectAttr(geometryTransform + '.worldMatrix[0]', nParticle + '.targetGeometryWorldMatrix', f=True) cmds.connectAttr(nParticle + '.targetGeometry', geometryShape + '.' + geometryAttribute, f=True) # Return result return nParticle
def locatorParticles(locList, particle, radius=1, selfCollide=False, rotatePP=False, scalePP=False): """ """ # Check locator list if not locList: return # Check particles if not particle: particle = 'particle1' if not cmds.objExists(particle): particle = cmds.nParticle(n=particle)[0] # Set Particle Object Attrs cmds.setAttr(particle + '.particleRenderType', 4) cmds.setAttr(particle + '.radius', cmds.floatSliderGrp('locParticle_radiusFSG', q=True, v=True)) cmds.setAttr(particle + '.selfCollide', cmds.checkBoxGrp('locParticle_selfCollideCBG', q=True, v1=True)) # Create particles ptList = [cmds.pointPosition(i) for i in locList] cmds.emit(o=particle, pos=ptList) # Add and Set RotatePP/ScalePP Values if rotatePP: # Check rotatePP attrs if not cmds.objExists(particle + '.rotatePP'): addRotatePP(particle) # Set rotatePP attrs for i in range(len(locList)): rot = cmds.getAttr(locList[i] + '.r') cmds.particle(particle, e=True, at='rotatePP', id=i, vv=rot[0]) if scalePP: # Check scalePP attrs if not cmds.objExists(particle + '.scalePP'): addScalePP(particle) # Set scalePP attrs for i in range(len(locList)): scl = cmds.getAttr(locList[i] + '.s') cmds.particle(particle, e=True, at='scalePP', id=i, vv=scl[0]) # Save Initial State cmds.saveInitialState(particle)
def createParticleSystem_goal(): # Create a constant sized particle object following a deformed torus shape (using goal) cmds.file(new=True, force=True) # Create a torus, we will use it as goal xrez = 14 yrez = 8 goalTorus = cmds.polyTorus( r=1, sr=0.5, tw=0, sx=xrez, sy=yrez, ax=(0, 1, 0), cuv=1, ch=0)[0] # nParticle creation depends on an optoinVar value, make sure we use the default one cmds.optionVar( sv=("NParticleStyle","Points") ) # Emit a lot of particle, the actual number will be limited to the max particle attribute in the particleShape emitter = cmds.emitter(dx=1, dy=0, dz=0, sp=0.1, pos=(0, 5, 0),rate=2500)[0] particleSystem, particleSystemShape = cmds.nParticle(n="nParticle_test_goal") cmds.setAttr('%s.lfm' % particleSystemShape, 0) # live forever cmds.setAttr('%s.particleRenderType' % particleSystemShape, 7) # Blobby, to see radius cmds.setAttr('%s.maxCount' % particleSystemShape, xrez*yrez) # max count is the number of vertices on the torus cmds.connectDynamic( particleSystemShape, em=emitter) # Create Goal cmds.goal(particleSystem, w=1, utr=0, g=goalTorus); # Create Initial state to we start with the correct amount of particle # NOTE: When using this script in command line, the first frame is not correctly evaluated and the particleShape is empty # This doesn't happens in interactive maya for i in range(1, 10): cmds.currentTime(i) cmds.saveInitialState(particleSystemShape) cmds.currentTime(1) bend, bendHandle = cmds.nonLinear( goalTorus, type="bend", lowBound=-1, highBound=1, curvature=0) cmds.setAttr( "%s.rotateZ" % bendHandle, 90) cmds.setKeyframe( "%s.curvature" % bend, v=0, t=1, inTangentType="flat", outTangentType="flat") cmds.setKeyframe( "%s.curvature" % bend, v=-130, t=12, inTangentType="flat", outTangentType="flat") cmds.setKeyframe( "%s.curvature" % bend, v=130, t=24, inTangentType="flat", outTangentType="flat") # Make the bend animation loop cmds.setInfinity( bend, poi="oscillate", attribute="curvature") return particleSystem, particleSystemShape
def nCacher(nParticleShape = []): """ nCacher, how it works? Iterate through specified nParticleShape (iterate from start frame until the frame it emits first particle) By doing this, Maya won't crash when caching nParticles particularly Sprites with expressions. """ if type(nParticleShape) == str: nParticleShape = [nParticleShape] elif type(nParticleShape) == list: nParticleShape = nParticleShape else: nParticleShape = False approved_nParticleShape = [] if nParticleShape: # Get timeslider min and max startFrame = cmds.playbackOptions(min = 1, q = True) endFrame = cmds.playbackOptions(max = 1, q = True) for each in nParticleShape: if cmds.objExists(each): cmds.currentTime(startFrame) while True: ppCount = cmds.nParticle(each, count = True, q = True) frame = cmds.currentTime(q = True) if ppCount == 0: if frame < endFrame: cmds.currentTime(frame + 1) else: break else: cmds.currentTime(frame + 1) approved_nParticleShape.append(each) break return approved_nParticleShape
def softBody(geometry,prefix=''): ''' ''' # Check prefix if not prefix: prefix = geometry # Check geometry geometryType = mc.objectType(geometry) if geometryType == 'transform': geometryTransform = geometry geometryShapes = glTools.utils.shape.getShapes(geometry,nonIntermediates=True,intermediates=False) if not geometryShapes: raise Exception('No valid geometry shapes found!') geometryShape = geometryShapes[0] else: geometryTransform = mc.listRelatives(geometry,p=True)[0] geometryShape = geometry # Check geometry type geometryType = mc.objectType(geometryShape) if geometryType == 'mesh': geometryAttribute = 'inMesh' elif geometryType == 'nurbsCurve': geometryAttribute = 'create' elif geometryType == 'nurbsSurface': geometryAttribute = 'create' else: raise Exception('Invalid geometry type ('+geometryType+')!') # Get geometry points mPtList = glTools.utils.base.getMPointArray(geometry) ptList = [(i[0],i[1],i[2]) for i in mPtList] # Create nParticles nParticle = mc.nParticle(p=ptList,n=prefix+'_nParticle') # Connect to geometry mc.connectAttr(geometryTransform+'.worldMatrix[0]',nParticle+'.targetGeometryWorldMatrix',f=True) mc.connectAttr(nParticle+'.targetGeometry',geometryShape+'.'+geometryAttribute,f=True) # Return result return nParticle
def rotationStart(): global asT asT = cmds.playbackOptions(query=True, min=True) global aeT aeT = cmds.playbackOptions(query=True, max=True) resetLoopTime() global listObjects listObjects = cmds.ls(sl=True) if (len(listObjects) <= 1): print "\n||| Need to select two or more objects |||\n" else: #|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| global listFixed listFixed = listObjects[:] for i in range(len(listFixed)): listFixed[i] = listFixed[i].replace("|", "_") listFixed[i] = listFixed[i].replace(":", "_") #|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| global mainLayerName mainLayerName = "OVERLAPPY" if (cmds.objExists(mainLayerName)): print "\n||| OVERLAPPY start |||\n" else: cmds.animLayer(mainLayerName) print "\n||| OVERLAPPY start ||| Layer created |||\n" #|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| for i in range(len(listFixed)): if (i + 1 != len(listFixed)): global zeroLoc zeroLoc = listFixed[i] + "_base_loc" global aimLoc aimLoc = listFixed[i] + "_aim_loc" global tempLoc tempLoc = listFixed[i] + "_temp_loc" global tempAimLoc tempAimLoc = listFixed[i] + "_tempAim_loc" global tempPart tempPart = listFixed[i] + "_temp_part" global tempNucl tempNucl = "nucleus1" global partRtype partRtype = tempPart + "Shape.particleRenderType" global partRrad partRrad = tempPart + "Shape.radius" global partRsm partRsm = tempPart + "Shape.goalSmoothness" global partRwe partRwe = tempPart + "Shape.goalWeight[0]" global partNucl partNucl = tempNucl + ".timeScale" global nuclStart nuclStart = tempNucl + ".startFrame" if aimVectorReverse: rotAimVector = -1 else: rotAimVector = 1 #|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| cmds.spaceLocator(n=zeroLoc) cmds.spaceLocator(n=aimLoc) cmds.spaceLocator(n=tempLoc) cmds.matchTransform(zeroLoc, listObjects[i], pos=True) cmds.matchTransform(tempLoc, listObjects[i + 1], pos=True) cmds.select(tempLoc, r=True) cmds.duplicate(n=tempAimLoc) cmds.select(listObjects[0], r=True) cmds.select(zeroLoc, add=True) cmds.parentConstraint(mo=True, w=1) cmds.select(aimLoc, r=True) cmds.select(zeroLoc, add=True) cmds.parent(r=True) cmds.select(listObjects[1], r=True) cmds.select(tempLoc, add=True) cmds.parentConstraint(mo=True, sr=["x", "y", "z"], w=1) aimPosName = tempLoc + ".translate" partCenter = tempPart + ".center" aimLocPos = tempAimLoc + ".translate" aimPos = cmds.getAttr(aimPosName) cmds.nParticle(p=aimPos, n=tempPart, c=1) cmds.goal(tempPart, w=0.5, utr=1, g=tempLoc) cmds.connectAttr(partCenter, aimLocPos, f=True) cmds.select(tempAimLoc, r=True) cmds.select(aimLoc, add=True) cmds.aimConstraint(w=1, aim=(0, rotAimVector, 0), u=(0, 1, 0), wut="vector", wu=(0, 1, 0), sk="y") #|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| cmds.setAttr(partRtype, pShape) cmds.setAttr(partRrad, pRad) cmds.setAttr(partRsm, goalSmoothRot) cmds.setAttr(partRwe, goalWRot) cmds.setAttr(partNucl, timeScaleRot) cmds.setAttr(nuclStart, asT) #|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| global minLoopTime minLoopTime = aeT * -3 global maxLoopTime maxLoopTime = aeT * 4 if (cycle): cmds.setAttr(nuclStart, minLoopTime) cmds.bakeResults(zeroLoc, t=(asT, aeT), sm=True, at=("translate", "rotate")) cmds.bakeResults(aimLoc, t=(minLoopTime, maxLoopTime), sm=True, at="rotate") cmds.delete(tempAimLoc, tempLoc, tempPart, tempNucl) zeroParent = zeroLoc + "_parentConstraint1" cmds.delete(zeroParent) setTimeToMin() cmds.select(aimLoc, r=True) cmds.select(listObjects[i], add=True) #|||||||||||||||||||||||||||||||||||||||||||||||||||||||||| attrX = listObjects[i] + '.rotateX' attrY = listObjects[i] + '.rotateY' attrZ = listObjects[i] + '.rotateZ' lockX = cmds.getAttr(attrX, lock=True) lockY = cmds.getAttr(attrY, lock=True) lockZ = cmds.getAttr(attrZ, lock=True) if (lockX != True): cmds.parentConstraint(mo=True, st=["x", "y", "z"], sr=["y", "z"], w=1) if (lockY != True): cmds.parentConstraint(mo=True, st=["x", "y", "z"], sr=["x", "z"], w=1) if (lockZ != True): cmds.parentConstraint(mo=True, st=["x", "y", "z"], sr=["x", "y"], w=1) resetLoopTime() else: cmds.bakeResults(zeroLoc, t=(asT, aeT), sm=True, at=("translate", "rotate")) cmds.bakeResults(aimLoc, t=(asT, aeT), sm=True, at="rotate") cmds.delete(tempAimLoc, tempLoc, tempPart, tempNucl) zeroParent = zeroLoc + "_parentConstraint1" cmds.delete(zeroParent) resetLoopTime() cmds.select(aimLoc, r=True) cmds.select(listObjects[i], add=True) #|||||||||||||||||||||||||||||||||||||||||||||||||||||||||| attrX = listObjects[i] + '.rotateX' attrY = listObjects[i] + '.rotateY' attrZ = listObjects[i] + '.rotateZ' lockX = cmds.getAttr(attrX, lock=True) lockY = cmds.getAttr(attrY, lock=True) lockZ = cmds.getAttr(attrZ, lock=True) if (lockX != True): cmds.parentConstraint(mo=True, st=["x", "y", "z"], sr=["y", "z"], w=1) if (lockY != True): cmds.parentConstraint(mo=True, st=["x", "y", "z"], sr=["x", "z"], w=1) if (lockZ != True): cmds.parentConstraint(mo=True, st=["x", "y", "z"], sr=["x", "y"], w=1) #|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| layerBase = "rotate_" layerName = layerBase + listFixed[i] layerComp = listFixed[i] + '_layer_{0}'.format("0") if (cmds.objExists(layerName)): cmds.bakeResults(listObjects[i], t=(asT, aeT), sm=True, bol=True, at="rotate") cmds.select(listObjects[i], r=True) if (cycleInfinity): cmds.setInfinity(pri="cycle", poi="cycle") else: cmds.setInfinity(pri="constant", poi="constant") cmds.delete(aimLoc, zeroLoc) cmds.container("BakeResultsContainer", e=True, rc=True) cmds.animLayer("BakeResults", e=True, p=layerName) cmds.rename("BakeResults", layerComp) #cmds.deleteAttr( n=listObjects[i], at="blendParent1" ) resetLoopTime() else: cmds.animLayer(layerName) cmds.animLayer(layerName, e=True, p=mainLayerName) cmds.bakeResults(listObjects[i], t=(asT, aeT), sm=True, bol=True, at="rotate") cmds.select(listObjects[i], r=True) if (cycleInfinity): cmds.setInfinity(pri="cycle", poi="cycle") else: cmds.setInfinity(pri="constant", poi="constant") cmds.delete(aimLoc, zeroLoc) cmds.container("BakeResultsContainer", e=True, rc=True) cmds.animLayer("BakeResults", e=True, p=layerName) cmds.rename("BakeResults", layerComp) #cmds.deleteAttr( n=listObjects[i], at="blendParent1" ) resetLoopTime() cmds.select(d=True) for l in listObjects: cmds.select(l, add=True) print "\n||| OVERLAPPY end |||\n"
global partRsm; partRsm = tempPart + "Shape.goalSmoothness" # Goal smoothness pull global partRwe; partRwe = tempPart + "Shape.goalWeight[0]" # Goal weight pull global partPos; partPos = tempPart + ".center" # nParticle center position pull global partNucl; partNucl = tempNucl + ".timeScale" # Time scale pull global nuclStart; nuclStart = tempNucl + ".startFrame" # Start frame of simulation nucleus node cmds.spaceLocator( n = tempLoc ) cmds.matchTransform( tempLoc, listObjects[i], pos=True ) objCenter = tempLoc + ".translate" objC = cmds.getAttr( objCenter ) locCenter = tempLoc + ".center" locTr = tempLoc + ".translate" cmds.nParticle( p = objC, n = tempPart , c = 1 ) cmds.goal( tempPart, w=goalW, utr=1, g = tempLoc ) cmds.select( tempLoc, r=True ) cmds.select( listObjects[i], add=True ) cmds.parent( r=True ) cmds.matchTransform( tempLoc, listObjects[i], pos=True ) #|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| cmds.setAttr( partRtype, pShape ) cmds.setAttr( partRrad, pRad ) cmds.setAttr( partRsm, goalSmooth ) cmds.setAttr( partRwe, goalW ) cmds.setAttr( partNucl, timeScale )
\par #======================================================================= \par \par start = cmds.playbackOptions(q=1,min=1)\par end = cmds.playbackOptions(q=1,max=1)\par \par for f in range(int(start) , int(end + 1)):\par cmds.currentTime(f, e=1)\par if cmds.getAttr(nPart_[0]+'.id')>0:\par parid_= cmds.getAttr(nPart_[0]+'.id')\par for i in range(int(lastPid_)+1):\par if float(i) in parid_:\par posat_= mel.eval("particleInstancer -name %s -q -position %s;" %(insName_[0], nPart_[0])) \par rotat_= mel.eval("particleInstancer -name %s -q -rotation %s;" %(insName_[0], nPart_[0]))\par radat_= mel.eval("particleInstancer -name %s -q -scale %s;" %(insName_[0], nPart_[0]))\par pos_ = cmds.nParticle(nPart_, id= int(i), q=1, at= posat_)\par rot_ = cmds.nParticle(nPart_, id= int(i), q=1, at= rotat_)\par rad_ = cmds.nParticle(nPart_, id= int(i), q=1, at= radat_)\par cmds.setAttr(allobj_[int(i)]+'.translate', pos_[0], pos_[1], pos_[2], type="double3")\par cmds.setAttr(allobj_[int(i)]+'.rotate', rot_[0], rot_[1], rot_[2], type="double3")\par cmds.setAttr(allobj_[int(i)]+'.scale', rad_[0], rad_[0], rad_[0], type="double3")\par cmds.setAttr(allobj_[int(i)]+'.visibility', 1)\par cmds.setKeyframe(allobj_[int(i)])\par else:\par cmds.setAttr(allobj_[int(i)]+'.visibility', 0)\par cmds.setKeyframe(allobj_[int(i)])\par \par \par \par \par \par
def translationStart(): global asT; asT = cmds.playbackOptions( query=True, min=True ) # Get min anim range global aeT; aeT = cmds.playbackOptions( query=True, max=True ) # Get max anim range resetLoopTime() global listObjects; listObjects = cmds.ls( sl=True ) # Get list of selected objects #|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| global listFixed; listFixed = listObjects [:] for i in range( len( listFixed ) ): listFixed[i] = listFixed[i].replace( "|", "_" ) listFixed[i] = listFixed[i].replace( ":", "_" ) #|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| global mainLayerName; mainLayerName = "OVERLAPPY" # Name of main layer if( cmds.objExists( mainLayerName ) ): print "\n||| OVERLAPPY start |||\n" else: cmds.animLayer( mainLayerName ) print "\n||| OVERLAPPY start ||| Layer created |||\n" #|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| for i in range( len( listFixed ) ): global aimLoc; aimLoc = listFixed[i] + "_aim_loc" # Aim locator name global tempLoc; tempLoc = listFixed[i] + "_temp_loc" # Physical locator name global tempPart; tempPart = listFixed[i] + "_temp_part" # nParticle name global tempNucl; tempNucl = "nucleus1" # Nucleus node name global partAimLoc; partAimLoc = aimLoc + ".translate" # Aim locator position pull global partRtype; partRtype = tempPart + "Shape.particleRenderType" # nParticle render type pull global partRrad; partRrad = tempPart + "Shape.radius" # nParticle shape radius global partRsm; partRsm = tempPart + "Shape.goalSmoothness" # Goal smoothness pull global partRwe; partRwe = tempPart + "Shape.goalWeight[0]" # Goal weight pull global partPos; partPos = tempPart + ".center" # nParticle center position pull global partNucl; partNucl = tempNucl + ".timeScale" # Time scale pull global nuclStart; nuclStart = tempNucl + ".startFrame" # Start frame of simulation nucleus node cmds.spaceLocator( n = tempLoc ) cmds.matchTransform( tempLoc, listObjects[i], pos=True ) objCenter = tempLoc + ".translate" objC = cmds.getAttr( objCenter ) locCenter = tempLoc + ".center" locTr = tempLoc + ".translate" cmds.nParticle( p = objC, n = tempPart , c = 1 ) cmds.goal( tempPart, w=goalW, utr=1, g = tempLoc ) cmds.select( tempLoc, r=True ) cmds.select( listObjects[i], add=True ) cmds.parent( r=True ) cmds.matchTransform( tempLoc, listObjects[i], pos=True ) #|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| cmds.setAttr( partRtype, pShape ) cmds.setAttr( partRrad, pRad ) cmds.setAttr( partRsm, goalSmooth ) cmds.setAttr( partRwe, goalW ) cmds.setAttr( partNucl, timeScale ) cmds.setAttr( nuclStart, asT ) #|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| cmds.duplicate( tempLoc, rr=True, n = aimLoc ) cmds.select( aimLoc, r=True ) cmds.parent( w=True ) cmds.connectAttr( partPos, partAimLoc, f=True ) global minLoopTime; minLoopTime = aeT * minLoopScale global maxLoopTime; maxLoopTime = aeT * maxLoopScale if( cycle ): cmds.setAttr( nuclStart, minLoopTime ) cmds.bakeResults( aimLoc, t = ( minLoopTime, maxLoopTime ), sm=True, at = "translate") cmds.delete( tempLoc, tempPart, tempNucl ) setTimeToMin() cmds.select( aimLoc, r=True ) cmds.select( listObjects[i], add=True ) cmds.parentConstraint( mo=True, sr=["x", "y", "z"], w = 1 ) resetLoopTime() else: cmds.bakeResults( aimLoc, t = ( asT, aeT ), sm=True, at = "translate" ) cmds.delete( tempLoc, tempPart, tempNucl ) resetLoopTime() cmds.select( aimLoc, r=True ) cmds.select( listObjects[i], add=True ) #|||||||||||||||||||||||||||||||||||||||||||||||||||||||||| attrX = listObjects[i] + '.translateX' attrY = listObjects[i] + '.translateY' attrZ = listObjects[i] + '.translateZ' lockX = cmds.getAttr( attrX, lock=True ) lockY = cmds.getAttr( attrY, lock=True ) lockZ = cmds.getAttr( attrZ, lock=True ) if ( lockX != True ): cmds.parentConstraint( mo=True, st=["y","z"], sr=["x","y","z"], w = 1 ) if ( lockY != True ): cmds.parentConstraint( mo=True, st=["x","z"], sr=["x","y","z"], w = 1 ) if ( lockZ != True ): cmds.parentConstraint( mo=True, st=["x","y"], sr=["x","y","z"], w = 1 ) #|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| layerBase = "translate_" layerName = layerBase + listFixed[i] layerComp = listFixed[i] + '_layer_{0}'.format("0") if ( cmds.objExists( layerName ) ): cmds.bakeResults( listObjects[i], t = (asT, aeT), sm=True, bol=True, at = "translate") cmds.select( listObjects[i], r=True ) if (cycleInfinity): cmds.setInfinity( pri="cycle", poi="cycle" ) else: cmds.setInfinity( pri="constant", poi="constant" ) cmds.delete( aimLoc ) cmds.container( "BakeResultsContainer", e=True, rc=True ) cmds.animLayer( "BakeResults", e=True, p = layerName ) cmds.rename( "BakeResults", layerComp ) #cmds.deleteAttr( n=listObjects[i], at="blendParent1" ) resetLoopTime() else: cmds.animLayer (layerName) cmds.animLayer (layerName, e=True, p = mainLayerName) cmds.bakeResults (listObjects[i], t = (asT, aeT), sm=True, bol=True, at = "translate") cmds.select (listObjects[i], r=True) if (cycleInfinity): cmds.setInfinity( pri="cycle", poi="cycle" ) else: cmds.setInfinity( pri="constant", poi="constant" ) cmds.delete (aimLoc) cmds.container("BakeResultsContainer", e=True, rc=True) cmds.animLayer ("BakeResults", e=True, p = layerName) cmds.rename ("BakeResults", layerComp) #cmds.deleteAttr( n=listObjects[i], at="blendParent1" ) resetLoopTime() cmds.select (d=True) for l in listObjects: cmds.select (l, add=True) print "\n||| OVERLAPPY end |||\n"
def rotate_simulation(): ######## Need to remove obj.simState = obj.prefix_base_layer[2] obj.playback_range_initialization() obj.reset_range_time() obj.list_objects = cmds.ls(sl = True) obj.list_fixed = obj.list_objects [:] if (len(obj.list_objects) <= 1): print obj.myError, "Need to select 2 or more objects" else: print obj.myMessage, "Selected {0} objects (the last element is discarded)".format(len(obj.list_objects) - 1) obj.setup_progressbar(len(obj.list_objects) - 1) # start progress bar window obj.create_overlappy_layer() obj.replaceSymbols() for i in range(len(obj.list_fixed)-1): #### Set names #### ########## Need to create method obj.main_set_names(i) #### Create main logic #### if obj.aim_vector_reverse: obj.rotAimVector = -1 else: obj.rotAimVector = 1 ## Create locators ## cmds.spaceLocator(n = obj.base_locator) cmds.matchTransform (obj.base_locator, obj.list_objects[i], pos = True, rot = True) cmds.duplicate(obj.base_locator, n = obj.base_aim_locator) cmds.parent(obj.base_aim_locator, obj.base_locator, a = True) cmds.duplicate(obj.base_aim_locator, n = obj.offset_aim_locator) cmds.parentConstraint(obj.list_objects[i], obj.base_locator, mo = True, w = 1) cmds.spaceLocator(n = obj.goal_locator) cmds.matchTransform (obj.goal_locator, obj.list_objects[i + 1], pos = True, rot = True) cmds.parentConstraint(obj.list_objects[i + 1], obj.goal_locator, mo = True, w = 1) cmds.spaceLocator(n = obj.goal_aim_locator) ## Create particle and nucleus ## obj.goal_position = cmds.getAttr(obj.goal_locator + ".translate") cmds.nParticle(p = obj.goal_position, n = obj.np_name, c = 1) cmds.goal(obj.np_name, w = obj.T_goal_weight, utr = 1, g = obj.goal_locator) ## Create connections ## cmds.connectAttr(obj.np_center, obj.goal_aim_locator_pos, f = True) cmds.aimConstraint(obj.goal_aim_locator, obj.base_aim_locator, w = 1, aim = (0, obj.rotAimVector, 0), u = (0, 1, 0), wut = "vector", wu = (0, 1, 0), sk = "y") cmds.parentConstraint(obj.base_aim_locator, obj.offset_aim_locator, mo = True, st=["x","y","z"], w = 1) #### Layers, connections, baking, copy/paste #### obj.get_nonLocked_attributes(i) cmds.select(d = True) cmds.progressBar(obj.progressControl, edit = True, step = obj.progressBar_step_value) #### Select list in initial order, close progressbar #### for l in obj.list_objects: cmds.select (l, add = True) obj.close_progressbar() print obj.myMessage, obj.root_layer_name, "ends simulation" obj.simState = obj.prefix_base_layer[0]
def positionStart(): global asT asT = cmds.playbackOptions(query=True, min=True) # Левая граница анимации global aeT aeT = cmds.playbackOptions(query=True, max=True) # Правая граница анимации resetLoopTime() global listObjects listObjects = cmds.ls(sl=True) # Список трансформов #|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| global listFixed listFixed = listObjects[:] for i in range(len(listFixed)): listFixed[i] = listFixed[i].replace("|", "_") #|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| global mainLayerName mainLayerName = "OVERLAPPER" # Имя главного слоя if (cmds.objExists(mainLayerName)): print "\n||| OVERLAPPER start |||\n" else: cmds.animLayer(mainLayerName) print "\n||| OVERLAPPER start ||| Layer created |||\n" #|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| for i in range(len(listFixed)): # Основной цикл global aimLoc aimLoc = listFixed[i] + "_aim_loc" # Имя аим локатора global tempLoc tempLoc = listFixed[i] + "_temp_loc" # Имя физ локатора global tempPart tempPart = listFixed[i] + "_temp_part" # Имя физ частицы global tempNucl tempNucl = "nucleus1" # Имя физ ноды global partAimLoc partAimLoc = aimLoc + ".translate" # Обращение к позиции аим локатора global partRtype partRtype = tempPart + "Shape.particleRenderType" # Обращение к типу отображения частицы global partRrad partRrad = tempPart + "Shape.radius" # Обращение к размеру частицы global partRsm partRsm = tempPart + "Shape.goalSmoothness" # Обращение к мягкости физики global partRwe partRwe = tempPart + "Shape.goalWeight[0]" # Обращение к весу ноды global partPos partPos = tempPart + ".center" # Обращение к центру частицы global partNucl partNucl = tempNucl + ".timeScale" # Обращение к скейлу времени физ ноды global nuclStart nuclStart = tempNucl + ".startFrame" # Обращение к старту симуляции физ ноды cmds.spaceLocator(n=tempLoc) # Создаём физ локатор cmds.matchTransform(tempLoc, listObjects[i], pos=True) # Перемещаем локатор в пивот объекта objCenter = tempLoc + ".translate" # Обращение к центру объекта objC = cmds.getAttr(objCenter) # Записываем центр объекта locCenter = tempLoc + ".center" # Обращение к центру физ локатора locTr = tempLoc + ".translate" # Обращение к позиции физ локатора cmds.nParticle(p=objC, n=tempPart, c=1) # Создаём частицу в целевой позиции cmds.goal(tempPart, w=goalW, utr=1, g=tempLoc) # Создаём физическую связь cmds.select(tempLoc, r=True) # Выделяем физ локатор cmds.select(listObjects[i], add=True) # Выделяем целевого родителя cmds.parent(r=True) # Создаём иерархию cmds.matchTransform(tempLoc, listObjects[i], pos=True) # Перемещаем локатор в пивот объекта #|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| cmds.setAttr(partRtype, pShape) cmds.setAttr(partRrad, pRad) cmds.setAttr(partRsm, goalSmooth) cmds.setAttr(partRwe, goalW) cmds.setAttr(partNucl, timeScale) cmds.setAttr(nuclStart, asT) #|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| cmds.duplicate(tempLoc, rr=True, n=aimLoc) # Дублируем локатор cmds.select(aimLoc, r=True) # Выделяем аим локатор cmds.parent(w=True) # Разбираем иерархию cmds.connectAttr(partPos, partAimLoc, f=True) # Привязываем аим локатор к частице global minLoopTime minLoopTime = aeT * -2 global maxLoopTime maxLoopTime = aeT * 2 if (cycle): #cmds.playbackOptions (e=True, min=minLoopTime, max=maxLoopTime) cmds.setAttr(nuclStart, minLoopTime) #setTimeToMin() cmds.bakeResults( aimLoc, t=(minLoopTime, maxLoopTime), sm=True, at="translate") # Запекание аим локатора для цикла cmds.delete(tempLoc, tempPart, tempNucl) # Удаляем объекты физики #cmds.select (aimLoc, r=True) # Выделяем аим локатор #cmds.keyframe (tc = (aeT*-2), r=True) # Сдвигаем тройной цикл на один проход влево #cmds.setInfinity (pri="cycle", poi="cycle") setTimeToMin() cmds.select(aimLoc, r=True) # Выделяем аим локатор как родителя cmds.select(listObjects[i], add=True) # Выделяем объект как подчиненного cmds.parentConstraint(mo=True, sr=["x", "y", "z"], w=1) # Создаём позиционный констрейн resetLoopTime() else: cmds.bakeResults( aimLoc, t=(asT, aeT), sm=True, at="translate") # Запекание аим локатора для линейной анимации cmds.delete(tempLoc, tempPart, tempNucl) # Удаляем объекты физики resetLoopTime() cmds.select(aimLoc, r=True) # Выделяем аим локатор как родителя cmds.select(listObjects[i], add=True) # Выделяем объект как подчиненного cmds.parentConstraint(mo=True, sr=["x", "y", "z"], w=1) # Создаём позиционный констрейн #|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| layerBase = "overlap_" # Имя базы слоя layerName = layerBase + listFixed[i] # Имя слоя layerComp = listFixed[i] + '_layer_{0}'.format( "0") # Имя компонента слоя if (cmds.objExists(layerName)): cmds.bakeResults(listObjects[i], t=(asT, aeT), sm=True, bol=True, at="translate") # Запекаем объект в слой cmds.select(listObjects[i], r=True) cmds.setInfinity(pri="cycle", poi="cycle") cmds.delete(aimLoc) # Удаляем объекты скрипта cmds.container("BakeResultsContainer", e=True, rc=True) # Удаляем контейнер cmds.animLayer( "BakeResults", e=True, p=layerName ) # Переносим слой с анимацией в основной слой объекта cmds.rename("BakeResults", layerComp) # Переименовываем слой resetLoopTime() else: cmds.animLayer( layerName) # Создаём пустой слой для всех оверлапов объекта cmds.animLayer( layerName, e=True, p=mainLayerName) # Переносим базу слоя в главный слой cmds.bakeResults(listObjects[i], t=(asT, aeT), sm=True, bol=True, at="translate") # Запекаем объект в слой cmds.select(listObjects[i], r=True) cmds.setInfinity(pri="cycle", poi="cycle") cmds.delete(aimLoc) # Удаляем объекты скрипта cmds.container("BakeResultsContainer", e=True, rc=True) # Удаляем контейнер cmds.animLayer( "BakeResults", e=True, p=layerName ) # Переносим слой с анимацией в основной слой объекта cmds.rename("BakeResults", layerComp) # Переименовываем слой resetLoopTime() cmds.select(d=True) # Деселект for l in listObjects: cmds.select(l, add=True) print "\n||| OVERLAPPER end |||\n"
def rotationStart(): global asT asT = cmds.playbackOptions(query=True, min=True) # Левая граница анимации global aeT aeT = cmds.playbackOptions(query=True, max=True) # Правая граница анимации resetLoopTime() global listObjects listObjects = cmds.ls(sl=True) # Список трансформов if (len(listObjects) <= 1): print "\n||| Need to select two or more objects |||\n" else: #|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| global listFixed listFixed = listObjects[:] for i in range(len(listFixed)): listFixed[i] = listFixed[i].replace("|", "_") #|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| global mainLayerName mainLayerName = "OVERLAPPY" # Имя главного слоя if (cmds.objExists(mainLayerName)): print "\n||| OVERLAPPY start |||\n" else: cmds.animLayer(mainLayerName) print "\n||| OVERLAPPY start ||| Layer created |||\n" #|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| for i in range(len(listFixed)): # Основной цикл if (i + 1 != len(listFixed)): global zeroLoc zeroLoc = listFixed[i] + "_base_loc" # Имя нулевого локатора global aimLoc aimLoc = listFixed[i] + "_aim_loc" # Имя следящего локатора global tempLoc tempLoc = listFixed[i] + "_temp_loc" # Имя физического локатора global tempAimLoc tempAimLoc = listFixed[ i] + "_tempAim_loc" # Имя целевого локатора global tempPart tempPart = listFixed[i] + "_temp_part" # Имя частицы global tempNucl tempNucl = "nucleus1" # Имя физической ноды global partRtype partRtype = tempPart + "Shape.particleRenderType" # Обращение к типу отображения частицы global partRrad partRrad = tempPart + "Shape.radius" # Обращение к размеру частицы global partRsm partRsm = tempPart + "Shape.goalSmoothness" # Обращение к мягкости физики global partRwe partRwe = tempPart + "Shape.goalWeight[0]" # Обращение к весу ноды global partNucl partNucl = tempNucl + ".timeScale" # Обращение к скейлу времени физ ноды global nuclStart nuclStart = tempNucl + ".startFrame" # Обращение к старту симуляции физ ноды #|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| cmds.spaceLocator(n=zeroLoc) # Создаём нулевой локатор cmds.spaceLocator(n=aimLoc) # Создаём следящий локатор cmds.spaceLocator(n=tempLoc) # Создаём физический локатор cmds.matchTransform( zeroLoc, listObjects[i], pos=True ) # Перемещаем нулевой локатор в пивот главного объекта cmds.matchTransform( tempLoc, listObjects[i + 1], pos=True ) # Перемещаем физический локатор в пивот целевого объекта cmds.select(tempLoc, r=True) # Выделяем физический локатор cmds.duplicate( n=tempAimLoc) # Дублируем его и создаём целевой локатор cmds.select(listObjects[0], r=True) # Выделяем главный объект cmds.select(zeroLoc, add=True) # Выделяем нулевой локатор cmds.parentConstraint(mo=True, w=1) # Создаём пэрент констрейн cmds.select(aimLoc, r=True) # Выделяем следящий локатор cmds.select(zeroLoc, add=True) # Выделяем нулевой локатор cmds.parent(r=True) # Создаём иерархию cmds.select(listObjects[1], r=True) # Выделяем целевой объект cmds.select(tempLoc, add=True) # Выделяем физический локатор cmds.parentConstraint(mo=True, sr=["x", "y", "z"], w=1) # Создаём позиционный констрейн aimPosName = tempLoc + ".translate" # Обращение к позиции физического локатора partCenter = tempPart + ".center" # Обращение к центру частицы aimLocPos = tempAimLoc + ".translate" # Обращение к позиции целевого локатора aimPos = cmds.getAttr( aimPosName) # Берём позицию физического локатора cmds.nParticle(p=aimPos, n=tempPart, c=1) # Создаём частицу в целевой позиции cmds.goal(tempPart, w=0.5, utr=1, g=tempLoc ) # Создаём физическую связь с физическим локатором cmds.connectAttr( partCenter, aimLocPos, f=True) # Привязываем целевой локатор к частице cmds.select(tempAimLoc, r=True) # Выделяем целевой локатор cmds.select(aimLoc, add=True) # Выделяем следящий локатор cmds.aimConstraint( w=1, aim=(0, 1, 0), u=(0, 1, 0), wut="vector", wu=(0, 1, 0), sk="y") # Создаём аим констреён по двум осям #|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| cmds.setAttr(partRtype, pShape) cmds.setAttr(partRrad, pRad) cmds.setAttr(partRsm, goalSmoothRot) cmds.setAttr(partRwe, goalWRot) cmds.setAttr(partNucl, timeScaleRot) cmds.setAttr(nuclStart, asT) #|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| global minLoopTime minLoopTime = aeT * -2 global maxLoopTime maxLoopTime = aeT * 2 if (cycleRot): cmds.setAttr(nuclStart, minLoopTime) cmds.bakeResults( zeroLoc, t=(asT, aeT), sm=True, at=("translate", "rotate")) # Запекание нулевого локатора для цикла cmds.bakeResults( aimLoc, t=(minLoopTime, maxLoopTime), sm=True, at="rotate") # Запекание аим локатора для цикла cmds.delete(tempAimLoc, tempLoc, tempPart, tempNucl) # Удаляем объекты физики zeroParent = zeroLoc + "_parentConstraint1" cmds.delete(zeroParent) setTimeToMin() cmds.select(aimLoc, r=True) # Выделяем аим локатор как родителя cmds.select(listObjects[i], add=True) # Выделяем объект как подчиненного cmds.parentConstraint(mo=True, st=["x", "y", "z"], w=1) # Создаём ротэйт констрейн resetLoopTime() else: cmds.bakeResults( zeroLoc, t=(asT, aeT), sm=True, at=("translate", "rotate") ) # Запекание нулевого локатора для линейной анимации cmds.bakeResults( aimLoc, t=(asT, aeT), sm=True, at="rotate" ) # Запекание аим локатора для линейной анимации cmds.delete(tempAimLoc, tempLoc, tempPart, tempNucl) # Удаляем объекты физики zeroParent = zeroLoc + "_parentConstraint1" cmds.delete(zeroParent) resetLoopTime() cmds.select(aimLoc, r=True) # Выделяем аим локатор как родителя cmds.select(listObjects[i], add=True) # Выделяем объект как подчиненного cmds.parentConstraint(mo=True, st=["x", "y", "z"], w=1) # Создаём ротэйт констрейн #|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| layerBase = "rotate_" # Имя базы слоя layerName = layerBase + listFixed[i] # Имя слоя layerComp = listFixed[i] + '_layer_{0}'.format( "0") # Имя компонента слоя if (cmds.objExists(layerName)): cmds.bakeResults(listObjects[i], t=(asT, aeT), sm=True, bol=True, at="rotate") # Запекаем объект в слой cmds.select(listObjects[i], r=True) cmds.setInfinity(pri="cycle", poi="cycle") cmds.delete(aimLoc, zeroLoc) # Удаляем объекты скрипта cmds.container("BakeResultsContainer", e=True, rc=True) # Удаляем контейнер cmds.animLayer( "BakeResults", e=True, p=layerName ) # Переносим слой с анимацией в основной слой объекта cmds.rename("BakeResults", layerComp) # Переименовываем слой cmds.deleteAttr(n=listObjects[i], at="blendParent1") resetLoopTime() else: cmds.animLayer( layerName ) # Создаём пустой слой для всех оверлапов объекта cmds.animLayer( layerName, e=True, p=mainLayerName) # Переносим базу слоя в главный слой cmds.bakeResults(listObjects[i], t=(asT, aeT), sm=True, bol=True, at="rotate") # Запекаем объект в слой cmds.select(listObjects[i], r=True) cmds.setInfinity(pri="cycle", poi="cycle") cmds.delete(aimLoc, zeroLoc) # Удаляем объекты скрипта cmds.container("BakeResultsContainer", e=True, rc=True) # Удаляем контейнер cmds.animLayer( "BakeResults", e=True, p=layerName ) # Переносим слой с анимацией в основной слой объекта cmds.rename("BakeResults", layerComp) # Переименовываем слой cmds.deleteAttr(n=listObjects[i], at="blendParent1") resetLoopTime() cmds.select(d=True) # Деселект for l in listObjects: cmds.select(l, add=True) print "\n||| OVERLAPPY end |||\n"