Description:
The following example shows a sample Fragmentation script using the Parray particle system and the Mesher Compound object to generate object fragments on the fly.
Can Be Used With:
Should be used in a Birth_Script Action to generate fragment particles.
Effect:
In the Init handler, the script prepares the fragment source object, a PArray, a Mesher Compound and two Editable meshes to hold the fragments. It then assigns the PArray to the Mesher.
In the Proceed handler, the script checks whether the particle system time is at frame 0 and no particles exist. In this case it gets the mesh of the PArray from the Mesher, splits the mesh into elements, gives birth to new particles and assigns them the mesh and position of the fragment.
After the script has created the particles with the fragments, they can be controlled by any Particle Flow operators as usual.
EXAMPLE
--The ChannelsUsed handler defines the channels --to be made available to the script. --For the list of all channels, see --Interface: MaxscriptParticleContainer --The parameter pCont passed to the handler --contains the Particle Container the script is applied to on ChannelsUsed pCont do ( pCont.useTime = true--enable the Time channel pCont.useAge = true--enable the Age channel pCont.usePosition = true--enable the Position channel pCont.useSpeed = true--enable the Speed channel pCont.useShape = true--enable the Shape channel ) --The Init handler is called on initialization. --This is where preparation works can be performed. --The parameter pCont passed to the handler --contains the Particle Container the script is applied to on Init pCont do ( -- Create a geometry primitive to break into fragments. global bb = $Teapot_69e13b6c--a unique name -- Create a PArray particle system to create the fragments. global a = $PArray_36ce15a4--a unique name -- Create a Mesher Compound object to turn PArray into mesh. global mshr = $Mesher_23951616--a unique name -- Create a mesh to hold the total mesh. global totalMesh = $EMesh_5990501d--a unique name -- Create a mesh to hold separate fragments. global fragmentMesh = $EMesh_1589735c-- a unique name --Disable screen redraw to speed up execution withredrawoff( -- If the source object does not exist in the scene... if (bb == undefined) then ( -- create a Teapot for fragmentation, give it a unique name bb = Teapot radius:20 smooth:on segs:6 body:on handle:on spout:on lid:on mapCoords:off bb.name ="Teapot_69e13b6c" hide bb-- hide the teapot ) -- If the PArray object does not exist in the scene... if (a == undefined) then ( -- Create and setup a PArray a = PArray() a.name ="PArray_36ce15a4" a.speed = 0 a.emitter = b ba.particleType = 2 a.viewtype = 2 hide a ) -- If the Mesher object does not exist in the scene... if (mshr == undefined) then ( -- Create a Mesher Compound Object -- The Mesher gets mesh data out of the PArray mshr = mesher() mshr.name ="Mesher_23951616" mshr.pick = a-- Assign the Parray to the Mesher select mshr modPanel.addModToSelection (Edit_Mesh ()) ui:on clearSelection() hide mshr ) -- If the total Emesh object does not exist in the scene... if(totalMesh == undefined)then( -- Create a new editable meshes with unique name totalMesh = editable_mesh() totalMesh.name ="EMesh_5990501d" hide totalMesh ) -- If the fragments Emesh object does not exist in the scene... if(fragmentMesh == undefined)then( -- to create editable meshes our of Mesher fragmentMesh = editable_mesh() fragmentMesh.name ="EMesh_1589735c" hide fragmentMesh ) ) ) --The Proceed handler contains the particle creating script --The parameter pCont passed to the handler --contains the Particle Container the script is applied to: on Proceed pCont do( -- Get the time range t1 = pCont.getTimeStart() as float t2 = pCont.getTimeEnd() as float -- Only if the current time is at moment 0... if((t1 <= 0) and (t2 >= 0))then( -- Initialize a counter i = 0 -- If there are still no particles in the system if(pCont.NumParticles() <= 0)then ( print("should be making fragments") -- You can modify the fragmentation parameters here: a.Fragment_Thickness = 1 a.fragmentmethod = 1 a.fragChunkMinimum = 202 -- Get the complete mesh from the mesher totalMesh.mesh = mshr.mesh -- Create a bitarray with all faces set print("assigning particles") -- Repeat while there are still faces in the mesh while totalMesh.numfaces != 0 do ( -- Get the mesh element the first face belongs to el = meshop.getelementsusingface totalMesh #{1} -- Detach the faces of the element tMesh = meshop.detachFaces totalMesh el delete:true asMesh:true -- Set the mesh of the fragment Emesh to the element fragmentMesh.mesh = tMesh -- Update the fragment Emesh update fragmentMesh -- Get the center of the fragment mesh meshCenter = fragmentMesh.center -- The original particle position is the center of the fragment particlePos = fragmentMesh.center -- Adjust vertex location to center around the chunk pivot for j in 1 to fragmentMesh.verts.count do ( curVert = getVert fragmentMesh.mesh j curVert = curVert - meshCenter setVert fragmentMesh.mesh j curVert ) -- Move the pivot of the fragment to the original center -- of the fragment fragmentMesh.pivot = meshCenter -- Give birth to a new particle pCont.AddParticle() -- Increase the counter i += 1 -- Set the current particle index to the counter pCont.particleIndex = i -- Set particle time and age to 0 (newborn particle!) pCont.particleTime = 0 pCont.particleAge = 0 -- Set the particle’s position to the original fragment position pCont.particlePosition = particlePos -- Reset the speed to 0 pCont.particleSpeed = [0,0,0] -- Set the shape of the particle to the mesh of the fragment pCont.particleShape = fragmentMesh.mesh ) print("assigned particles "+ (pCont.NumParticles() as string)) ) ) ) --The Release handler is used to do cleanup work. --Not used in this case. on Release pCont do ( )