''' #Adding Fields ''' gravity -pos 0 0 0 -m 9.8 -att 0 -dx 0 -dy -1 -dz 0 -mxd -1 -vsh none -vex 0 -vof 0 0 0 -vsw 360 -tsr 0.5 ; // gravityField1 // #Select particles before adding in fields ''' # Placement (xform command) # emit and part cmds.select('droplets') drop_grav = cmds.gravity('droplets', m=15, dy=-1) cmds.connectDynamic('droplets', f='gravityField1') #Reselect Particles cmds.select('droplets') radial_drop = cmds.radial('droplets', m=0.010) cmds.connectDynamic(part[0], f=radial_drop[0]) #Create Partilce Mist from the Particle Tool mist_part_1 = cmds.particle(n='mist', c=0) mist_part_2 = cmds.particle(n='mist1', c=0) cmds.select('mist') cmds.connectDynamic(mist_part_1[0], em=emit[0]) cmds.select('mist1') cmds.connectDynamic('mist1', em=emit[0]) #Add gravityField1 and radialField1 to mist and mist1 through dynamicRelationship editor cmds.select('mist') cmds.connectDynamic('mist', f='gravityField1') cmds.connectDynamic('mist', f='radialField1') cmds.select('mist1')
def __init__(self, prefix, mesh): ## Create ctrl for bubbles self.bubbleCtrlShape = cmds.createNode( 'implicitSphere', name = '%s_%sShape' % (prefix, self.BUBBLE_CTRL_NAME) ) self.bubbleCtrl = cmds.listRelatives(self.bubbleCtrlShape, parent = True, fullPath = True) self.bubbleCtrl = cmds.rename( self.bubbleCtrl, '%s_%s' % (prefix, self.BUBBLE_CTRL_NAME) ) self.bubbleCtrlGroup = cmds.group( self.bubbleCtrl, name = '%s_%s' % (prefix, self.BUBBLE_CTRL_OFFSET_GRP) ) ## Space locator with speed attribute self.speedLocator = cmds.spaceLocator( name = '%s_%s' % (prefix, self.LOCATOR_NAME) )[0] cmds.addAttr(self.speedLocator, longName = 'speed', attributeType = 'double') cmds.setAttr('%s.speed' % self.speedLocator, keyable = True) ################################################################################################### ## Creation self.bubble, self.bubbleShape = cmds.particle(name = '%s_%s' % (prefix, self.BUBBLE_NAME) ) ## Set presets for attr, val in self.BUBBLE_PRESET_ATTRS.iteritems(): cmds.setAttr('%s.%s' % (self.bubbleShape, attr), val) ## Create necessary PP attr and hook-up necsesary ramp info arrayMap, ramp = self.addAttrPP(particleShapeName = self.bubbleShape, attrPP = self.BUBBLE_ATTR_PP) ## Emitter cmds.select(mesh, replace = True) self.bubbleEmitter = cmds.emitter(type = 'surface', rate = 100, sro = 0, nuv = 0, cye = 'none', cyi = 1, spd = 1, srn = 0, nsp = 1, tsp = 0, mxd = 0, mnd = 0, dx = 1, dy = 0, dz = 0, sp = 0)[1] # elif _TYPE == 'volume': # cmds.select(clear = True) # self.bubbleEmitter = cmds.emitter(pos = [0, 0, 0], type = 'volume', r = 100, sro = 0, nuv = 0, cye = 'none', cyi = 1, spd = 1, srn = 0, nsp = 1, tsp = 0, mxd = 0, mnd = 0, dx = 0, dy = 0, dz = 0, sp = 0, vsh = 'sphere', vof = [0, 0, 0], vsw = 360, tsr = 0.5, afc = 1, afx = 1, arx = 0, alx = 0, rnd = 0, drs = 0, ssz = 0)[0] # cmds.setAttr('%s.scaleX' % self.bubbleEmitter, 0.2) # cmds.setAttr('%s.scaleY' % self.bubbleEmitter, 0.2) # cmds.setAttr('%s.scaleZ' % self.bubbleEmitter, 0.2) self.bubbleEmitter = cmds.rename(self.bubbleEmitter, '%s_%s' % (prefix, self.BUBBLE_EMITTER_NAME) ) cmds.connectDynamic(self.bubbleShape, emitters = self.bubbleEmitter) ################################################################################################### ## Creation self.bubbleBurst, self.bubbleBurstShape = cmds.particle(name = '%s_%s' % (prefix, self.BUBBLEBURST_NAME) ) ## Set presets for attr, val in self.BUBBLEBURST_PRESET_ATTRS.iteritems(): cmds.setAttr('%s.%s' % (self.bubbleBurstShape, attr), val) ## Create necessary PP attr and hook-up necsesary ramp info self.addAttrPP(particleShapeName = self.bubbleBurstShape, attrPP = self.BUBBLEBURST_ATTR_PP) cmds.select(self.bubbleShape, replace = True) self.bubbleBurstEmitter = cmds.emitter(type = 'omni', rate = 100, sro = 0, nuv = 0, cye = 'none', cyi = 1, spd = 1, srn = 0, nsp = 1, tsp = 0, mxd = 0, mnd = 0, dx = 1, dy = 0, dz = 0, sp = 0)[1] self.bubbleBurstEmitter = cmds.rename(self.bubbleBurstEmitter, '%s_%s' % (prefix, self.BUBBLEBURST_EMITTER_NAME) ) cmds.setAttr('%s.speed' % self.bubbleBurstEmitter, 0.4) cmds.addPP(self.bubbleBurstEmitter, attribute = 'rate') cmds.connectDynamic(self.bubbleBurstShape, emitters = self.bubbleBurstEmitter) ################################################################################################### ## Create necessary fields ## Uniform Field self.uniformField = cmds.uniform(name = '%s_%s' % (prefix, self.UNIFORM_FIELD_NAME), pos = [0, 0, 0], m = 2.5, att = 0, dx = 0, dy = 2, dz = 0, mxd = -1, vsh = 'none', vex = 0, vof = [0, 0, 0], vsw = 360, tsr = 0.5)[0] ## Turbulence Field self.turbulenceField = cmds.turbulence(name = '%s_%s' % (prefix, self.TURBULENCE_FIELD_NAME), pos = [0, 0, 0], m = 3, att = 0, f = 10, phaseX = 0, phaseY = 0, phaseZ = 0, noiseLevel = 0, noiseRatio = 0.707, mxd = -1, vsh = 'none', vex = 0, vof = [0, 0, 0], vsw = 360, tsr = 0.5)[0] ## Radial Field self.radialField = cmds.radial(name = '%s_%s' % (prefix, self.RADIAL_FIELD_NAME), pos = [0, 0, 0], m = 2, att = 1, typ = 0, mxd = 20, vsh = 'sphere', vex = 0, vof = [0, 0, 0], vsw = 360, tsr = 0.5)[0] ## Make necessary connections cmds.connectDynamic(self.bubbleShape, fields = self.uniformField) cmds.connectDynamic(self.bubbleBurstShape, fields = self.uniformField) cmds.connectDynamic(self.bubbleShape, fields = self.turbulenceField) cmds.connectDynamic(self.bubbleBurstShape, fields = self.turbulenceField) cmds.connectDynamic(self.bubbleShape, fields = self.radialField) cmds.connectDynamic(self.bubbleBurstShape, fields = self.radialField) ################################################################################################### self.bubbleGroup = cmds.group(self.bubbleCtrlGroup, self.bubble, self.bubbleBurst, self.uniformField, self.turbulenceField, self.radialField, self.bubbleEmitter, self.bubbleBurstEmitter, self.speedLocator, name = '%s_%s' % (prefix, self.BUBBLE_GROUP_NAME) ) cmds.parent(self.bubbleEmitter, self.speedLocator) cmds.pointConstraint(self.bubbleCtrl, self.speedLocator, maintainOffset = False) cmds.pointConstraint(cmds.listRelatives(mesh, parent = True, fullPath = True)[0], self.bubbleCtrlGroup, maintainOffset = False) cmds.setAttr('%s.scaleX' % self.radialField, 3.165) cmds.setAttr('%s.scaleY' % self.radialField, 3.165) cmds.setAttr('%s.scaleZ' % self.radialField, 3.165) attr = {'longName':'speed', 'niceName':' ', 'attributeType':'enum', 'enumName':'Speed:', 'keyable':False} self.add_custom_attrs(self.bubbleCtrl, **attr) attr = {'longName':'minSpeed', 'attributeType':'double', 'defaultValue':0.01, 'min':0} self.add_custom_attrs(self.bubbleCtrl, **attr) attr = {'longName':'maxSpeed', 'attributeType':'double', 'defaultValue':20} self.add_custom_attrs(self.bubbleCtrl, **attr) attr = {'longName':'useSpeed', 'niceName':'Use Speed', 'attributeType':'bool', 'defaultValue':0} self.add_custom_attrs(self.bubbleCtrl, **attr) attr = {'longName':'emitters', 'niceName':' ', 'attributeType':'enum', 'enumName':'Emitters:', 'keyable':False} self.add_custom_attrs(self.bubbleCtrl, **attr) attr = {'longName':'rate', 'niceName':'Rate', 'attributeType':'double', 'defaultValue':20, 'min':0} self.add_custom_attrs(self.bubbleCtrl, **attr) attr = {'longName':'splashMaxSpeed', 'niceName':'Splash Max Speed', 'attributeType':'double', 'defaultValue':0.1} self.add_custom_attrs(self.bubbleCtrl, **attr) attr = {'longName':'directionalSpeed', 'niceName':'Directional Speed', 'attributeType':'double', 'defaultValue':0} self.add_custom_attrs(self.bubbleCtrl, **attr) attr = {'longName':'randomDirection', 'niceName':'Random Direction', 'attributeType':'double', 'defaultValue':0} self.add_custom_attrs(self.bubbleCtrl, **attr) attr = {'longName':'burstAttr', 'niceName':' ', 'attributeType':'enum', 'enumName':'Burst Attrs:', 'keyable':False} self.add_custom_attrs(self.bubbleCtrl, **attr) attr = {'longName':'popVelocity', 'niceName':'Pop Velocity', 'attributeType':'double', 'defaultValue':1} self.add_custom_attrs(self.bubbleCtrl, **attr) attr = {'longName':'burstSizeMin', 'niceName':'Size Min', 'attributeType':'double', 'defaultValue':0.01, 'min':0} self.add_custom_attrs(self.bubbleCtrl, **attr) attr = {'longName':'burstSizeMax', 'niceName':'Size Max', 'attributeType':'double', 'defaultValue':0.1, 'min':0} self.add_custom_attrs(self.bubbleCtrl, **attr) attr = {'longName':'burstLifespanMin', 'niceName':'Lifespan Min', 'attributeType':'double', 'defaultValue':1, 'min':-1} self.add_custom_attrs(self.bubbleCtrl, **attr) attr = {'longName':'burstLifespanMax', 'niceName':'Lifespan Max', 'attributeType':'double', 'defaultValue':2, 'min':-1} self.add_custom_attrs(self.bubbleCtrl, **attr) attr = {'longName':'bubbleAttr', 'niceName':' ', 'attributeType':'enum', 'enumName':'Bubble Attrs', 'keyable':False} self.add_custom_attrs(self.bubbleCtrl, **attr) attr = {'longName':'bubbleSizeMin', 'niceName':'Size Min', 'attributeType':'double', 'defaultValue':0.2, 'min':0} self.add_custom_attrs(self.bubbleCtrl, **attr) attr = {'longName':'bubbleSizeMax', 'niceName':'Size Max', 'attributeType':'double', 'defaultValue':0.4, 'min':0} self.add_custom_attrs(self.bubbleCtrl, **attr) attr = {'longName':'lifespanMin', 'niceName':'Lifespan Min', 'attributeType':'double', 'defaultValue':2, 'min':-1} self.add_custom_attrs(self.bubbleCtrl, **attr) attr = {'longName':'lifespanMax', 'niceName':'Lifespan Max', 'attributeType':'double', 'defaultValue':4, 'min':-1} self.add_custom_attrs(self.bubbleCtrl, **attr) attr = {'longName':'killField', 'niceName':' ', 'attributeType':'enum', 'enumName':'Kill Field:', 'keyable':False} self.add_custom_attrs(self.bubbleCtrl, **attr) attr = {'longName':'killHeight', 'niceName':'Kill Height', 'attributeType':'double', 'defaultValue':-0.1} self.add_custom_attrs(self.bubbleCtrl, **attr) ################################################################################################### ## Locator speed expression expStringList = [ 'float $time;', 'float $trx;', 'float $try;', 'float $trz;', 'float $dx = %s.translateX - $trx;' % self.speedLocator, 'float $dy = %s.translateY - $try;' % self.speedLocator, 'float $dz = %s.translateZ - $trz;' % self.speedLocator, 'float $d = sqrt( ($dx * $dx) + ($dy * $dy) + ($dz * $dz) );', '%s.speed = abs( $d / ( time - ($time + 0.001) ) );' % self.speedLocator, '$trx = %s.translateX;' % self.speedLocator, '$try = %s.translateY;' % self.speedLocator, '$trz = %s.translateZ;' % self.speedLocator, '$time = time;' ] expString = self.processExpressionString(expStringList) cmds.expression(self.speedLocator, string = expString) ## Bubbles Creation Expression expStringList = [ '%s.lifespanPP = rand(%s.lifespanMin, %s.lifespanMax);' %(self.bubbleShape, self.bubbleCtrl, self.bubbleCtrl) ] expString = self.processExpressionString(expStringList) cmds.dynExpression(self.bubbleShape, string = expString, creation = True) ## Bubbles Runtime After Dynamics expStringList = [ 'vector $vel = %s.velocity;' % self.bubbleShape, 'vector $kill = %s.position;' % self.bubbleShape, 'float $popVel = %s.popVelocity;' % self.bubbleCtrl, 'float $age = %s.age;' % self.bubbleShape, '', 'if ( $kill.y > %s.killHeight )' % self.bubbleCtrl, '{', ' %s.lifespanPP = 0;' % self.bubbleShape, '}', '', 'if ($vel.y >= $popVel)', '{', ' %s.lifespanPP = 0;' % self.bubbleShape, ' %s.%s_emitterRatePP = 100;' % (self.bubbleShape, '_'.join(self.bubbleBurst.split('_')[0:-1])), '}', ] expString = self.processExpressionString(expStringList) cmds.dynExpression(self.bubbleShape, string = expString, runtimeAfterDynamics = True) ## Bubble Bursts Creation Expression expStringList = [ '%s.lifespanPP = rand(%s.burstLifespanMin, %s.burstLifespanMax);' %(self.bubbleBurstShape, self.bubbleCtrl, self.bubbleCtrl), '%s.radiusPP = rand(%s.burstSizeMin, %s.burstSizeMax)' % (self.bubbleBurstShape, self.bubbleCtrl, self.bubbleCtrl), ] expString = self.processExpressionString(expStringList) cmds.dynExpression(self.bubbleBurstShape, string = expString, creation = True) ## Bubble Bursts Runtime After Dynamics Expression expStringList = [ 'vector $kill = %s.position;' % self.bubbleBurstShape, '', 'if ($kill.y > %s.killHeight)' % self.bubbleCtrl, '{', ' %s.lifespanPP = 0;' % self.bubbleBurstShape, '}', ] expString = self.processExpressionString(expStringList) cmds.dynExpression(self.bubbleBurstShape, string = expString, runtimeAfterDynamics = True) ## Expression for Turbulence Field expStringList = [ '%s.phaseX = time;' % self.turbulenceField, '%s.phaseY = time;' % self.turbulenceField, '%s.phaseZ = time;' % self.turbulenceField, ] expString = self.processExpressionString(expStringList) cmds.expression(self.turbulenceField, string = expString) ## Expression for Bubble Emitter expStringList = [ 'float $minSpeed = %s.minSpeed;' % self.bubbleCtrl, 'float $maxSpeed = %s.maxSpeed;' % self.bubbleCtrl, 'float $speed = %s.speed;' % self.speedLocator, 'float $curve = smoothstep($minSpeed, $maxSpeed, $speed);', 'float $rateMuliplier = %s.rate;' % self.bubbleCtrl, 'float $splashMaxSpeed = %s.splashMaxSpeed;' % self.bubbleCtrl, '', 'if (%s.useSpeed == 1)' % self.bubbleCtrl, '{', ' %s.rate = $rateMuliplier * $curve;' % self.bubbleEmitter, '', ' float $emitterSpeed = $splashMaxSpeed * $curve;', ' if ($emitterSpeed == 0)', ' {', ' $emitterSpeed = 0.1;', ' }', ' %s.awayFromCenter = $emitterSpeed;' % self.bubbleEmitter, '}', 'else', '{', ' %s.rate = $rateMuliplier;' % self.bubbleEmitter, ' %s.awayFromCenter = $splashMaxSpeed;' % self.bubbleEmitter, '}', '%s.alongAxis = %s.directionalSpeed;' % (self.bubbleEmitter, self.bubbleCtrl), '%s.randomDirection = %s.randomDirection;' % (self.bubbleEmitter, self.bubbleCtrl), ] expString = self.processExpressionString(expStringList) cmds.expression(self.bubbleEmitter, string = expString) ################################################################################################### ## Finalizing stuffs cmds.connectAttr('%s.bubbleSizeMin' % self.bubbleCtrl, '%s.minValue' % arrayMap) cmds.connectAttr('%s.bubbleSizeMax' % self.bubbleCtrl, '%s.maxValue' % arrayMap) ################################################################################################### ## Assigning shader self.bubbleShader(particleShapeName = [self.bubbleShape, self.bubbleBurstShape])
cmds.addAttr(part[1], internalSet=True, ln="normalDir", at="long", min=1, max=3, dv=2 ) part_attrs = {'colorAccum':False, 'useLighting':True, 'particleRenderType':0,} for attr, value in part_attrs.items(): cmds.setAttr('%s.%s' %(part[1], attr), value) #Adding fields #This code selects the particles so the gravity field can be added cmds.select(part) drop_grav = cmds.gravity(part, m=15, dy=-1) cmds.connectDynamic(part, f='gravityField1') #Reselect Particles to add in the radial field cmds.select(part) radial_drop = cmds.radial(part, m=0.010) cmds.connectDynamic(part, f=radial_drop[0]) #Create Partilce Mist from the Particle Tool mist_part_1 = cmds.particle(n='mist', c=0) mist_part_2 = cmds.particle(n='mist1', c=0) cmds.select(mist_part_1[0]) cmds.connectDynamic(mist_part_1[0], em=emit[0]) cmds.select(mist_part_2[0]) cmds.connectDynamic(mist_part_2[0], em=emit[0]) #Add gravityField1 and radialField1 to mist and mist1 through dynamicRelationship editor cmds.select(mist_part_1[0]) cmds.connectDynamic(mist_part_1[0], f='gravityField1') cmds.connectDynamic(mist_part_1[0], f='radialField1') cmds.select(mist_part_2[0])
'useLighting': True, 'particleRenderType': 0, } for attr, value in part_attrs.items(): cmds.setAttr('%s.%s' % (part[1], attr), value) #Adding fields #This code selects the particles so the gravity field can be added cmds.select(part) drop_grav = cmds.gravity(part, m=15, dy=-1) cmds.connectDynamic(part, f='gravityField1') #Reselect Particles to add in the radial field cmds.select(part) radial_drop = cmds.radial(part, m=0.010) cmds.connectDynamic(part, f=radial_drop[0]) #Create Partilce Mist from the Particle Tool mist_part_1 = cmds.particle(n='mist', c=0) mist_part_2 = cmds.particle(n='mist1', c=0) cmds.select(mist_part_1[0]) cmds.connectDynamic(mist_part_1[0], em=emit[0]) cmds.select(mist_part_2[0]) cmds.connectDynamic(mist_part_2[0], em=emit[0]) #Add gravityField1 and radialField1 to mist and mist1 through dynamicRelationship editor cmds.select(mist_part_1[0]) cmds.connectDynamic(mist_part_1[0], f='gravityField1') cmds.connectDynamic(mist_part_1[0], f='radialField1') cmds.select(mist_part_2[0])
#Point Size to 1 cmds.setAttr('dropletsShape.pointSize', 1) ''' #Adding Fields ''' gravity -pos 0 0 0 -m 9.8 -att 0 -dx 0 -dy -1 -dz 0 -mxd -1 -vsh none -vex 0 -vof 0 0 0 -vsw 360 -tsr 0.5 ; // gravityField1 // #Select particles before adding in fields ''' cmds.select('droplets') cmds.gravity('droplets', m=15, dy=-1) cmds.connectDynamic('droplets', f='gravityField1') #Reselect Particles cmds.select('droplets') cmds.radial('droplets', m=0.010) cmds.connectDynamic('droplets', f='radialField1') #Create Partilce Mist from the Particle Tool cmds.particle(n='mist', c=0) cmds.particle(n='mist1', c=0) cmds.select('mist') cmds.connectDynamic('mist', em=emit[0]) cmds.select('mist1') cmds.connectDynamic('mist1', em=emit[0]) #Add gravityField1 and radialField1 to mist and mist1 through dynamicRelationship editor cmds.select('mist') cmds.connectDynamic('mist', f='gravityField1') cmds.connectDynamic('mist', f='radialField1') cmds.select('mist1')