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.

pview_fragments.gif

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 hander 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 

with redraw off(

-- 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 = 0a.emitter = bba.particleType = 2a.viewtype = 2hide 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

(

 

)

See also

PArray : GeometryClass

Mesher : GeometryClass

Using MAXScript in Script Actions

Particle Flow Sample Scripts