ゴール
ゴールとは
ゴール(Goal)とは、パーティクルが移動するときに目標とするオブジェクトのことです。
ゴールを設定することによって、
パーティクルと目標の物体の間に、スプリングがついているかのようなアニメーションを作成することができます。
カーブオンサーフェイスを除く、すべてのオブジェクトをゴールにすることができ 、
1 つのパーティクルに対してゴールを複数対応させることもできます。
ゴール使用例
文字を NURBS カーブで作成し、そのカーブから作られた プラナーサーフェス にゴールを設定してみましょう。
- 以下の MEL スクリプトをPyMELスクリプトに書き換えて makeString1.py という名前で作ります。
global proc makeString1()
{
string $text[] = `textCurves -f "Times-Roman" -t "Maya"`;
string $chars[] = `listRelatives $text[0]`;
string $psurf[];
int $i = 0;
for($curv in $chars)
{
string $pln[] = `planarSrf -polygon 1 $curv`;
$psurf[$i] = $pln[0];
setAttr ($psurf[$i] + ".v") 0;
$i++;
}
for($ps in $psurf)
{
string $ename[] = `emitter -pos 1.5 10.0 1.5 -type "direction" -dx 0.0 -dy -1.0 -dz 0.0 -spread 0.2`;
string $pname[] = `particle`;
setAttr ($pname[0] + ".particleRenderType") 4;
string $shp[] = `listRelatives -s $pname`;
addAttr -ln "radius" -at "float" $shp;
setAttr ($shp[0] + ".radius") 0.05;
connectDynamic -emitters $ename[0] $pname[0];
goal -goal $ps -weight 0.2 $pname[0];
setAttr ($pname[0] + ".conserve") 0.9;
}
}
- の によって makeString1.py を読み込みます。
- のインプットウインドウで、makeString1() を実行します。
(makeString1() 実行後の図)
- アニメーションを実行します。
スクリプトの解説
global proc makeString1()
- makeString1 というプロシージャの宣言です。
string $text[] = `textCurves -f "Times-Roman" -t "Maya"`;
- Times-Roman というフォントを使用して、 Maya という文字の形で NURBS カーブを作ります。
変数 $text[0] には作られたカーブシェイプのトランスフォームノードの名前が入ります。
以下の図では、 Text_Maya_2 が $text[0] に入る名前です。
string $chars[] = `listRelatives $text[0]`;
- トランスフォームノードから各カーブシェープの名前を求めます。
上の図では、 Char_M_2, Char_a_3, Char_y_2, Char_a_4 が $chars に入る名前です。
string $psurf[];
- この後に作成される プラナーサーフェス の名前を入れるための配列宣言です。
int $i = 0;
- 整数変数 $i を宣言し、 0 で初期化します。
for($curv in $chars)
- 各カーブシェイプの名前を 1 つづつ変数 $curv に代入して以下のコマンドを実行します。
string $pln[] = `planarSrf -polygon 1 $curv`;
- カーブシェイプから プラナーサーフェス を作ります。
$pln[0] にトランスフォームノードの名前、
$pln[1] にインプットノードの名前が入ります。
- -polygon 1
- ポリゴンのサーフェイスを作成します。
以下の値をとることができます。
- 0
- NURBSサーフェイス
- 1
- ポリゴン
- 2
- Subdivision サーフェイス
- 3
- Bezier サーフェイス
- 4
- Subdivision サーフェイスソリッド
$psurf[$i] = $pln[0];
- プラナーサーフェス の トランスフォームノード名を $psurf[$i] に代入します。
setAttr ($psurf[$i] + ".v") 0;
- プラナーサーフェス の visibirity を 0 にして、表示されないようにしておきます。
$i++;
- $i に 1 を加算します。
for($ps in $psurf)
- 1 つ 1 つの プラナーサーフェス の名前を変数 $ps に代入して以下のコマンドを実行します。
string $ename[] = `emitter -pos 1.5 10.0 1.5 -type "direction" -dx 0.0 -dy -1.0 -dz 0.0 -spread 0.2`;
- エミッターを作ります。
- -pos 1.5 3.0 1.5
- (1.5, 3.0, 1.5) の位置にエミッターを作成します。
- -type "direction" -dx 0.0 -dy -1.0 -dz 0.0
- (0.0, 1.0, 0.0) の方向にパーティクルを発生させます。
- -spread 0.2
-
パーティクルを発生させる角度を決定します。
1.0 で 180 度になります。
string $pname[] = `particle`;
- エミッターから放出されるパーティクルを作ります。
setAttr ($pname[0] + ".particleRenderType") 4;
- パーティクルの particleRenderType アトリビュートを 4 にして、
パーティクルの形を球体にします。
string $shp[] = `listRelatives -s $pname`;
- パーティクルのシェープノードを求めて、変数 $shp に代入します。
addAttr -ln "radius" -at "float" $shp;
- パーティクルのシェープノードに float 型のアトリビュート radius を追加します。
この radius アトリビュートが球体の半径を表します。
setAttr ($shp[0] + ".radius") 0.05;
- 球体の半径を 0.05 にします。
connectDynamic -emitters $ename[0] $pname[0];
- エミッターとパーティクルをコネクトして、
エミッターからパーティクルが放出されるようにします。
goal -goal $ps -weight 0.2 $pname[0];
- パーティクルを文字を表す プラナーサーフェス に対してゴールの設定をします。
setAttr ($pname[0] + ".conserve") 0.9;
- パーティクルのゴールに対する振れのぐあいを設定をします。
このアトリビュートを 0.0 にすると、まったく振れなくなります。
Tips (フォントのリスト)
Maya で使用できるフォントのリストを表示するには、
以下のコマンドを実行します。
pymel.core.fontDialog()
練習
- 使用例の makeString1.py を参考にして、makeString2.py を作り、
エミッターから放出されるパーティクルの個数を制限できるようにしてみましょう。
ここでは 1 文字あたり、
1秒間に放出されるパーティクル数を 300 にして、
1 秒後にパーティクルの放出が止まるようにしてください。
(実行例)
- の によって makeString2.py を読み込みます。
(makeString2() 実行後の図)
- アニメーションを実行します。
1 文字あたり 300 個のパーティクルが作られて、1 秒後にエミッターからの放出が止まります。
(ヒント)
パーティクルの放出量をコントロールするためには、
エミッターの rate アトリビュートを 0 フレーム目に 300 、
30 フレーム目に 0 になるようにアニメーションをつければよいでしょう。
そのためには、 キーフレームによる方法と、
エクスプレッションを使用する方法があります。
キーフレームによって rate アトリビュートにアニメーションをつける場合には、
以下のコマンドによってタンジェントのタイプを step にしておいたほうがよいでしょう。
pymel.core.keyTangent(エミッター名, outTangentType='step', attribute='rate')
- makeString2.py を参考にして makeString3.py という名前の PyMEL スクリプト作り、
の によって読み込むと、
以下のような textFieldButtonGrp がついたウインドウが表示されるようにしてみましょう。
フォント名と作成する文字を決定して 作成 ボタンをおすと、文字の形の planarSerface が作成されて、
パーティクルのゴールになるようにしてください。
(実行例)
- の によって
makeString3.py を読み込むと、以下のようなウインドウが表示されます。
テキスト の右にあるボタンは使用しません。
- フォント のボタンを右クリックしてポップアップメニューを表示し、フォントを選びます。
このポップアップメニューには、
Maya で使用できるすべてのフォントが表示されるようにしてください。
- テキスト のフィールドに作成する文字列を入力します。
- 作成 ボタンを押すと文字の形の planarSerface が作られて、ゴールになります。
- フレームを巻き戻してから、アニメーションを実行します。
(ヒント)
ラベル、テキストフィールドとボタンには pymel.core.textFieldButtonGrp() を使用してください。
textFieldButtonGrp と ポップアップメニューの使用方法、その他は以下の通りです。
- textFieldButtonGrp の作成方法
フォント の textFieldButtonGrp のコマンド
pymel.core.textFieldButtonGrp(textFieldButtonGrpの名前1, label='フォント', text='Times-Roman', buttonLabel='フォントリスト')
テキスト の textFieldButtonGrp のコマンド
pymel.core.textFieldButtonGrp(textFieldButtonGrpの名前2, label='テキスト', text='Maya', enableButton=0)
- textFieldButtonGrp のテキストフィールドに表示されている文字列を調べる方法
(プロシージャの中)
文字列1 = pymel.core.textFieldButtonGrp(textFieldButtonGrpの名前1, q=True, text=True)
文字列2 = pymel.core.textFieldButtonGrp(textFieldButtonGrpの名前2, q=True, text=True)
文字列1、文字列2 に入っているフォントの種類とテキストを表す名前を使って文字のカーブを作成します。
そのために、textCurvesコマンドを以下のように修正します。
text = pymel.core.textCurves(f=文字列1, t=文字列2)
window()の下の、一つ目の textFieldButtonGrp() の直後で、以下のコマンドを実行します。
- 使用できるフォントの種類を調べる方法
fname = pymel.core.fontDialog(FontList=True)
fname に使用できるフォント名のリストが代入されています。
現在、上記のコマンドがうまく働かないので代わりに以下の代入文に書き換えてください。
fname = ['Times New Roman|w400|h-18', 'MS 明朝|w400|h-18', 'MS ゴシック|w400|h-18']
- ポップアップメニューの作成方法
pymel.core.popupMenu()
このコマンドに続いて、
pymel.core.menuItem() を使用してポップアップメニューの項目を作成してゆきます。
この menuItem() は、
使用できるフォントの個数だけ繰り返し実行する必要があります。
そのために、以下のように for によるループを使用します。
for フォント名 in fname:
pymel.core.menuItem(label=フォント名, command='メニューが選ばれたとき呼ばれる コマンド')
- textFieldButtonGrp のテキストフィールドに表示されている文字列を変更するコマンド
上の メニューが選ばれたとき呼ばれる コマンド
は以下のコマンドを使用します。
pymel.core.textFieldButtonGrp(textFieldButtonGrpの名前1, e=True, text=変更する文字列)
変更する文字列には、
上記の menuItem() で表示しているフォント名を使用します。
コマンドの途中にフォント名をあてはめるために、
文字列の結合を使用します。
フォント名にはスペースが含まれていることがあるので、
以下のようにしてあてはめてください。
\"" + フォント名 + "\"
参考
Prev
Home | Contents
Mail