View-Dependent Particle Resolution Example

Description:

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.

Effect:

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 $Camera001. As particles get farther from the camera, they get less polygons.

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.useShape = true --Enable the Shape channel
   pCont.usePosition = true --Enable the Position channel
   pCont.useScale = true --Enable the Scale channel
   )
   --The Init handler 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
   sph.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 Camera001 in the scene...
   if $Camera001 != 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
   (
   )