Fragmentation Sample Script

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
   (

   )