MAXScript Extensions > MAXScript Extensions for Particle Flow > Particle Flow Script Examples > Script Operators >

# View-Dependent Particle Resolution Example

| Particle Flow - Quick Navigation

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

#### See Also

- Sphere : GeometryClass

- Interface: MaxscriptParticleContainer

- Script_Operator : Helper

- Using MAXScript in Script Actions

- Particle Flow Sample Scripts