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