説明:
次の例は、Parray パーティクル システムと Mesher Compound オブジェクトを使用してその場でオブジェクト フラグメントを生成するフラグメントのサンプル スクリプトを示しています。
用途:
Birth_Script アクション内で、フラグメント パーティクルを作成するために使用します。
効果:
Init ハンドラ内で、スクリプトは、フラグメントを保持するためのフラグメント ソース オブジェクト、単一の PArray、単一の Mesher Compound、および 2 つの編集可能メッシュを用意します。次に、PArray を Mesher
に割り当てます。
Proceed ハンドラで、スクリプトは、パーティクル システムの時間がフレーム 0 で、パーティクルが存在していないことを確認します。この場合、スクリプトは Mesher から PArray のメッシュを取得し、そのメッシュを要素に分解し、新しいパーティクルを発生させ、それらにメッシュとフラグメントの位置を割り当てます。
スクリプトによってフラグメントのあるパーティクルが作成されたら、それらは通常どおり パーティクル フロー のオペレータで制御できます。
例:
|
--ChannelsUsed ハンドラは、スクリプトに提供される
--チャンネルを定義します。
--すべてのチャンネルのリストについては、
--インタフェース: MaxscriptParticleContainer を参照してください。
--ハンドラに渡されるパラメータ pCont には
--スクリプトの適用先のパーティクル コンテナが含まれています。
on ChannelsUsed pCont do
(
pCont.useTime = true--時間チャンネルを有効にします。
pCont.useAge = true--エージ チャンネルを有効にします。
pCont.usePosition = true--位置チャンネルを有効にします。
pCont.useSpeed = true--速度チャンネルを有効にします。
pCont.useShape = true--シェープ チャンネルを有効にします。
)
--初期化時には Init ハンドラが呼び出されます。
--ここで準備作業が実行できます。
--ハンドラに渡されるパラメータ pCont には
--スクリプトの適用先のパーティクル コンテナが含まれています。
on Init pCont do
(
-- ジオメトリ プリミティブを作成して、フラグメントに割り込みます。
global bb = $Teapot_69e13b6c--一意の名前
-- PArray パーティクル システムを作成して、フラグメントを作成します。
global a = $PArray_36ce15a4--一意の名前
-- Mesher Compound オブジェクトを作成して、PArray をメッシュに変えます。
global mshr = $Mesher_23951616--一意の名前
-- メッシュを作成して、トータル メッシュを保持します。
global totalMesh = $EMesh_5990501d--一意の名前
-- メッシュを作成して、個別のフラグメントを保持します。
global fragmentMesh = $EMesh_1589735c-- 一意の名前
--画面上の再描画を無効にして、実行速度を上げます。
withredrawoff(
-- ソース オブジェクトがシーン内に存在しない場合
if (bb == undefined) then (
-- 断片化用の Teapot を作成して、一意の名前を付けます。
bb = Teapot radius:20 smooth:onsegs:6 body:onhandle:onspout:onlid:on mapCoords:off
bb.name ="Teapot_69e13b6c"
hide bb-- Teapot を非表示にします。
)
-- Parray オブジェクトがシーン内に存在しない場合
if (a == undefined) then
(
-- PArray を作成して設定します。
a = PArray()
a.name ="PArray_36ce15a4"a.speed = 0a.emitter = bba.particleType = 2a.viewtype = 2hide a
)
-- Mesher オブジェクトがシーン内に存在しない場合
if (mshr == undefined) then (
-- Mesher Compound Object を作成します。
-- Mesher が PArray からメッシュ データを取得します。
mshr = mesher()
mshr.name ="Mesher_23951616"
mshr.pick = a-- PArray を Mesher に割り当てます。
select mshr
modPanel.addModToSelection (Edit_Mesh ()) ui:on
clearSelection()
hide mshr
)
-- トータル Emesh オブジェクトがシーン内に存在しない場合
if(totalMesh == undefined)then(
-- 新しい編集可能メッシュを一意の名前で作成します。
totalMesh = editable_mesh()
totalMesh.name ="EMesh_5990501d"
hide totalMesh
)
-- フラグメント Emesh オブジェクトがシーン内に存在しない場合
if(fragmentMesh == undefined)then(
-- Mesher から編集可能メッシュを作成するには
fragmentMesh = editable_mesh()
fragmentMesh.name ="EMesh_1589735c"
hide fragmentMesh
)
)
)
--Proceed ハンドラには、スクリプトを作成するパーティクルが含まれています。
--ハンドラに渡されるパラメータ pCont には
--スクリプトの適用先のパーティクル コンテナが含まれています。
onProceed pContdo(
-- 時間範囲を取得します。
t1 = pCont.getTimeStart()asfloat
t2 = pCont.getTimeEnd()asfloat
-- 現在の時間が 0 である場合のみ...
if((t1 <= 0) and (t2 >= 0))then(
-- カウンタを初期化します。
i = 0
-- それでもシステム内にパーティクルが存在しない場合は、
if(pCont.NumParticles() <= 0)then
(
print("should be making fragments")
-- ここで、断片化パラメータを修正できます。
a.Fragment_Thickness = 1
a.fragmentmethod = 1
a.fragChunkMinimum = 202
-- メッシュから完全なメッシュを取得します。
totalMesh.mesh = mshr.mesh
-- すべての面が設定された BitArray を作成します。
print("assigning particles")
-- メッシュ内に面が存在している間、繰り返します。
whiletotalMesh.numfaces != 0do
(
-- 最初の面が属しているメッシュ要素を取得します。
el = meshop.getelementsusingface totalMesh #{1}
-- その要素の面をデタッチします。
tMesh = meshop.detachFaces totalMesh el delete:true asMesh:true
-- 要素をフラグメント Emesh のメッシュに設定します。
fragmentMesh.mesh = tMesh
-- フラグメント Emesh を更新します。
update fragmentMesh
-- フラグメント メッシュの中心を取得します。
meshCenter = fragmentMesh.center
-- 元のパーティクル位置をフラグメントの中心にします。
particlePos = fragmentMesh.center
-- 頂点の場所を調整して、チャンクの基点の中心にします。
forjin1tofragmentMesh.verts.countdo
(
curVert = getVert fragmentMesh.mesh j
curVert = curVert - meshCenter
setVert fragmentMesh.mesh j curVert
)
-- フラグメントの基点をフラグメントの元の中心に
-- 移動します。
fragmentMesh.pivot = meshCenter
-- 新しいパーティクルを発生させます。
pCont.AddParticle()
-- カウンタの値を増やします。
i += 1
-- 現在のパーティクル インデックスをカウンタの値に設定します。
pCont.particleIndex = i
-- パーティクルの時間とエージを 0(生まれたてのパーティクル) に設定します。
pCont.particleTime = 0
pCont.particleAge = 0
-- パーティクルの位置を元のフラグメントの位置に設定します。
pCont.particlePosition = particlePos
-- 速度をリセットして 0 にします。
pCont.particleSpeed = [0,0,0]
-- パーティクルのシェイプをフラグメントのメッシュに設定します。
pCont.particleShape = fragmentMesh.mesh
)
print("assigned particles "+ (pCont.NumParticles()asstring))
)
)
)
--Release ハンドラを使ってクリーンアップを行います。
--この例では使用しません。
onRelease pContdo
(
)
|