View-Dependent Particle Resolution Example


The following example shows a possible way to control the resolution of particles based on the distance to a camera.

Can Be Used With:

Should be used in a Script_Operator



The script uses a Sphere primitive from the scene as the shape of every particle and sets its segments based on the distance to a hard-coded camera $Camera01. As particles get farther from the camera, they get less polygons.


Sample File:



--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.useShape = true  --Enable the Shape channel

pCont.usePosition = true --Enable the Position channel

pCont.useScale = true  --Enable the Scale channel


--The Init hander is called on initialization.

--In this case, it is used to define and, if necessary, create

--the source of particle shapes

on Init pCont do


-- Get the shape source primitive by name.

-- Use random name to avoid conflict with other objects in the scene

global sph = $SphereDynamic2468975


-- In case the object does not exist, create it

if sph == undefined then


sph = Sphere()

-- Give the object a unique name = "SphereDynamic2468975"

-- Set the radius to one.

sph.radius = 1.0

-- Hide the Sphere

hide sph




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


--If there is a camera named Camera01 in the scene...

if $Camera01 != undefined then


--Get the current total particles count:

count = pCont.NumParticles()


--Loop through all particles:

for i in 1 to count do  



--Set the current particle index:

pCont.particleIndex = i  


--Modify the pre-created sphere with radius

--based on the particle size:

sph.radius = pCont.particleScale 


--Modify segments based on the distance to the camera

--called $Camera01

--At distance of 500.0 units the segments will be set to 2

--At distance of 250.0 the segments will be 4, at 100 units 10 etc.

--Change the function to get the desired falloff

sph.segs = 1000.0/(length (pCont.particlePosition - $Camera01.pos))


--Set the shape of the particle to the TriMesh of the Sphere

pCont.particleShape = sph.mesh

)--end i loop

)--end if

)--end proceed


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

--Not used in this case.

on Release pCont do



See also

Sphere : GeometryClass

Interface: MaxscriptParticleContainer

Script_Operator : Helper

Using MAXScript in Script Actions

Particle Flow Sample Scripts