Metaball サンプル スクリプト
 
 
 
 

   

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

説明:

Parray パーティクル システムを使用する Metaball スクリプトの例を示します。

用途:

Script_Operator オペレータで使用する必要があります。

効果:

Proceed ハンドラで、各パーティクルに頂点を 1 つ持つ新しいメッシュ オブジェクトが 1 つ作成されます。続いて PArray パーティクル システムが作成され、これにより、提供されたメッシュのすべての頂点からメタボール メッシュが 1 つ生成されます。さらに、Mesher 複合オブジェクトにより、生成されたメタボールのスナップショットが作成されます。これが最初のパーティクルの形状を決定します。

例:

--ChannelsUsed ハンドラは、スクリプトに提供される
--チャンネルを定義します。
--すべてのチャンネルのリストについては、
--インタフェース: MaxscriptParticleContainer を参照してください。
--ハンドラに渡されるパラメータ pCont には
--スクリプトの適用先のパーティクル コンテナが含まれています。
on ChannelsUsed pCont do
(
pCont.usePosition = true
pCont.useTime = true
pCont.useSpeed = true
pCont.useShape = true
)
 
--初期化時には Init ハンドラが呼び出されます。
--この例では使用しません。
on Init pCont do
(
)
 
on Proceed pCont do
(
--開始および終了時間を取得します。
t1 = pCont.getTimeStart()asfloat
t2 = pCont.getTimeEnd()asfloat
 
--パーティクルが存在する限り   
if (pCont.NumParticles() > 0) then
(
--画面の再描画を無効にして、処理速度を上げます。
withredrawoff
(
-- 空のメッシュを作成します。
nMesh = editable_mesh()
-- 頂点と面の数を
-- パーティクルの数に設定します。
nMesh.numVerts = pCont.NumParticles()
nMesh.numFaces = pCont.NumParticles()
--各パーティクルに頂点を 1 つずつ作成します。
for i in1 to pCont.NumParticles() do
(
-- このインテグレーション ステップでパーティクルが移動する時間
timeStep = t2 - (pCont.getParticleTime(i)asfloat)
-- インテグレーション ステップ終了時のパーティクル位置を予測するため
-- 速度を追加します。
nMesh.verts[i] = pCont.getParticlePosition(i) + timeStep*pCont.getParticleSpeed(i)
-- 面は同じ頂点を 3 回参照します。
nMesh.faces[i] = [i,i,i]
)
 
-- メッシュの頂点にパーティクルを持つ PArray を作成します。
a = PArray()
a.speed = 0
a.formation = 2-- すべての頂点
a.quantityMethod = 1--Total を使用
a.Total_Number = 1--初期化
a.viewPercent = 100
a.Emitter_Start = 0f
a.Emitter_Stop = 0f
a.subsampleCreationTime =off
a.Display_Until = 2000f
a.life = 2000f
a.Growth_Time = 0f
a.Fade_Time = 0f
a.particleType = 1--メタボール
a.metaballAutoCoarsness =off
a.metaballRenderCoarsness = 0.9
a.metaballViewCoarsness = 0.9
a.Metaparticle_Tension = 1.0
a.size = 5
a.Total_Number = pCont.NumParticles()--パーティクル数を使用
a.emitter = nMesh
 
-- PArray からメタボール メッシュを取得
mshr = mesher() --Mesher Compound オブジェクト を作成します。
mshr.pick = a --PArray を取得
metaballMesh = snapshot mshr--Mesher のスナップショットを作成
delete a --PArray を削除
delete #(mshr, nMesh) --Mesher およびメッシュを削除
 
-- インテグレーション ステップ終了時のパーティクル位置を予測するため
-- 速度を追加します。
timeStep = t2 - (pCont.getParticleTime(1)asfloat)
spaceOffset = pCont.getParticlePosition(1) + timeStep*pCont.getParticleSpeed(1)
-- 頂点位置を中央の最初のパーティクル付近へ移動します。
foriin1tometaballMesh.verts.countdo
( move metaballMesh.verts[i] (-spaceOffset) )
--すべてのパーティクルに割り当てる空のメッシュを作成します。
emptyMesh = editable_mesh()
--空のメッシュをすべてのパーティクルに割り当てます。
--パーティクルが非表示になります。
pCont.setShapeForAllParticles(emptyMesh.mesh)
--すべてのメッシュ データは最初のパーティクルに格納されます。
pCont.setParticleShape 1 metaballMesh.mesh
--空のメッシュとスナップショットを削除します。
delete #(emptyMesh, metaballMesh)
) 
)
)
 
--Release ハンドラを使ってクリーンアップを行います。
--この例では使用しません。
onRelease pContdo
(
 
)
関連事項