説明:
次の例では、Script_Test アクション内のインテグレータ インタフェースの使用方法を紹介します。
用途:
Script_Test : ヘルパー アクション内部で使用する必要があります。
効果:
インテグレータを使用する必要があるかどうかを確認できます。インテグレータ パーティクルがないと、パーティクルはゼロ Z プレーン周辺で停止します。インテグレータを使用すると、パーティクルをプレーン レベルで正確に停止できるので、後でパーティクル位置を変更する必要がありません。
次の例のフローでは、パーティクルが発生し、加速されます。Script_Test テストはパーティクルの位置をチェックし、問題がなければ 2 番目のイベントに渡します。ここで、パーティクルは停止します。
例:
|
--ChannelsUsed ハンドラは、スクリプトに提供される
--チャンネルを定義します。
--すべてのチャンネルのリストについては、
--インタフェース: MaxscriptParticleContainer を参照してください。
--ハンドラに渡されるパラメータ pCont には
--スクリプトの適用先のパーティクル コンテナが含まれています。
on ChannelsUsed pCont do
(
pCont.useTime = true --時間チャンネルを有効にします。
pCont.usePosition = true --位置チャンネルを有効にします。
pCont.useSpeed = true --速度チャンネルを有効にします。
)
--初期化時には Init ハンドラが呼び出されます。
--この例では使用しません。
on Init pCont do
(
)
on Proceed pCont do
(
--終了時間を取得します。
end = pCont.GetTimeEnd()asfloat
--インテグレータのインタフェースを取得します。
_int = pCont.GetIntegrator()
--現在のパーティクル数を取得します。
count = pCont.NumParticles()
--パーティクル コンテナを取得します。
pCont_curr = pCont.GetParticleContainer()
--配列を初期化します。
timeToStopInt = #()
timeToStopFloat = #()
particlesToStop = #{}
--インテグレータに渡されるパーティクルが存在する場合、
--フラグを初期化します。
hasParticlesToIntegrate = false
--すべてのパーティクルを処理します。
for i in 1 to count do
(
--現在のパーティクル インデックスを設定します。
pCont.particleIndex = i
--残りの移動時間を計算します。
timeForTravel = end - (pCont.particleTimeasfloat)
-- "time to travel % = %¥n" i timeforTravel のフォーマットを行います。
--パーティクルの現在の位置と速度を取得します。
curPos = pCont.particlePosition
curSpeed = pCont.particleSpeed
--XY プレーンまでの時間を計算します。マイナス記号があるので、
--Z 座標の値が負の値の場合、時間は正の値になります。
timeToPlane = -curPos.z / curSpeed.z
-- "time to plane % = %¥n" i timeToPlane のフォーマットを行います。
--フラグを初期化します。
stopThisParticle = 0
--パーティクル時間をフレーム単位で取得します。
curParticleTime = pCont.particleTimeastime
--プレーンまでの時間が 0 以上で移動時間より短い場合、
--パーティクルは既にプレーンに渡され、
--既に停止しています。
if((timeToPlane >= 0.0)and(timeToPlane <=timeForTravel))do
(
--テスト状態を true に設定します。
pCont.particleTestStatus = true
--正確なパーティクル時間を設定します
pCont.setParticleTestTimePrecise i pCont.particleTime timeToPlane
--停止するパーティクルの BitArray にパーティクル インデックスを
--付加します。
append particlesToStop i
--インテグレータによる処理が必要なことを示すフラグをオンにします。
hasParticlesToIntegrate = true
)
--2 つの配列にパーティクルのタイム フレームおよび割合を付加します。
append timeToStopInt curParticleTime
append timeToStopFloat timeToPlane
)
--フラグが設定されている場合
ifhasParticlesToIntegratethen
(
--インテグレータへのアクセスが可能な場合、停止するパーティクルを
--インテグレータへ送ります。
if_int != undefinedthen
_int.proceedASync pCont_curr timeToStopInt timeToStopFloat true particlesToStop
)
-- "time to stop Int= %¥n" timeToStopInt のフォーマットを行います。
-- "time to stop Float= %¥n" timeToStopFloat のフォーマットを行います。
-- "part to stop Index= %¥n" particlesToStop のフォーマットを行います。
)
--Release ハンドラを使ってクリーンアップを行います。
--この例では使用しません。
onRelease pContdo
(
)
|