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

pview_cameraRes.gif

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

pview_cameraRes_viewport.gif

Sample File:

[3dsmax5]\scenes\particle_flow\maxscript\ParticleResolutionFromCameraDistance.max

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

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