説明:
次の例は、Script_Test テスト アクションを使って、スクリプト化された Position テストと、相対オフセットおよび絶対位置オプションを実装します。
用途:
2 つのスクリプトは、Script_Test: ヘルパー アクション内で使用します。
効果:
PF_Source から生成されたパーティクルは、Z 軸方向の発生位置について相対オフセット -100 のテストを受けます。
スクリプト化されたオフセット テストの条件を満たすパーティクルは、次のイベントに渡され、エージが 30 を超えるかどうかのテストを受けます。
Age Test テストの条件を満たすパーティクルは、3 番目のイベントに渡され、2 番目のスクリプトを使って、ワールド Z 軸方向の絶対オフセット -200 のテストを受けます。
スクリプト化された位置テストの条件を満たすパーティクルは、最後のイベントに渡され、停止します。
スクリプト:
--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 pCont.usePosition = true ) --The Init handler is called on initialization. --In this case, it is used to define the offset parameters on Init pCont do ( --Data paramters definition struct paramsStruct (cond_less, axis, testpos, offset) global paramsData = paramsStruct() --true means less than, false means greater then paramsData_offset.cond_less = true --Axis option: x=1, y=2, z=3 paramsData_offset.axis = 3 --When set to true, the offset test is relative --When set to false, the offset test is absolute. paramsData_offset.offset = true --Set the offset value to test for paramsData_offset.testpos = -100 -- collects initial pos of each particle for offset test global pos_init_array =#() ) --In the Proceed handler, the actual testing is performed on Proceed pCont do ( count = pCont.NumParticles() for i in 1 to count do ( pCont.particleIndex = i -- get ID of active particle id = pCont.getParticleID pCont.particleIndex if paramsData.cond_less == true then ( if paramsData.offset == true then ( -- collect initial pos for new born particle if pCont.particleNew == true then append pos_init_array pCont.particlePosition[paramsData.axis] pos_id = pCont.GetParticlePositionByID id if pos_id[paramsData.axis] < (pos_init_array[id] + paramsData.testpos) then testSatisfied = true ) else ( if pCont.particlePosition[paramsData.axis] < paramsData.testpos then testSatisfied = true ) ) else ( if paramsData.offset == true then ( -- collect initial pos for new born particle if pCont.particleNew == true then append pos_init_array pCont.particlePosition[paramsData.axis] pos_id = pCont.GetParticlePositionByID id if pos_id[paramsData.axis] > (pos_init_array[id] + paramsData.testpos) then testSatisfied = true ) else ( if pCont.particlePosition[paramsData.axis] > paramsData.testpos then testSatisfied = true ) ) if testSatisfied == true then ( pCont.particleTestStatus = true pCont.particleTestTime = pCont.particleTime ) ) ) on Release pCont do ( )
スクリプト 2
on ChannelsUsed pCont do ( pCont.useTime = true pCont.usePosition = true ) on Init pCont do ( --Data paramters definition struct paramsStruct (cond_less, axis, testpos, offset) global paramsData = paramsStruct() --true means less than, false means greater then paramsData.cond_less = true --Axis option: x=1, y=2, z=3 paramsData.axis = 3 --When set to false, the offset test is absolute. --When set to true, the offset test is relative paramsData.offset = false --Set the position value to test paramsData.testpos = -200 -- Collects initial pos of each particle for offset test: global pos_init_array =#() ) --The Proceed handler is identical to the one in the first script. --Only the test parameters defined in the Init handler alter the --behavior of the script! on Proceed pCont do ( count = pCont.NumParticles() for i in 1 to count do ( pCont.particleIndex = i -- get ID of active particle id = pCont.getParticleID pCont.particleIndex if paramsData.cond_less == true then ( if paramsData.offset == true then ( -- collect initial pos for new born particle if pCont.particleNew == true then append pos_init_array pCont.particlePosition[paramsData.axis] pos_id = pCont.GetParticlePositionByID id if pos_id[paramsData.axis] < (pos_init_array[id] + paramsData.testpos) then testSatisfied = true ) else ( if pCont.particlePosition[paramsData.axis] < paramsData.testpos then testSatisfied = true ) ) else ( if paramsData.offset == true then ( -- collect initial pos for new born particle if pCont.particleNew == true then append pos_init_array pCont.particlePosition[paramsData.axis] pos_id = pCont.GetParticlePositionByID id if pos_id[paramsData.axis] > (pos_init_array[id] + paramsData.testpos) then testSatisfied = true ) else ( if pCont.particlePosition[paramsData.axis] > paramsData.testpos then testSatisfied = true ) ) if testSatisfied == true then ( pCont.particleTestStatus = true pCont.particleTestTime = pCont.particleTime ) ) ) on Release pCont do ( )