スクリプト化された Position テストの例
 
 
 
 

   

パーティクル フロー クイック ナビゲーション

説明:

次の例は、Script_Test テスト アクションを使って、スクリプト化された Position テストと、相対オフセットおよび絶対位置オプションを実装します。

用途:

2 つのスクリプトは、Script_Test: ヘルパー アクション内で使用します。

効果:

スクリプト:

--ChannelsUsed ハンドラは、スクリプトに提供される
--チャンネルを定義します。
--すべてのチャンネルのリストについては、
--インタフェース: MaxscriptParticleContainer を参照してください。
--ハンドラに渡されるパラメータ pCont には
--スクリプトの適用先のパーティクル コンテナが含まれています。
on ChannelsUsed pCont do
(
pCont.useTime = true
pCont.usePosition = true
)
 
--初期化時には Init ハンドラが呼び出されます。
--この場合、オフセット パラメータの定義に使用されます。
on Init pContdo
(
--データ パラメータ定義
struct paramsStruct (cond_less, axis, testpos, offset)
global paramsData = paramsStruct()
 
--true は「未満」、false は「より大きい」を表します。
paramsData_offset.cond_less = true
--軸オプション: x=1、y=2、z=3
paramsData_offset.axis = 3
--true に設定した場合、オフセット テストは相対値になります。
--false に設定した場合、オフセット テストは絶対値になります。
paramsData_offset.offset = true
--テストするオフセット値を設定します。
paramsData_offset.testpos = -100
 
-- オフセット テストに使用する各パーティクルの初期位置を収集します。
global pos_init_array =#()
)
 
--実際のテストは、Proceed ハンドラ内で行われます。
 
on Proceed pCont do
(
count = pCont.NumParticles()
 
for i in 1 to count do
(
pCont.particleIndex = i
-- アクティブなパーティクルの ID を取得します。
id = pCont.getParticleID pCont.particleIndex
if paramsData.cond_less == true then
(
if paramsData.offset == true then
(
-- 新しく生成されたパーティクルの初期位置を収集します。
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
(
-- 新しく生成されたパーティクルの初期位置を収集します。
 ifpCont.particleNew == truethen
append pos_init_array pCont.particlePosition[paramsData.axis]
pos_id = pCont.GetParticlePositionByID id
 ifpos_id[paramsData.axis] > (pos_init_array[id] + paramsData.testpos)then
testSatisfied = true
)
else
(
 ifpCont.particlePosition[paramsData.axis] > paramsData.testposthen
testSatisfied = true
)
)
iftestSatisfied == truethen
(
pCont.particleTestStatus = true
pCont.particleTestTime = pCont.particleTime
)
)
)
 
onRelease pContdo
(
)

スクリプト 2

on ChannelsUsed pCont do
(
pCont.useTime = true
pCont.usePosition = true
)
on Init pCont do
(
--データ パラメータ定義
struct paramsStruct (cond_less, axis, testpos, offset)
global paramsData = paramsStruct()
 
--true は「未満」、false は「より大きい」を表します。
paramsData.cond_less = true
 
--軸オプション: x=1、y=2、z=3
paramsData.axis = 3
--false に設定した場合、オフセット テストは絶対値になります。
--true に設定した場合、オフセット テストは相対値になります。
paramsData.offset = false
--テストする位置の値を設定します。
paramsData.testpos = -200
 
-- オフセット テストに使用する各パーティクルの初期位置を収集します。
global pos_init_array =#()
)
 
--Proceed ハンドラは、最初のスクリプト内のものと同一です。
--Init ハンドラ内に定義されたテスト パラメータだけが
--スクリプトの動作を変更します。
 
on Proceed pCont do
(
count = pCont.NumParticles()
 
for i in1 to count do
(
pCont.particleIndex = i
-- アクティブなパーティクルの ID を取得します。
id = pCont.getParticleID pCont.particleIndex
if paramsData.cond_less == true then
(
if paramsData.offset == true then
(
-- 新しく生成されたパーティクルの初期位置を収集します。
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
(
-- 新しく生成されたパーティクルの初期位置を収集します。
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
(
ifpCont.particlePosition[paramsData.axis] > paramsData.testposthen
testSatisfied = true
)
)
iftestSatisfied == truethen
(
pCont.particleTestStatus = true
pCont.particleTestTime = pCont.particleTime
)
)
)
 
onRelease pContdo
(
)