Script Operator Example

Description:

The following example shows the default Script Operator script with detailed comments.

Can Be Used With:

Used by the Script_Operator as default script.

Effect:

The script slows particles down, and then, when they are slow enough, splits off the first 50 particles into a stream traveling in a negative direction on the world X axis, and the remainder traveling in the opposite direction.

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.useSpeed = true --enable the Speed channel

)

 

--The Init hander is called on initialization.

--It is not used in this case.

on Init pCont do

(

)

 

--The Proceed handler contains the main script

--applied to the Particles.

--The parameter pCont passed to the handler

--contains the Particle Container the script is applied to:

on Proceed pCont do

(

--Get the total number of particles:

count = pCont.NumParticles()

--Define slow speed as one unit per frame:

slowSpeed = 1/160.0

--Define very slow speed as 0.01 units per frame:

verySlowSpeed = 0.01/160.0

--Define random angular deviation per frame

divAngle = 12.0

--Get the start time in ticks

--(when conerting time values to float, the result is ticks)

tStart = pCont.getTimeStart() as float

--Get the end time in ticks

tEnd = pCont.getTimeEnd() as float

--Calculate the length of the time interval in ticks

timeDif = tEnd – tStart

--Then convert to frames (160 ticks/frame when using 30 fps NTSC)

timeDif /= 160.0

--Define a drag coefficient

dragCoef = 0.08

 

 

--Loop from 1 to the number of particles...

for i in 1 to count do

(

--Set the particle index in the container to the current i value.

--This makes the i-th particle in the container the current one:

pCont.particleIndex = i

 

--If the particle is faster, then slow it down

if length(pCont.particleSpeed) > slowSpeed then

pCont.particleSpeed -= dragCoef*timeDif*pCont.particleSpeed

 

--Calculate the length of the particle speed vector

newLen = length(pCont.particleSpeed)

--If the current speed is higher than the defined very slow speed

--then calculate a random divergence using the deviation angle.

--If it is slower (very slow!), then don’t use the angle but a

--fixed value.

if newLen > verySlowSpeed then

pCont.particleSpeed = pCont.randDivergeVector(pCont.particleSpeed)(divAngle/(160*newLen))

else

pCont.particleSpeed = pCont.randDivergeVector(pCont.particleSpeed)(180.0)

 

--If slow enough, the first 50 particles go to the left.

--The particles with ID above 50 go to the right.

if length(pCont.particleSpeed) < 1.5*slowSpeed then

(

if pCont.particleID < 50 then

pCont.particleSpeed += [-0.005*timeDif, 0, 0]

else

pCont.particleSpeed += [0.005*timeDif, 0, 0]

)

)

)

 

--The Release handler is used to do cleanup work.

--Not used in this case.

on Release pCont do

(

)

See also

Interface: MaxscriptParticleContainer

Script_Operator : Helper

Using MAXScript in Script Actions

Particle Flow Sample Scripts