Script_Test の統合の例

説明:

次の例では、Script_Test アクション内のインテグレータ インタフェースの使用方法を紹介します。

用途:

Script_Test : ヘルパー アクション内部で使用する必要があります。

効果:

インテグレータを使用する必要があるかどうかを確認できます。インテグレータ パーティクルがないと、パーティクルはゼロ Z プレーン周辺で停止します。インテグレータを使用すると、パーティクルをプレーン レベルで正確に停止できるので、後でパーティクル位置を変更する必要がありません。

次の例のフローでは、パーティクルが発生し、加速されます。Script_Test テストはパーティクルの位置をチェックし、問題がなければ 2 番目のイベントに渡します。ここで、パーティクルは停止します。

例:

    --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.useTime = true --enable the Time channel
    pCont.usePosition = true --enable the Position channel
    pCont.useSpeed = true --enable the Speed channel
    )

    --The Init handler is called on initialization.
    --It is not used in this case.
    on Init pCont do
    (

    )

    on Proceed pCont do
    (
    --Get the End Time
    end = pCont.GetTimeEnd() as float
    --Get the interface to the Integrator
    _int = pCont.GetIntegrator()
    --Get the current particle count
    count = pCont.NumParticles()
    --Get the particle container
    pCont_curr = pCont.GetParticleContainer()
    --Initialize Arrays
    timeToStopInt = #()
    timeToStopFloat = #()
    particlesToStop = #{}
    --Initialize a flag to signal when
    --there are particles to send to the integrator
    hasParticlesToIntegrate = false

    --Go through all particles
    for i in 1 to count do
    (
    --Set the current particle index
    pCont.particleIndex = i
    --Calculate the remaining time to travel
    timeForTravel = end - (pCont.particleTimeasfloat)
    -- format "time to travel % = %\n" i timeforTravel
    --Get the current position and speed of the particle
    curPos = pCont.particlePosition
    curSpeed = pCont.particleSpeed

    --Calculate the time to the XY plane. Because of the minus sign,
    --when the Z coordinate is negative, the time will be positive
    timeToPlane = -curPos.z / curSpeed.z
    -- format "time to plane % = %\n" i timeToPlane

    --Initialize a flag
    stopThisParticle = 0
    --Get the particle time in frames
    curParticleTime = pCont.particleTime as time

    --If the time to plane is positive or zero and shorter
    --than the time to travel, then the particle has passed
    --the plane already and has to be stopped!
    if((timeToPlane >= 0.0)and(timeToPlane <= timeForTravel))do
    (
    --Set the Test status to true
    pCont.particleTestStatus = true
    --Set the precise particle time
    pCont.setParticleTestTimePrecise i pCont.particleTime timeToPlane
    --Append the particle index to the BitArray of particles
    --to be stopped
    append particlesToStop i
    --Raise the flag to signal there is work for the integrator
    hasParticlesToIntegrate = true
    )

    --Append the particle time frame and fraction to the two arrays
    append timeToStopInt curParticleTime
    append timeToStopFloat timeToPlane
    )

    --If the flag has been set
    if hasParticlesToIntegrate then
    (
    --If the integrator can be accessed, send the particles to stop
    --to the Integrator
    if _int != undefined then
    _int.proceedASync pCont_curr timeToStopInt timeToStopFloat true particlesToStop
    )
    -- format "time to stop Int= %\n" timeToStopInt
    -- format "time to stop Float= %\n" timeToStopFloat
    -- format "part to stop Index= %\n" particlesToStop
    )

    --The Release handler is used to do cleanup work.
    --Not used in this case.
    on Release pCont do
    (
    )