説明:
次の例では、Script オペレータを使用して、シーンのテキスト オブジェクトに基づいて単一の文字を各パーティクルに割り当てます。ユーザは任意の文字を入力でき、フォントを定義し、Extrude や Bevel などのモディファイヤを使用してテキストの外観を変更します。また、パーティクル
フロー によってテキストを示す文字のストリームを生成します。
用途:
このスクリプトは、Script_Operator 内部で使用されます。
効果:
-
この例は、インスタンス化されたソースとして一意のシーン テキスト オブジェクト (上に任意のモディファイヤ付き) を使用します。
-
スクリプトによってソース テキストのコピーが作成され、元のテキストがそのテキストの中の単一の文字によって置き換えられます。つまり、ユーザが自由に外観を作成(たとえば、カスタムの Bevel をソースに追加するなど) でき、パーティクル システムはこれらの設定を継承します。
-
Source の[フォント]の[テキスト]を変更し、時間を取り消して戻したら、パーティクル システムは自動的に更新されます。
-
シーンから削除された文字が検出され、パーティクル システムがそれらを再生成して元に戻します。
-
ソース オブジェクトが削除された場合、押し出しモディファイヤの新しい既定値のテキストが、「Enter Text Here」という文字列を使用してシーン内に作成され、レンダリング可能フラグが false に設定されます。つまり、このテキスト オブジェクトを使用して最初から作成し、フォント、テキスト、スタックを編集して希望どおりの外観にすることができるのです。
-
注:
ソース オブジェクトは、何らかのメッシュ モディファイヤが上部にあるテキスト オブジェクトでなくてはなりません。このスクリプトはテキストの基本オブジェクト (baseobject)のフォントおよびテキスト プロパティにアクセスする必要があるので、スタックを
EMesh に集約しないでください。
-
-
外観を変更したら、新しい外観を表示するために Cache オペレータをすべて無効にする必要があります。
-
テキストが既定値よりも長い場合、Birth オペレータのタイミングを変更して多くのパーティクルを取得することができます。
-
他の任意の PFlow オペレータを使用してパーティクルに影響を与えることができます。Script では、パーティクルのシェイプのみが確認されます。
-
スクリプトを使用した複数のパーティクル システムが必要な場合、スクリプト全体を通して固有の名前を変更してそれぞれを分離します。
-
-
例:
|
--ChannelsUsed ハンドラは、スクリプトに提供される
--チャンネルを定義します。
--すべてのチャンネルのリストについては、
--インタフェース: MaxscriptParticleContainer を参照してください。
--ハンドラに渡されるパラメータ pCont には
--スクリプトの適用先のパーティクル コンテナが含まれています。
on ChannelsUsed pCont do(
pCont.useShape = true --シェイプの変更を有効にします。
)
--初期化時には Init ハンドラが呼び出されます。
--この場合、文字列とフォント名の定義と、
--すべての文字のテキスト オブジェクトの作成に使用されます。
on Init pCont do
(
--文字オブジェクトの配列を保存するために、グローバル変数を定義します。
--同じシーンでコードを何回も再使用する場合は、
--異なる一意の ID を使用します。
globalpflow_letter_array17b02b680
localtext_source = $PFlowText17b02b680
--一意のソースが見つからない場合...
if not isValidNode text_source do
(
--新しいテキスト ソース オブジェクトを作成します。
text_source = text text:"Enter Text Here"
--一意の名前を付けます。同じシーン内で
--複数のスクリプトを使用する必要のある場合は、
--スクリプト全体で異なる ID を使用します。
text_source.name ="PFlowText17b02b680"
--テキスト オブジェクトに押し出しモディファイヤを追加します。
addmodifier text_source (extrude amount:10)
--ソースをレンダラーに対して非表示にします。
text_source.renderable = false
)
--配列が以前に初期化されていたら...
if pflow_letter_array17b02b680 != undefined do
(
txtpos = 0
--配列のすべての要素を巡回します。
for i in pflow_letter_array17b02b680 do
(
txtpos += 1
--配列ノードのいずれかが無効 (削除済み) であるか、
--フォントがソースのフォント名と一致しないか、
--文字がソース テキストの文字と一致しない場合、
--配列全体をリセットして、再初期化できるようにします。
if not (isValidNode i) or i.font != text_source.font or i.text != (substring text_source.text txtpos 1) do
pflow_letter_array = undefined
)
)
--配列を新しく作成するか、リセットする (上記参照) 場合、
if pflow_letter_array17b02b680 == undefined do
(
--空の配列を初期化します。
pflow_letter_array17b02b680 = #()
--パーティクル システムによって、シーン内のソース テキスト オブジェクトから
--文字列を表示させます。テキストのソースを編集して
--希望する任意のテキストを表示させることができます。
--タイム スライダを動かすと、すべての文字が更新されます。
localstr = text_source.text
--存在する可能性のある文字をすべて名前で削除します。
delete $PFlow_Letter_17b02b680_*
--1 から文字列内の文字の数までループします。
fori = 1tostr.countdo
(
--文字列の i 番目の文字のソース オブジェクトの
--コピーを作成します。
letter = copy text_source
letter.text = (substring str i 1)
--オブジェクトに一意の名前を付与します。
letter.name = (uniquename"PFlow_Letter_17b02b680_")
--ソースのフォントにフォントを設定します。
letter.font = text_source.font
--新しいテキスト オブジェクトを配列に追加します。
append pflow_letter_array17b02b680 letter
--テキスト オブジェクトを非表示にします。
hide letter
)
)
)
--Proceed ハンドラでは、使用可能なパーティクルに対して
--文字を割り当てます。
onProceed pContdo
(
--現在のパーティクル数を取得します。
count = pCont.numParticles()
--グローバル配列内のテキスト オブジェクトの数を取得します。
maxcount = pflow_letter_array17b02b680.count
--空のメッシュを作成します。
empty_mesh = triMesh()
--すべてのパーティクルに対して繰り返します。
fori = 1tocountdo
(
--現在のパーティクル インデックスを設定します。
pCont.particleIndex = i
--パーティクル インデックスが文字の数より小さい場合
ifi <= maxcountthen
(
--ノードが削除されない場合は、パーティクルのシェイプを
--i 番目のテキスト オブジェクトのメッシュに設定します。
ifisValidNode pflow_letter_array17b02b680[i]do
pCont.particleShape = pflow_letter_array17b02b680[i].mesh
)
else
(
--このパーティクルに文字が存在しない場合、
--シェイプを空のメッシュに設定します。
pCont.particleShape = empty_mesh
)
)
)
--Release ハンドラを使ってクリーンアップを行います。
--この例では使用しません。
onRelease pContdo
(
)
|